Форум » Clipper » All In One » Ответить

All In One

SergeyKorotun: В связи с написанием программы по разным частям кода возникают трудности. Чтобы не задавать вопросы в разных темах и не забыть в какой именно, буду спрашивать в этой. Я возможно этим нарушу правила форума, вопросы будут затрагивать разнообразные функции, но пусть оправданием мне будет то, что все они относятся к одной программе. Вопрос №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? Или только посимвольно проверять?

Ответов - 105, стр: 1 2 3 4 5 6 All

petr707: use base new go bottom skip -17 keyboard CHR(K_CTRL_PGDN) // base->dbedit()

petr707: Поиск по форуму "Обновить GET" http://clipper.b.qip.ru/?1-4-0-00000383-000-0-0-1226573702

SergeyKorotun: petr707 пишет: Поиск по форуму "Обновить GET" http://clipper.b.qip.ru/?1-4-0-00000383-000-0-0-1226573702 Как то так @ 0,0 GET a VALID eval({|| c:=a+b,AEVAL( GetList, {|g| g:display()}),.t.}) вставил в прогу на клиппер 5.01, обновляет поля, хотя функции display() в NG for clipper 5.01 не нашел.


Dima: SergeyKorotun пишет: хотя функции display() в NG for clipper 5.01 не нашел. Смотри класс GET

SergeyKorotun: в стартовое сообщения добавил вопрос № 5

AlexMyr: SergeyKorotun пишет: Вопрос № 2. В dbedit отобразить базу так, чтобы видеть максимальное число последних записей и чтобы курсор находился на последней записи index ... descend dbedit()

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

SergeyKorotun: AlexMyr пишет: index ... descend dbedit() Возможно я неправильно употребил слово "последних". Я просто хотел чтобы окно dbedit было заполнено полностью записями, а какими (отсотированными в каком то порядке или действительно введенные в базу последними) именно не имеет значения. Подошел ответ petr707: use base new go bottom skip -17 keyboard CHR(K_CTRL_PGDN) // base->dbedit() AlexMyr пишет: set century on а вот это то что надо

PSP: SergeyKorotun пишет: В своей программе get переменные инициализирую командой space(n). Но после выхода из read и сохранения значений в полях базы с типом numeric выдает ошибку несоответствия типа данных. Обхожу так if !Empty() replace namebase->namefield with val(alltrim(namegetfield)) endif Как то попроще можно? А не надо переменной, значение которой в будущем будет записываться в числовое поле, присваивать строковое значение. Почему бы вместо Var := Space( n ) не использовать Var := 0. Get-система разберется сама, что ей подсовывают. Можно и PICTURE в GET указать для числового поля.

petr707: вместо Space(n) лучше x=BLANK(x,.t.) или x=MyBlank(x) Function MyBlank(x) Local ret,tx:=valtype(x) do case case tx="N" ret:=0 case tx="C" ret:=space(len(x)) case tx="D" ret:=ctod('') case tx="L" ret:=.f. otherwise ret:=NIL endcase return ret

PSP: petr707, а если значение x и так NIL? NIL и останется. В GET редактирования не будет.

petr707: В контексте задачи: x -значение поля записи БД , разве нет? varGet = blank(fieldget)

SergeyKorotun: PSP пишет: А не надо переменной, значение которой в будущем будет записываться в числовое поле, присваивать строковое значение. Почему бы вместо Var := Space( n ) не использовать Var := 0. Get-система разберется сама, что ей подсовывают. Можно и PICTURE в GET указать для числового поля. Не очень хорошо смотрится например номер телефона или почтовый индекс =0

SergeyKorotun: petr707 пишет: вместо Space(n) лучше x=BLANK(x,.t.) или x=MyBlank(x) Function MyBlank(x) Local ret,tx:=valtype(x) do case case tx="N" ret:=0 case tx="C" ret:=space(len(x)) case tx="D" ret:=ctod('') case tx="L" ret:=.f. otherwise ret:=NIL endcase return ret тип значений мне известен и ничто не мешает мне инициализировать get переменную значением нужного типа напрямую(a:=space(10); n:=0 ). Но... Смотри ответ на предыдущее сообщение

PSP: SergeyKorotun пишет: номер телефона или почтовый индекс =0 В базе эти поля числовые? Оригинально... :)

SergeyKorotun: petr707 пишет: В контексте задачи: x -значение поля записи БД , разве нет? varGet = blank(fieldget) а вот это запомню. Пригодится. Сейчас у поля телефон тип numeric, понятно что со временем сменят на character и в этом случае программу править не придется. А blank - это функция пользователя? В NG такой не нашел

petr707: blank() - из Clipper Tools не хотите цеплять Tools? берите MyBlank() до кучи - ниже - шаблон Picture для get Function get_picture(cfield) Local nf:=fieldnum(UPPER(cfield)),tip,ret:="",nsize,ndec if nf>0 tip :=fieldtype(nf) nsize:=fieldsize(nf) do case case tip="C" ret:=replicate("X",nsize) case tip="N" ndec:=fielddeci(nf) if ndec>0 ret:= replicate("9",nsize-ndec-1)+'.'+replicate("9",ndec) else ret:=replicate("9",nsize) endif endcase endif return ret

SergeyKorotun: PSP пишет: В базе эти поля числовые? Оригинально... :) А чем вам не нравится числовой тип поля для почтового индекса? У нас нет индексов начинающихся с нуля. А программе лет 20. Поле телефон только недавно расширили до 10 знаков, а тип еще не сменили, наверно много правок надо будет внести. Ну и я же пример привел не для того чтобы обсудить именно его, а объяснить почему get переменные желательно инициализировать именно space(n)

SergeyKorotun: PSP пишет: В базе эти поля числовые? Оригинально... :) А чем вам не нравится числовой тип поля для почтового индекса? У нас нет индексов начинающихся с нуля. А программе лет 20. Поле телефон только недавно расширили до 10 знаков, а тип еще не сменили, наверно много правок надо будет внести. Ну и я же пример привел не для того чтобы обсудить именно его, а объяснить почему get переменные желательно инициализировать именно space(n)

SergeyKorotun: flag=.f. setkey(K_F10, {|p, l, v| ExitOn(p, l, v, flag)}) // по F10 выход из get даже если значения нет в справочнике @1,1 say "Фамилия" get F valid vF(,,,flag) ... read function vF(p,l,v,flg) if v="F" if flg flag:=.f. return .t. endif if F есть в справочнике return .t. else return .f. endif function ExitOn(p,l,v,flg) if v="F" flag:=.t. keyboard chr(K_DOWN) //заставить выполнить функцию из valid endif На самый важный для меня вопрос №1 ответа пока нет. Может наличие хоть какого-то кода ускорит ответ. Правда код писал по памяти, флешку с кодом забыл на работе. Что не так?



полная версия страницы