On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение



Пост N: 17
Зарегистрирован: 30.05.11
ссылка на сообщение  Отправлено: 03.06.11 23:27. Заголовок: All In One


В связи с написанием программы по разным частям кода возникают трудности. Чтобы не задавать вопросы в разных темах и не забыть в какой именно, буду спрашивать в этой. Я возможно этим нарушу правила форума, вопросы будут затрагивать разнообразные функции, но пусть оправданием мне будет то, что все они относятся к одной программе.

Вопрос №1
В get поле вводится какое то значение и если оно существует в справочнике, переходим в следующее get поле, если же не существует, то выдается предупреждение об этом. Сам оператор не имеет право добавлять это значение в справочник, но, убедившись в том, что он ввел без ошибок, имеет право оставить это значение в get поле и перейти в следующее. Чтобы случайно не проскочило ошибочно введенное значение, выход из get поля должен осуществляться по нестандартной клавише( т.е. K_ENTER, K_DOWN не подходят). Например подошло бы Ctrl+Enter

Реализовать самому не удалось

Вопрос № 2.
В dbedit отобразить базу так, чтобы видеть максимальное число последних записей и чтобы курсор находился на последней записи

use base new
go bottom
base->dbedit()
вижу только одну последнюю запись

use base new
go bottom
skip -17
base->dbedit()
вижу все последние записи, но курсор находится на первой видимой

use base new
go bottom
skip -17
skip 17
base->dbedit()
вижу только одну последнюю запись

Вопрос № 3.
В dbedit даты отображаются в формате "дд.мм.гг", причем гг первые две цифры из гггг.
Как отобразить в формате "дд.мм.гггг", не используя массив из picture для dbedit, чтобы не переделывать программу при изменении структуры базы.

Вопрос № 4.
в функции из valid изменяются значения других get переменных. Изменения становятся видимыми только тогда, когда курсор попадает в измененное соответствующее get поле, а хочется чтобы обновились сразу после выхода из поля, в котором они изменились. Обновляю так keyboard (replicate(chr(K_DOWN),17)+replicate(chr(K_UP),16))
Можно как то попроще?

Вопрос № 5
При входе в get ... read в чужой программе на фоксе все поля пустые. В своей программе get переменные инициализирую командой space(n). Но после выхода из read и сохранения значений в полях базы с типом numeric выдает ошибку несоответствия типа данных. Обхожу так
if !Empty()
replace namebase->namefield with val(alltrim(namegetfield))
endif
Как то попроще можно?

Вопрос № 6
Есть строка из символов, которых не должно быть в веденном значении в get поле. Существует ли какая то функция, возвращающая true или false в случае наличия символов из строки 1 в строке 2? Или только посимвольно проверять?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 105 , стр: 1 2 3 4 5 6 All [только новые]





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 04.06.11 18:05. Заголовок: вопрос 1 - Enter - успешный ввод, если значение в справочнике, Tab - вся остальная подготовка


//вопрос 1 - Enter - успешный ввод, если значение поля ввода- в справочнике, Tab - вся остальная подготовка
// После Tab - еще раз Enter
....
@1,1 say "Фамилия" get F valid vld_get(,,,"F",@F)
@2,1 say "Имя " get Name valid vld_get(,,,"Name",@Name)
...
read
...

// united valid
Function vld_get(a,b,c,cvar_get,val_get)
Local ret:=.t.
do while .t.
if cvar_get=NIL
cvar_get := GETFLDVAR()
val_get := &cvar_get
endif

do case
case cvar_get="F" // fam
ret:=.f.
if lastkey()=K_TAB
// get default value, pre-value
val_get := space(len(val_get))
// val_get := padr("Иванов",len(val_get))
// val_get := look_internet()
ret:=.f.
EXIT
endif

ret := In_Sprav_fio(val_get)
if !ret
// no valid
// need add val_get-> sprav
message(val_get +" not in sprav ")
ret:=.f.
exit
endif

case cvar_get="Name" // name
//....
otherwise
endcase
exit
enddo
return ret



Спасибо: 0 
Цитата Ответить
постоянный участник


Пост N: 536
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 04.06.11 19:51. Заголовок: SergeyKorotun пишет:..


SergeyKorotun пишет:

 цитата:
А чем вам не нравится числовой тип поля для почтового индекса?


Нет проблем.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 29
Зарегистрирован: 30.05.11
ссылка на сообщение  Отправлено: 06.06.11 00:11. Заголовок: flagExit=.f. setkey..


flagExit=.f.
setkey(K_F10, {|p, l, v| ExitOn(p, l, v, flagExit)})

@3,1 say " 2" get gF picture replicate("X",30) valid vgF("GF",flagExit)
...
read

function vgF(v,flgExit)
if v=="GF"
if flgExit
flagExit=.f.
return .t.
endif
endif
select fam
seek gF
if found()
return .t.
else
alert("Hand enter - F10")
return .f.
endif
return .t.

function ExitOn(p,l,v,flgExit)
if v="GF"
flagExit:=.t.
keyboard chr(K_DOWN)
endif
return

А вот это решение первого вопроса.
Выход по F10. Хотел сделать по Ctrl+Enter. Не нашел инкей-кода

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 204
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 06.06.11 00:56. Заголовок: SergeyKorotun пишет:..


SergeyKorotun пишет:

 цитата:
Хоте сделать по Ctrl+Enter. Не нашел инкей-кода



Ctrl-Return 10 K_CTRL_RET

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 53
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 06.06.11 20:33. Заголовок: Так ответы уже ответенв давно ....


SergeyKorotun, все ответы уже отвечены давно ....

в мануале классов Get() и TBrowse[DB]() есть все и даже больше.
Сергей, поймите правильно - многие долгожители конфы уже забыли когда использовали Dbedit() и @..GET.. READ.
Clipper 5.01 - 5,x - Harbour - дают очень гибкий инструмент в виде классов и вот вопросы из этой тематики привлекли бы больше внимания.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 30
Зарегистрирован: 30.05.11
ссылка на сообщение  Отправлено: 06.06.11 23:04. Заголовок: Haz пишет: flagExit..


Haz пишет:

 цитата:
flagExit=.f.
setkey(K_F10, {|p, l, v| ExitOn(p, l, v, flagExit)})

@3,1 say " 2" get gF picture replicate("X",30) valid vgF("GF",flagExit)
...
read

function vgF(v,flgExit)
if v=="GF"
if flgExit
flagExit=.f.
return .t.
endif
endif
select fam
seek gF
if found()
return .t.
else
alert("Hand enter - F10")
return .f.
endif
return .t.

function ExitOn(p,l,v,flgExit)
if v="GF"
flagExit:=.t.
keyboard chr(K_DOWN)
endif
return

А вот это решение первого вопроса.


К сожалению этот вариант подходит только для первой get переменной. Когда ввел значение, отсутствующее в справочнике, программа предлагает нажать F10 и переходит в следующее поле. Но если позже надо вернуться на предыдущее поле, то это оказывается невозможным. keyboard chr(K_DOWN) все равно переводит вниз. Назначать еще одну функциональную клавишу как то нехорошо, определять по lastkey() нажатую клавишу (стрелка вверх/ вниз или энтер) до F10 тоже будет давать сбои при ошибочном нажатии пользователем какой-то иной клавиши.


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 31
Зарегистрирован: 30.05.11
ссылка на сообщение  Отправлено: 06.06.11 23:33. Заголовок: Haz пишет: Clipper ..


Haz пишет:

 цитата:
Clipper 5.01 - 5,x - Harbour - дают очень гибкий инструмент в виде классов и вот вопросы из этой тематики привлекли бы больше внимания


Я не только получил ответы на все свои вопросы, но и узнал очень много нового о возможностях клиппера. Мне давали ответы не только на форуме, а и присылали письма на почтовый ящик. Большое всем спасибо. Но программа хотя и в стадии завершения, но еще один большой справочник не подключен (улицы), так что тема не закрывается.
По фамилиям, именам и отчествам справочники не подключал, так как не очень то они нужны. Нет смысла не добирать несколько букв в фамилии, чтобы потом вызвать справочник, в котором будет сотня продолжений. После ввода фамилии проверил наличие ее в справочнике и если ее нет, выдал сообщение пользователю. А вот справочник улиц подключить надо. Иногда в паспортном столе записывают улицу с неверным окончанием и бывает необходимо выбрать самую подходящую. Попробую создавать временную базу, в которую попадут только улицы, удовлетворяющие условию фильтра и использовать ее в качестве справочника (еще раз повторюсь: переход на харбор будет производится только после написания программы на клиппер 5.01). Вопрос: после использования этой временной базы перед ее закрытием можно как-то запретить запись базы на диск?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 205
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 07.06.11 00:04. Заголовок: SergeyKorotun пишет:..


SergeyKorotun пишет:

 цитата:
Попробую создавать временную базу, в которую попадут только улицы, удовлетворяющие условию фильтра и использовать ее в качестве справочника (еще раз повторюсь: переход на харбор будет производится только после написания программы на клиппер 5.01). Вопрос: после использования этой временной базы перед ее закрытием можно как-то запретить запись базы на диск?



А еще в харбор можно создавать базу в памяти (библиотека hbmemio):
REQUEST HB_MEMIO

PROC Main()
LOCAL nI
FIELD F1

DBCREATE("mem:test", {{"F1", "N", 9, 0}},, .T., "memarea")
FOR nI := 1 TO 1000
DBAPPEND(); F1 := HB_RANDOM() * 1000000
NEXT
INDEX ON F1 TAG f1
DBEVAL({|| QOUT(F1)})
DBCLOSEAREA()
DBDROP("mem:test") // Free memory resource

RETURN

SergeyKorotun пишет:

 цитата:
Я не только получил ответы на все свои вопросы, но и узнал очень много нового о возможностях клиппера.


С такими знаниями о клиппере с русской докой, лучше уже начинать изучать харбор, плюс к харбору несколько десятков английских слов выучите и уже не будет так страшно копаться в английской доке .

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 54
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 07.06.11 06:33. Заголовок: SergeyKorotun пишет:


SergeyKorotun пишет:

 цитата:
Вопрос: после использования этой временной базы перед ее закрытием можно как-то запретить запись базы на диск?



С трудом вериться что вообще такое возможно, учитывая размер базы и используемую память DOS приложения.


 цитата:
Попробую создавать временную базу, в которую попадут только улицы, удовлетворяющие условию фильтра и использовать ее в качестве справочника



Попробуйте перекомпилировать свою программу в Clipper 5.3, скорее всего никаких доработок не потребуется вообще, а освоить SCOPE вам тут помогут

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 48
Зарегистрирован: 18.02.11
ссылка на сообщение  Отправлено: 07.06.11 21:27. Заголовок: SergeyKorotun пишет:..


SergeyKorotun пишет:

 цитата:

Но если позже надо вернуться на предыдущее поле, то это оказывается невозможным. keyboard chr(K_DOWN) все равно переводит вниз.


В С5.2 есть READEXIT(.T.). Добавляет K_UP (5), K_DOWN (24) к переходу по GET полям
cMyvar = SPACE(10)
lLastExit = READEXIT(.T.) // Result: Turn on exit keys
@ 10, 10 SAY "Enter: " GET cMyvar
READ
READEXIT(lLastExit) // Result: Restore previous setting
Если используются функции VALID, то в начало надо вставлять:
IF LastKey() == K_UP; RETURN .T.
ENDIF



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 32
Зарегистрирован: 30.05.11
ссылка на сообщение  Отправлено: 08.06.11 00:44. Заголовок: SergejKis пишет: Ес..


SergejKis пишет:

 цитата:
Если используются функции VALID, то в начало надо вставлять:
IF LastKey() == K_UP; RETURN .T.
ENDIF


Выход из get поля должен происходить по клавише, определенной в SET KEY, например по F10.
При нажатии F10 вызывается функция, имитирующая нажатие на клавиатуре стрелки вниз, которая автоматически вызывает функцию из валид. Можно было бы все время какой то переменной присваивать код нажатой клавиши и в функции, вызываемой по F10 инициировать или нажатие стрелки вниз или стрелки вверх. Но где гарантия что пользователь случайно не нажмет какую то другую клавишу и нажатие какой клавиши инициировать - неизвестно.


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 33
Зарегистрирован: 30.05.11
ссылка на сообщение  Отправлено: 08.06.11 00:46. Заголовок: SergejKis пишет: В ..


SergejKis пишет:

 цитата:
В С5.2 есть READEXIT(.T.). Добавляет K_UP (5), K_DOWN (24) к переходу по GET полям


в клиппер 5.01 по умолчанию переход по полям осуществляется в том числе и перечисленными вами клавишами

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 08.06.11 10:33. Заголовок: гарантия - проверка всех значений формы после READ


гарантия - проверка всех значений формы после READ ( после всех get)
перед записью в БД, вывод сообщения оператору при ошибках ввода и возврат к началу формы - первому GET

Спасибо: 0 
Цитата Ответить



Пост N: 34
Зарегистрирован: 30.05.11
ссылка на сообщение  Отправлено: 08.06.11 14:46. Заголовок: Два часа не могу заг..


Два часа не могу загнать записи из базы send в базу reciver. Структуры баз совпадают. Путя к базам верные. Пытался и так написать: "dbf\\send.dbf" Где ошибка?

pth:=alltrim(nastr->path_dbf)+"reciver.dbf"
use (pth) alias reciver new
select reсiver
append from ("dbf\send.dbf") ALL // for ((d_zvirka>=dateBegin) .and. (d_zvirka<=dateEnd))
commit
select reciver
use


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 538
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 08.06.11 15:45. Заголовок: 1. Что получаете? Ош..


1. Что получаете? Ошибку или что?
2. SergeyKorotun пишет:

 цитата:
append from ("dbf\send.dbf") ALL


ALL, по-моему, не нужно.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 35
Зарегистрирован: 30.05.11
ссылка на сообщение  Отправлено: 08.06.11 17:52. Заголовок: PSP пишет: 1. Что п..


PSP пишет:

 цитата:
1. Что получаете? Ошибку или что?


Ошибок нет. Ни одной записи не переносится с базы send в базу reciver
Без ALL тоже не переносятся. ALL не мешает, оно по умолчанию подразумевается


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1968
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.06.11 18:11. Заголовок: SergeyKorotun пишет:..


SergeyKorotun пишет:

 цитата:
Ошибок нет. Ни одной записи не переносится с базы send в базу reciver



Проверьте, чтобы файл reciver ранее не был открыт монопольно. Если это так, то __dbApp (aka append from) не сможет его открыть

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 08.06.11 18:36. Заголовок: Модифицировал пример



pth:=alltrim(nastr->path_dbf)+"reciver.dbf"
cfile_app := ("dbf\send.dbf")
do while .t.
if !file(pth)
// mess( " source file not found")
exit
endif
if !file(cfile_app)
// mess( " append file not found")
exit
endif

use (pth) alias reciver new
if select("reciver")=0
//mess("error use reciver")
exit
endif
select reсiver
append from (cfile_from) ALL // for ((d_zvirka>=dateBegin) .and. (d_zvirka<=dateEnd))
commit
select reciver
close reciver //use
//mess("ok")
exit
enddo



Спасибо: 0 
Цитата Ответить



Пост N: 36
Зарегистрирован: 30.05.11
ссылка на сообщение  Отправлено: 08.06.11 19:11. Заголовок: Pasha пишет: Провер..


Pasha пишет:

 цитата:
Проверьте, чтобы файл reciver ранее не был открыт монопольно. Если это так, то __dbApp (aka append from) не сможет его открыть


На протяжении дня в базу send набиваются записи и в конце рабочего дня переносятся в базу reciver из другой программы. Но на время написания программы копия база reciver помещена в отдельную папку, pth настроен именно к ней, и никем занята быть не может. В приведенном выше фрагменте программы она открывается впервые.

for petr707 Проверки на наличие баз я в приведенный фрагмент не включил, но они там есть. Кроме того обе базы я перед append from выводил с помощью dbedit на экран.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1969
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.06.11 19:37. Заголовок: Я был невнимателен. ..


Я был невнимателен. Поскольку записи добавляются из send, и именно send открывается командой append from, проверьте, чтобы до выполнения append from send не была открыта монопольно

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 105 , стр: 1 2 3 4 5 6 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 24
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет