Форум » 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

Haz: Попробуйте открыть в эксклюзиве use (pth) alias reciver excl new

petr707: 1.Если при набивке в SEND не делать COMMIT, другая программа, возможно, их не увидит - до завершения работы первой. 2.Если в одной программе не освободить SEND, другая программа не сможет сделать APPEND 3.Для контроля занятости БД(видимости записей) таблицу SEND можно открывать сторонней утилитой DbfNavigator.exe (freeware) 4.Для контроля - лучше посчитать записи командой COUNT TO n в каждой таблице до и после Append ( вывести в лог) 5.Не очень хорошо - используются не абсолютные пути (disk\path\file) к файлам таблиц, при нечетком SET DEFAULT PATH можно случайно взять другой экземпляр SEND

SergeyKorotun: Pasha пишет: Я был невнимателен. Поскольку записи добавляются из send, и именно send открывается командой append from, проверьте, чтобы до выполнения append from send не была открыта монопольно send была открыта именно этой программой, отображалась dbedit с функцией, и в зависимости от нажатой клавиши производились какие-то действия, и в частности экспорт записей в базу reciver. Закрыв базу send перед append from, экспорт заработал. После append from сразу же открыл send и хотя dbedit этого не заметил, все равно как то не хорошо получается.


SergeyKorotun: В стартовый топик добавил вопрос № 6

petr707: Можно по другому - используйте флаг для временного выхода из Dbedit затем автоматически повторный вход. все действия по - копированию БД, выделению записей - вне тела польз. функции Dbedit Userf ... private lrepeat:=.t. private lcopy :=.f. do while lrepeat lrepeat :=.f. if lcopy lcopy:=.f. copy file(dbf) to (dbf2) endif use (dbf) alias tmp new dbedit(,,,'userf',,) close tmp if !lrepeat; exit; endif enddo ... return Function userf() ... case lastkey()=K_ESC lrepeat := .f. // out return 0 case lastkey()=K_F10 // need close-open lrepeat:=.t. lcopy :=.t. return 0 // ..

SergeyKorotun: petr707 пишет: copy file(dbf) to (dbf2) Эта строка натолкнула на другой алгоритм: командой copy to из базы send создать временную базу и к ней применить append from

SergeyKorotun: При входе в get read по умолчанию стоит режим замены. Какой командой установить режим вставки?

PSP: SergeyKorotun пишет: При входе в get read по умолчанию стоит режим замены. Какой командой установить режим вставки? http://www.ousob.com/ng/53guide/ng91ce6.php

SergeyKorotun: Программой создается база и из программы в одно из полей заносятся "запрещенные" символы. В валид функции будет проверяться, не встречается ли среди введенных символов запрещенные. Вопрос: как присвоить полю строку из запрещенных символов, в которой есть и ограничители строк (кавычки, апостроф)? Примеры запрещенных символов для некоторых get полей: `=!@#$%^&*()_+\|]}[{"?>,<' `=!@#$%^&*_+\|]}[{?><ЪЫЭ' `=!@#$%^&*_+\|]}[{?><QWERTYUIOPASDFGHJKLZXCVBNM'

PSP: SergeyKorotun пишет: как присвоить полю строку из запрещенных символов, в которой есть и ограничители строк (кавычки, апостроф)? BASE->FieldName := Chr( 34 ) // кавычки BASE->FieldName := Chr( 39 ) // апостроф

SergeyKorotun: PSP пишет: BASE->FieldName := Chr( 34 ) // кавычки BASE->FieldName := Chr( 39 ) // апостроф Чтобы занести в базу строку `=!@#$%^&*()_+\|]}[{"?>,<' надо написать команду: replace base->fieldName with "`=!@#$%^&*()_+\|]}[{"+chr(34)+"?>,<"+chr(39) в других языках есть специальный символ, обозначающий, что следующий за ним символ не часть синтаксиса языка, а просто символ. В клиппере такого нет?

Pasha: SergeyKorotun пишет: в других языках есть специальный символ, обозначающий, что следующий за ним символ не часть синтаксиса языка, а просто символ. В клиппере такого нет? В клиппере такого нет. Зато в клиппере символьная строка-константа может ограничиваться символами "" '' [] Если внутри строки есть какой-либо символ-ограничитель, то в качестве ограничителя для строки можно использовать альтернативный. Скажем, я привык использовать паскалевский ограничитель: '' Но в украинском языке апостроф присутствует в алфавите, и в тех случаях, когда надо использовать такой литерал, я использую ограничитель ""

SergeyKorotun: Pasha пишет: Если внутри строки есть какой-либо символ-ограничитель, то в качестве ограничителя для строки можно использовать альтернативный. У меня все три типа ограничителей присутствуют в строке, поэтому придется делать через chr() Строки с запрещенными символами хранятся у меня в текстовом файле. Через буфер обмена я вставил их в prg файл и командой replace занес в базу. Некоторые символы в базе отображены неверно, например вместо какого-то символа вижу желтый квадрат. Хотя в prg файле все символы соответствуют тем, что вставил из буфера.

Haz: можно держать не в базе, а в том же текстовике, или INI файле. Проблем 0, рисуйте в INI все что удасться вбить с клавы. библиотек и примеров работы с INI на том же http://www.the-oasis.net/ уверен до дури.

SergeyKorotun: можно ли в get ... read перемещать фокус в указанное в валид функции get поле, зависящее от значения, введенного в текущее поле. Запрещать у when функции нельзя, так как пользователь имеет право например стрелкой вверх переместиться в пропущенное поле и изменить его. Использую для этого keyboard replicate(chr(K_DOWN),n). Может для этого есть какая то специальная команда

Haz: Разумеется есть ::aGetList[ ::nPos ]:setFocus() класс oGet

SergeyKorotun: use reciver alias reciver new append from ("dbf\send.dbf") Требуется со своей базы send добавить записи в чужую базу reciver. Последняя база занята только в некоторых пунктах меню чужой программы. Чужая программа не сетевая, на фокспро. Как перед добавлением записей проверить занята чужая база(reciver) или нет, чтобы не заставлять пользователя полностью выходить из программы, а если он все же не вышел, не получать ошибки времени выполнения BASE/1002 АЛИАС ОТСУТСТВУЕТ

SADSTAR2: FLOCK() returns true (.T.) if an attempt to lock a database file in USE in the current work area succeeds; otherwise, it returns false (.F.). И не забыть UNLOCK

petr707: .... f_name := "reciver.dbf" do while .t. if !file_exc(f_name) exit endif use (f_name) alias reciver new if select("reciver")=0 exit endif append from (...) .... close reciver exit enddo ... #include "fileio.ch Function file_exc(f_name,nerr_ex) Local handle:=0,ret:=.f. handle=fopen(f_name,FO_EXCLUSIVE) if ( nerr_ex:=FERROR())#0.or.handle=-1 ret:=.f. else fclose(handle) ret:=.t. endif return ret

Григорьев Владимир: petr707 пишет: #include "fileio.ch Function file_exc(f_name,nerr_ex) Local handle:=0,ret:=.f. handle=fopen(f_name,FO_EXCLUSIVE) if ( nerr_ex:=FERROR())#0.or.handle=-1 ret:=.f. else fclose(handle) ret:=.t. endif return ret У меня такой вопрос к автору этого кода: "Может ли так быть, что FERROR() равна 0, но тем не менее значение, возвращаемое FOPEN равно -1?! И второй вопрос: "Вы не предполагаете, что сам файл базы данных может открыться, но тем не менее его индексные файлы не будут иметь доступа?!" Эти вопросы у меня возникли в связи с тем, что на мой взгляд проще сразу же использовать команду USE, которая и возвратит все ошибки об открытии! Зачем несколько раз делать одно и тоже: сначала в вашей функции file_exc, а затем в команде USE?



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