AFIELDS() | Заполняет массив информацией о структуре файла базы данных. |
ALIAS() | Возвращает алиас заданной рабочей области. |
BOF() | Определяет достижение начала файла. |
BROWSE() | Просматривает записи в заданном окне. |
DBAPPEND() | Добавляет новую запись. |
DBCLEARFILTER() | Снимает условие фильтрации базы данных, установленное командой SET FILTER. |
DBCLEARINDEX() | Закрывает все индексные файлы в текущей рабочей области.. |
DBCLEARRELATION() | Уничтожает активные связи. |
DBCLOSEALL() | Закрывает все открытые рабочие области. |
DBCLOSEAREA() | Закрывает текущую рабочую область |
DBCOMMIT() | Записывает данные из буферов на диск |
DBCOMMITALL() | Записывает данные из буферов на диск для всех рабочих областей. |
DBCREATE() | Создает файл базы данных на основе информации о структуре базы данных, |
DBCREATEINDEX() | Создает индексный файл |
DBDELETE() | Помечает запись для удаления. |
DBEDIT() | Просматривает информацию записей в табличной форме. |
DBEVAL() | Выполняет блок кода для каждой записи, входящей в группу и отвечающей |
DBF() | Возвращает имя текущего алиаса. |
DBFILTER() | Возвращает текущее выражение фильтра в виде строки символов. |
DBGOBOTTOM() | Перемещает указатель на последнюю логическую запись. |
DBGOTO() | Перемещает указатель на запись с заданным номером. |
DBGOTOP() | Перемещает указатель на первую логическую запись. |
DBRECALL() | Восстанавливает запись, помеченную для удаления. |
DBREINDEX() | Воссоздает все активные индексы в текущей рабочей области. |
DBRELATION() | Возвращает скомпонованное выражение заданного отношения. |
DBRSELECT() | Возвращает номер рабочей области для заданного отношения. |
DBSEEK() | Перемещает указатель на запись, имеющую заданное ключевое значение. |
DBSELECTAREA() | Изменяет текущую рабочую область. |
DBSETDRIVER() | Возвращает имя используемого по умолчанию драйвера баз данных и |
DBSETFILTER() | Устанавливает фильтр. |
DBSETINDEX() | Открывает существующий индексный файл. |
DBSETORDER() | Устанавливает управляющий индекс. |
DBSETRELATION() | Устанавливает связь между двумя рабочими областями |
DBSKIP() | Перемещает указатель относительно текущей записи. |
DBSTRUCT() | Создает массив, содержащий информацию о структуре базы данных. |
DBUNLOCK() | Снимает все блокировки в текущей рабочей области. |
DBUNLOCKALL() | Снимает все блокировки для всех рабочих областей. |
DBUSEAREA() | Открывает файл базы данных в рабочей области. |
DEFPATH() | Возвращает правильный путь, установленный по SET DEFAULT. |
DELETED() | Возвращает признак, определяющий, подлежит запись удалению или нет. |
DESCEND() | Создает значение ключа для сортировки по убыванию. |
DOSERROR() | Возвращает номер последней ошибки DOS. |
EOF() | Определяет момент перехода за последнюю логическую запись файла базы данных. |
FCOUNT() | Возвращает число полей записи текущего (.dbf) файла. |
FERROR() | Проверяет наличие ошибок обработки двоичных файлов. |
FIELDBLOCK() | Создает блок кода для данного поля базы данных. |
FIELDGET() | Возвращает значение поля, используя порядковый номер поля в структуре |
FIELDNAME() | Возвращает имя поля из текущего (.dbf) файла. |
FIELDPOS() | Возвращает номер поля в рабочей области. |
FIELDPUT() | Записывает значение в поле, используя его номер в структуре. |
FIELDWBLOCK() | Возвращает блок кода для поля в данной рабочей области. |
FILE() | Определяет, существует ли файл в текущей xClipper директории или по |
__FLEDIT() | Отбирает из массива структуры DBStruct() элементы, указанные в списке. |
FLOCK() | Ограничивает доступ к открытому и совместно используемому файлу базы |
FOUND() | Определяет, успешна ли предшествующая операция поиска. |
HEADER() | Возвращает величину заголовка текущего файла базы данных. |
INDEXEXT() | Возвращает расширение имени индексного файла, принятое по умолчанию |
INDEXKEY() | Возвращает ключевое выражение для заданного индекса. |
INDEXORD() | Возвращает порядковый номер управляющего индекса. |
LASTREC() | Определяет число записей в текущей базе данных. |
LUPDATE() | Возвращает дату последнего изменения файла базы данных. |
MEMOEDIT() | Выводит на экран или редактирует символьные строки или memo-поля. |
MEMOREAD() | Возвращает содержимое дискового файла как строку символов. |
MEMOWRIT() | Записывает символьную строку или memo-поле в дисковый файл. |
NETERR() | Индицирует сбой выполнения команд при работе в сети. |
ORDBAGEXT() | Return the default order bag RDD extension |
ORDBAGNAME() | Return the order bag name of a specific order |
ORDLISTADD() | Add orders to the order list |
RECCOUNT() | Определяет количество записей в текущем файле (.dbf) |
RECNO() | Возвращает номер текущей записи рабочей области. |
RECSIZE() | Определяет длину записи файла базы данных (.dbf). |
RLOCK() | Блокирует текущую запись в активной рабочей области. |
SELECT() | Определяет номер рабочей области заданного алиаса. |
USED() | Определяет, есть ли в наличии открытый файл базы данных. |
WEIGHTASC() | Возвращает весовую характеристику символа. |
WEIGHTTABLE() | Возвращает весовую таблицу символов. |
AFIELDS([<массив имен полей>], [<массив типов полей>], [<массив размеров полей>], [<массив размеров дробной части>]) --> количество полей
<массив имен полей> | - массив, заполняемый именами полей. Каждый его |
элемент - строка символов. | |
<массив типов полей> | - массив, заполняемый информацией о типах |
соответствующих полей массива <массив имен полей>. Каждый его | |
элемент - строка символов. | |
<массив размеров полей> | - массив, заполняемый информацией о размерах |
соответствующих полей массива <массив имен полей>. Содержит элементы | |
арифметического типа. | |
<массив размеров дробной части> | - массив, заполняемый информацией |
о количестве дробных знаков, определенных для соответствующих полей | |
массива <массив имен полей>. Каждый элемент - арифметического типа. | |
Если тип поля не арифметический, значение соответствующего элемента | |
в массиве <массив размеров дробной части> - ноль. | |
AFIELDS() возвращает количество полей или длину наименьшего аргумента массива, смотря по тому, что меньше. Если не определено ни одного аргумента или не открыта ни одна база данных в текущей рабочей области, AFIELDS() возвращает ноль.
AFIELDS() - функция, которая заполняет группу массивов информацией о структуре активного в данный момент файла базы данных; элементы массивов с одним номером содержат при этом информацию об одном поле. AFIELDS() во многом схожа с функцией ADIR(), заполняя группу созданных массивов информацией. Чтобы воспользоваться функцией AFIELDS(), нужно сначала создать массивы одинаковой длины, в которые будет занесена информация о структуре файла базы данных, при этом количество элементов в них должно соответствовать количеству полей в записи файла базы данных (т.е.FCOUNT()). После того, как эти массивы созданы, можно использовать AFIELDS() для заполнения их данными о полях файла базы данных.
По умолчанию AFIELDS() обрабатывает активную рабочую область, однако при помощи AFIELDS() можно обрабатывать и пассивную рабочую область. Для этого необходимо использовать уточненное алиасом выражение (см. пример ниже).
AFIELDS() - функция, используемая для связи с предыдущей версией xClipper. Она может быть заменена функцией DBSTRUCT(), которая не требует создания группы массивов перед ее использованием и возвращает многомерный массив, содержащий данные о структуре файла текущей базы данных.
В следующем примере демонстрируется, как использовать функции AFIELDS() и ACHOICE() для создания списка для выбора полей: USE Sales NEW PRIVATE aFields[FCOUNT()] AFIELDS(aFields) @ 1, 0 TO 10, 10 DOUBLE nChoice = ACHOICE( 2, 1, 9, 9, aFields) @ 12, 0 SAY IF( nChoice != 0, aFields[nChoice], "Не выбрано") RETURN Этот пример использует AFIELDS() в уточненном алиасом выражении для заполнения массивов информацией о структуре файла Sales.dbf, открытого в пассивной области: LOCAL aFieldNames, aTypes, aWidths, aDecimals USE Sales NEW USE Customer NEW // aFieldNames := Sales->(ARRAY(FCOUNT()) aTypes := Sales->(ARRAY(FCOUNT()) aWidths := Sales->(ARRAY(FCOUNT()) aDecimals := Sales->(ARRAY(FCOUNT()) // Sales->(AFIELDS(aFieldNames, aTypes, aWidths, aDecimals))
ALIAS([<номер рабочей области>]) --> алиас
ALIAS() возвращает алиас заданной рабочей области в виде символьной строки. Если <номер рабочей области> не определен, возвращается алиас текущей рабочей области. Если в заданной рабочей области нет открытой базы данных, ALIAS() возвращает пустую строку ("").
ALIAS() - функция работы с базами данных, которую используют с целью определения алиаса для заданной рабочей области. Алиас - это имя, присвоенное рабочей области при открытии в ней базы данных. Этим именем может быть либо имя файла базы данных, либо имя, явно указанное в предложении ALIAS команды USE. Функция ALIAS() является обратной по действию функции SELECT(). ALIAS() возвращает алиас по заданному номеру рабочей области, тогда как функция SELECT() возвращает номер рабочей области по заданному алиасу.
BOF() --> признак начала файла
No arguments
BOF() возвращает значение "истина" (.T.) после того, как была сделана попытка перемещения указателя записи в обратном направлении за первую логическую запись файла базы данных. В остальных случаях она возвращает значение "ложь" (.F.).
Если в рабочей области нет открытого файла базы данных, BOF() возвращает значение "ложь" (.F.). Если файл текущей базы данных не содержит ни одной записи, BOF() возвращает значение "истина" (.T.).
BOF() - функция работы с базами данных, которая используется для проверки условия достижения границ файла при перемещении указателя записи в обратном направлении при помощи команды SKIP. Простой пример использования - это просмотр по убыванию значения ключа записей при индексации по возрастанию. Более наглядным примером может служить программа работы с экранными страницами, которая выдает на экран страницы изображения в прямом или обратном порядке в зависимости от нажатой пользователем клавиши. Когда пользователь начинает просматривать страницы в обратном порядке, можно использовать функцию BOF() для проверки условия достижения указателя записи начала файла перед использованием команды SKIP для передвижения указателя записи и перерисовки экрана.
После того, как функцией BOF() будет установлено значение "истина" (.T.), оно остается до тех пор, пока не будет сделана очередная попытка передвижения указателя записи.
По умолчанию функция BOF() выполняется для текущей активной рабочей области. Однако ее можно применить и для пассивной рабочей области, используя ее в выражении, уточненном алиасом ( см. пример ниже ).
Команда SKIP является единственной командой, которая может установить значение BOF() "истина" (.T.).
В этом примере демонстрируется использование BOF() при попытке перемещения указателя записи за первую запись: USE Sales NEW ? RECNO(), BOF() // Результат: 1 .F. SKIP -1 ? RECNO(), BOF() // Результат: 1 .T. В этом примере используется выражение, уточненное алиасом при использовании BOF() для пассивной рабочей области: USE Sales NEW USE Customer NEW USE Invoices NEW ? Sales->(BOF()), Customer->(BOF())
BROWSE([<верхняя строка>],[<левая колонка>], [<нижняя строка>],[<правая колонка>]) --> NIL
Функция BROWSE() всегда возвращает NIL.
BROWSE() - это функция для организации интерфейса с пользователем. Список клавиш управления курсором, используемых в функции, приведен в описании функции DBEDIT().
This is an example of browsing a file: USE File1 NEW BROWSE()
DBAPPEND() --> NIL
<lReleaseRecLocks> | is a logical data type that if true (.T.), |
clears all pending record locks, then appends the next record. If | |
<lReleaseRecLocks> | is false (.F.), all pending record locks are |
maintained and the new record is added to the end of the Lock List. The | |
default value of <lReleaseRecLocks> is true (.T.). |
DBAPPEND() всегда возвращает NIL.
DBAPPEND() добавляет новую запись в файл базы данных в текущей рабочей области. Если запись добавлена успешно, то каждому полю записи присваивается пустое значение соответствующего типа данных, и новая запись становится текущей записью. DBAPPEND() выполняет те же функции, что и стандартная команда APPEND BLANK. Более подробную информацию смотрите в описании команды APPEND BLANK.
DBCLEARFILTER() --> NIL
No arguments
DBCLEARFILTER() всегда возвращает NIL.
DBCLEARFILTER() снимает условие фильтрации, если оно установлено в текущей рабочей области.
DBCLEARFILTER() выполняет те же функции, что и стандартная команда SET FILTER TO без логического выражения. Более подробную информацию смотрите в команде SET FILTER.
The following example sets a filter, lists data as filtered, and then clears the filter: USE Employee NEW DBSETFILTER( {|| Age < 40}, "Age < 40" ) LIST Employee->Name DBCLEARFILTER()
DBCLEARINDEX() --> NIL
No arguments
DBCLEARINDEX() всегда возвращает NIL.
DBCLEARINDEX() закрывает все активные индексные файлы в текущей рабочей области. Все обновленные данные записываются в индексные файлы, после чего они закрывается.
DBCLEARINDEX() выполняет те же функции, что и стандартная команда SET INDEX TO без определения индексного файла. Более подробную информацию смотрите в команде SET INDEX.
The following example clears index files if any are set: cFirst := "Winston" DBUSEAREA( .T., "DBFNTX", "Sales", "Sales", .T. ) DBSETINDEX( "FIRSTNAM" ) DBSETINDEX( "LASTNAME" ) // IF INDEXORD() > 0 // is there an index? DBCLEARINDEX() // clear index files ELSE COPY TO FILE TEMP SDF // copy to SDF in natural ENDIF // order
DBCLEARRELATION() --> NIL
No arguments
DBCLEARRELATION() всегда возвращает NIL.
DBCLEARRELATION() уничтожает все активные связи для текущей рабочей области.
DBCLEARRELATION() выполняет те же функции, что и стандартная команда SET RELATION TO без аргументов. Более подробную информацию смотрите в описании команды SET RELATION.
The following example sets a relation, lists data, and then clears the relation: USE Employee NEW USE Department NEW INDEX Dept // SELECT Employee DBSETRELATION("Department", ; {|| Employee->Dept}, "Employee->Dept") LIST Employee->Name, Department->Name DBCLEARRELATION()
DBCLOSEALL() --> NIL
No arguments
DBCLOSEALL() всегда возвращает NIL.
DBCLOSEALL() закрывает все открытые рабочие области, запрещая их дальнейшее использование. Это эквивалентно вызову функции DBCLOSEAREA() для каждой рабочей области в отдельности.
DBCLOSEALL() имеет такой же эффект, что и стандартная команда CLOSE DATABASES. Более подробную информацию смотрите в описаниях команд USE и CLOSE.
The following example closes all work areas: cLast := "Winston" DBUSEAREA( .T., "DBFNTX", "Sales", "Sales", .T. ) DBSETINDEX( "SALEFNAM" ) DBSETINDEX( "SALELNAM" ) // DBUSEAREA( .T., "DBFNTX", "Colls", "Colls", .T. ) DBSETINDEX( "COLLFNAM" ) DBSETINDEX( "COLLLNAM" ) // DBSELECTAREA( "Sales" ) // select "Sales" work area // IF ( Sales->(DBSEEK(cLast)) ) IF Sales->( DELETED() ) IF RLOCK() Sales->( DBRECALL() ) ? "Record deleted: ", Sales( DELETED() ) ENDIF ENDIF ELSE ? "Not found" ENDIF DBCLOSEALL() // close all work areas
DBCLOSEAREA() --> NIL
No arguments
DBCLOSEAREA() всегда возвращает NIL.
DBCLOSEAREA() закрывает текущую рабочую область, возвращая системе освобождаемую область памяти. Все корректировки базы данных записываются на диск, блокировки снимаются, любые ресурсы, связанные с текущей рабочей областью, закрываются или освобождаются.
DBCLOSEAREA() эквивалентна стандартной команде CLOSE или команде USE без аргументов. Более подробную информацию смотрите в командах USE и CLOSE.
The following example closes a work area via an alias reference: cLast := "Winston" // DBUSEAREA( .T., "DBFNTX", "Sales", "Sales", .T. ) DBSETINDEX( "SALEFNAM" ) DBSETINDEX( "SALELNAM" ) // DBUSEAREA( .T., "DBFNTX", "Colls", "Colls", .T. ) DBSETINDEX( "COLLFNAM" ) DBSETINDEX( "COLLLNAM" ) // DBSELECTAREA( "Sales" ) // select "Sales" work area // IF ( Sales->(DBSEEK(cLast)) ) IF Sales->( DELETED() ) .AND. Sales->( RLOCK() ) Sales->( DBRECALL() ) ? "Record deleted: ", Sales( DELETED() ) ENDIF ELSE ? "Not found" Colls->( DBCLOSEAREA() ) ENDIF
DBCOMMIT() --> NIL
No arguments
DBCOMMIT() всегда возвращает NIL.
При вызове функции DBCOMMIT() все изменения в текущей рабочей области записываются из буферов на диск.
DBCOMMIT() - выполняет те же функции, что и стандартная команда COMMIT, кроме того, что действует только в текущей рабочей области. Более подробную информацию смотрите в команде COMMIT.
In this example, COMMIT is used to force a write to disk after a series of memory variables are assigned to field variables: USE Sales EXCLUSIVE NEW MEMVAR->Name := Sales->Name MEMVAR->Amount := Sales->Amount // @ 10, 10 GET MEMVAR->Name @ 11, 10 GET MEMVAR->Amount READ // IF UPDATED() APPEND BLANK REPLACE Sales->Name WITH MEMVAR->Name REPLACE Sales->Amount WITH MEMVAR->Amount Sales->( DBCOMMIT() ) ENDIF
DBCOMMITALL() --> NIL
No arguments
DBCOMMITALL() всегда возвращает NIL.
При вызове функции DBCOMMITALL() все изменения во всех рабочих областях записываются из буферов на диск. Это эквивалентно вызову функции DBCOMMIT() для каждой рабочей области.
Более подробная информация находится в описании функции DBCOMMIT() и команды COMMIT.
The following example writes all pending updates to disk: cLast := "Winston" // DBUSEAREA( .T., "DBFNTX", "Sales", "Sales", .T. ) DBSETINDEX( "SALEFNAM" ) DBSETINDEX( "SALELNAM" ) // DBUSEAREA( .T., "DBFNTX", "Colls", "Colls", .T. ) DBSETINDEX( "COLLFNAM" ) DBSETINDEX( "COLLLNAM" ) DBSELECTAREA( "Sales" ) // select "Sales" work area IF ( Sales->(DBSEEK(cLast)) ) IF Sales->( DELETED() ) .AND. Sales( RLOCK() ) Sales->( DBRECALL() ) ? "Deleted record has been recalled." ENDIF ELSE ? "Not found" ENDIF // // processing done, write updates to disk and close DBCOMMITALL() DBCLOSEALL() QUIT
DBCREATE(<имя базы данных>, <структура>) --> NIL
<имя базы данных> | - имя нового файла базы данных, которое может |
содержать имя дисковода и путь доступа к нему в виде строки символов. | |
Если имя файла задано без расширения, то по умолчанию принимается | |
расширение (.dbf). | |
<структура> | - это массив, содержащий информацию о структуре записей |
файла базы данных <имя базы данных> в виде группы подмассивов - по | |
одному на каждое поле. Каждый подмассив содержит описание | |
соответствующего поля и имеет следующую структуру : | |
Подмассив описания поля. --------------------------------------------------------------------- Позиция Метасимвол dbstruct.ch --------------------------------------------------------------------- 1 cName DBS_NAME 2 cType DBS_TYPE 3 nLength DBS_LEN 4 nDecimals DBS_DEC --------------------------------------------------------------------- |
DBCREATE() всегда возвращает NIL.
DBCREATE() - функция работы с базой данных, которая создает файл базы данных на основе информации массива, содержащего описание структуры его записи. Массив может быть создан программным путем при использовании функции DBSTRUCT().
DBCREATE() аналогична команде CREATE FROM, которая создает новый файл базы данных по данным дополнительного файла о структуре записи. Дополнительный файл с информацией о структуре записи можно сформировать при помощи либо CREATE, либо COPY STRUCTURE EXTENDED.
Перед использованием функции DBCREATE() требуется создать массив <структура> и заполнить его информацией, описывающей атрибуты полей в соответствии с таблицей 5-7. При создании подмассива описания поля необходимо руководствоваться следующими правилами:
Все атрибуты поля должны быть определены в соответствии с типом данных. Атрибут, задающий количество знаков после десятичной точки, должен быть определен даже для нецифровых полей. Если поле не имеет атрибута, определяющего количество знаков после десятичной точки, необходимо задавать его значение 0.
Тип атрибута необходимо задавать, используя как минимум первую букву типа данных. Более полно тип атрибута может быть назван для облегчения чтения программы. Например, для указания строки символов можно использовать и "C", и "Character".
В xClipper символьные поля могут иметь длину до 64 килобайт. В отличие от команды CREATE FROM, функция DBCREATE() не использует атрибут, задающий количество знаков после десятичной точки для определения величины целой части поля.
Для того, чтобы сделать ссылки на различные элементы подмассива описаний поля более удобочитаемыми, используется файл описаний с именем dbstruct.ch, который содержит описания имен позиций в массиве для каждого элемента, определяющего атрибут поля. Этот файл находится в директории \include.
В этом примере при помощи функции AADD() создается пустой массив и затем в него добавляются подмассивы описания атрибутов полей. Затем создается файл базы данных People.dbf. Вы можете использовать этот метод, если нужно добавлять динамически описания полей в массив описания структуры: aDbf := {} AADD(aDbf, { "Name", "C", 25, 0 }) AADD(aDbf, { "Address", "C", 1024, 0 }) AADD(aDbf, { "Phone", "N", 13, 0 }) // DBCREATE("People", aDbf) В этом примере производятся те же действия, но массив структуры описывается как двухмерный, а затем при занесении в него описаний структуры используется индексация: #include "dbstruct.ch" // LOCAL aDbf[1][4] aDbf[1][DBS_NAME] := "Name" aDbf[1][DBS_TYPE] := "Character" aDbf[1][DBS_LEN] := 25 aDbf[1][DBS_DEC] := 0 // DBCREATE("Name", aDbf)
DBCREATEINDEX( <имя индексного файла>,<ключевое выражение> ,[<блок кода>],[<признак индексации>] ) --> NIL
<имя индексного файла> | - символьная величина, которая определяет имя |
создаваемого индексного файла. | |
<ключевое выражение> | - символьная величина, задающая индексное |
ключевое выражение в текстовой форме. | |
<блок кода> | - необязательный блок кода, который задает индексное |
ключевое выражение в исполняемой форме. | |
<признак индексации> | - необязательное логическое выражение, которое |
определяет, будет ли иметь создаваемый индексный файл атрибут | |
уникальности. Если <признак индексации> опущен, то используется | |
режим, установленный функцией SET с параметром _SET_UNIQUE. |
DBCREATEINDEX() всегда возвращает NIL.
DBCREATEINDEX() создает индексный файл для базы данных, открытой в текущей рабочей области. Если в рабочей области уже открыты активные индексные файлы, то они закрываются. После того, как новый индексный файл создан, он становится управляющим индексом для рабочей области, и указатель записи перемещается на первую логическую запись.
DBCREATEINDEX() выполняет те же функции, что и стандартная команда INDEX. Более подробную информацию смотрите в команде INDEX.
USE Employees NEW DBCREATEINDEX( "Name","Name")
DBDELETE() --> NIL
No arguments
DBDELETE() всегда возвращает NIL.
DBDELETE() помечает текущую запись как удаленную. Записи, помеченные для удаления, могут быть отфильтрованы с помощью команды SET DELETE или удалены из файла командой PACK.
DBDELETE() выполняет те же функции, что и стандартная команда DELETE, область действия которой - текущая запись. Более подробную информацию смотрите в команде DELETE.
The following example deletes a record after a successful record lock: cLast := "Winston" DBUSEAREA( .T., "DBFNTX", "Sales", "Sales", .T. ) DBSETINDEX( "LASTNAME" ) // IF ( Sales->(DBSEEK(cLast)) ) IF Sales->( RLOCK() ) Sales->( DBDELETE() ) ? "Record deleted: ", Sales->( DELETED() ) ELSE ? "Unable to lock record..." ENDIF ELSE ? "Not found" ENDIF
DBEDIT([<верхняя строка>],[<левая колонка>], [<нижняя строка>],[<правая колонка>], [<массив колонок>], [<функция пользователя>], [<массив SAY-шаблонов>] | [<SAY-шаблон>], [<массив заголовков колонок>] | [<заголовок колонок>], [<массив гор. разделителей>] | [<гор. разделитель>], [<массив верт. разделителей>] | [<верт. разделитель>], [<массив под. разделителей>] | [<под. разделитель>], [<массив строк подписей>] | [<строка подписей>] ) --> NIL
<верхняя строка> | , <левая колонка>, <нижняя строка>, <правая колонка> |
определяют координаты верхнего левого и нижнего правого углов окна | |
работы функции DBEDIT(). Значения номеров строк могут изменяться в | |
пределах от 0 до MAXROW(). Если эти параметры опущены, то по | |
умолчанию принимается, что координаты окна - 0, 0, MAXROW() и | |
MAXCOL(). | |
<массив колонок> | - массив, содержащий символьные выражения, |
представляющие собой имена полей базы данных или, другими словами, | |
выражения, используемые как значения колонок для каждой выводимой | |
строки. Если этот аргумент не определен, DBEDIT() выводит информацию | |
всех полей базы данных текущей рабочей области, размещая ее по | |
колонкам. | |
<функция пользователя> | - имя функции пользователя, которой передается |
управление при нажатии неопределенной клавиши или если клавиша не | |
нажата. Имя функции определяется в виде символьного выражения без | |
круглых скобок и аргументов. Отметим, что поведение функции DBEDIT() | |
зависит от того, определена функция пользователя или нет. Более | |
подробно этот вопрос рассматривается ниже. | |
<массив SAY-шаблонов> | - это параллельный массив, содержащий |
предложения PICTURE для форматирования каждой колонки. Если | |
определить <массив SAY-шаблонов> не в виде массива, а в виде строки | |
(<SAY-шаблон>), информация всех колонок будет выводиться в одном и | |
том же формате. Более подробная информация о предложении PICTURE | |
находится в описании функции TRANSFORM() и команды @...SAY. | |
<массив заголовков колонок> | - параллельный массив, содержащий |
символьные выражения, которые определяют заголовки каждой колонки. | |
Для выдачи заголовков для отдельных колонок необходимо включить точку | |
с запятой в выражение заголовка там, где требуется разорвать | |
последовательность. Если параметр не задан, заголовки колонок | |
выбираются из массива <массив колонок> или заполняются именами полей | |
текущей рабочей области, если массив <массив колонок> также не задан. | |
<массив гор. разделителей> | - параллельный массив, состоящий из |
символьных выражений, который определяет символы, используемые для | |
рисования горизонтальных линий, отделяющих заголовки колонок от | |
области выдачи информации полей. Если <гор. разделитель> задать не в | |
виде массива, для отделения всех колонок будет использован один и тот | |
же разделитель. Если аргумент не задан, по умолчанию принимается | |
разделителем двойная линия. | |
<массив верт. разделителей> | - это параллельный массив, содержащий |
символьные выражения, символы, используемые для рисования | |
вертикальных линий, разделяющих колонки. Если задать <верт. | |
разделитель> не в виде массива, будет использован один и тот же | |
разделитель для всех колонок. Если аргумент не задан, по умолчанию | |
принимается вертикальная линия. | |
<массив под. разделителей> | - параллельный массив, содержащий |
символьные выражения, которые определяют символы, используемые для | |
рисования разделителей между завершающими колонки подписями и | |
информацией полей. Если параметр задается не в виде массива, для всех | |
колонок используется один и тот же разделитель. Если аргумент не | |
задан, по умолчанию принимается отсутствие разделителя (пробел). | |
<массив строк подписей> | - параллельный массив, содержащий символьные |
выражения, завершающие подписи для каждой колонки. Если аргумент | |
задать не в виде массива, в качестве завершающей подписи для всех | |
колонок будет использоваться одно и то же значение. |
DBEDIT() всегда возвращает NIL.
DBEDIT() - это функция взаимодействия программы с пользователем, которая выдает информацию записей из одной или более рабочих областей в табличной форме. Окно для выдачи информации функцией DBEDIT() делится на ячейки, формирующие колонки и строки. Колонки соответствуют полям баз данных, строки соответствуют записям.
Каждая колонка определена элементом массива <массив колонок>. Ширина каждой колонки определяется значением соответствующего элемента <массив колонок> или заданным значением предложения PICTURE в массиве <массив SAY-шаблонов>.
DBEDIT() поддерживает все клавиши управления курсором, включая <PgDn>, <PgUp>, <Home>, <End>, четыре клавиши со стрелками и все комбинации клавиши <Ctrl>, при помощи которых осуществляется управление курсором. Список клавиш управления курсором, если не задана функция пользователя, представлен в таблице 5-8. Если задан аргумент, определяющий имя функции пользователя (<функция пользователя>), все клавиши, представленные в таблице 5-8 активны также в сочетании с клавишами <Esc> и <Enter>. Когда DBEDIT() вызывает функцию пользователя, ей автоматически передается два аргумента:
Текущий режим, передаваемый как арифметическое выражение.
Индекс текущей колонки в <массив колонок>, передаваемый как арифметическое значение.
Первый параметр определяет текущее состояние DBEDIT() в зависимости от последней нажатой клавиши. Перечень возможных состояний приведен в таблице 5-9.
Второй параметр указывает на позицию описания в массиве <массив колонок>. Если массив <массив колонок> не определен, параметр указывает на позицию поля в структуре текущей базы данных. Получить имя поля можно при помощи функции FIELDNAME().
Активные клавиши DBEDIT(). --------------------------------------------------------------------- Ключ Действие --------------------------------------------------------------------- <Стрелка вверх> Вверх на одну строку <Стрелка вниз> Вниз на одну строку <Стрелка влево> Влево на колонку <Стрелка вправо> Вправо на колонку <Ctrl>-<Стрелка влево> Влево в пределах колонки <Ctrl>-<Стрелка вправо> Вправо в пределах колонки <Home> Крайняя левая колонка текущего экрана <End> Крайняя правая колонка текущего экрана <Ctrl>-<Home> Крайняя левая колонка <Ctrl>-<End> Крайняя правая колонка <PgUp> Предыдущий экран <PgDn> Следующий экран <Ctrl>-<PgUp> Первая строка текущей колонки <Ctrl>-<PgDn> Последняя строка колонки <Enter> Завершить DBEDIT() <Esc> Завершить DBEDIT() ---------------------------------------------------------------------
Режимы DBEDIT(). --------------------------------------------------------------------- Статус Dbedit.ch Описание --------------------------------------------------------------------- 0 DE_IDLE Режим ожидания, все коды клавиш обработаны и буфер пуст 1 DE_HITTOP Попытка перевода курсора выше начала файла 2 DE_HITBOTTOM Попытка перевода курсора ниже конца файла 3 DE_EMPTY Нет записей в рабочей области 4 DE_EXCEPT Ключ прерывания ---------------------------------------------------------------------
Значения, возвращаемые функцией пользователя. --------------------------------------------------------------------- Значение Dbedit.ch Описание --------------------------------------------------------------------- 0 DE_ABORT Прервать DBEDIT() 1 DE_CONT Продолжить DBEDIT() 2 DE_REFRESH Обновить экран, обработать нажатые клавиши, затем перейти в режим ожидания ---------------------------------------------------------------------
После вызова функции пользователя DBEDIT() ожидает от нее возврата значения, которое укажет, как действовать дальше. В таблице 5-10 сведены все возможные значения, возвращаемые функцией пользователя, и соответствующие им действия. Функция пользователя вызывается в следующих случаях:
Возникло прерывание по нажатию клавиши. Это происходит, когда DBEDIT() получает из буфера клавиатуры нераспознаваемую последовательность кодов. Эта последовательность остается в буфере клавиатуры до тех пор, пока не считана функцией пользователя или пока DBEDIT() не продолжит свою работу.
DBEDIT() перешла в режим ожидания (Idle), т.е. когда все коды буфера клавиатуры обработаны. Это происходит, когда буфер клавиатуры пуст или после обновления изображения на экране. В этом случае происходит один вызов функции пользователя и затем DBEDIT() ожидает нажатия клавиши.
Обнаружены начало или конец файла. Это тот же режим, что и режим ожидания. Все выполнимые клавиши обрабатываются и производится один вызов функции пользователя с передачей ей текущего статуса.
Когда DBEDIT() выполняется первый раз, обрабатываются все ключи буфера клавиатуры, и DBEDIT() выходит в режим ожидания с вызовом функции пользователя. Если буфер клавиатуры при вызове DBEDIT() пуст, она сразу же выходит в режим ожидания.
При разработке функции пользователя необходимо предусмотреть анализ всех режимов работы DBEDIT() с организацией соответствующих реакций на них.
Функция DBEDIT() полностью реентерабельна, т.е. можно организовывать ее вложенный вызов. Благодаря этому возможен многооконный просмотр информации.
Функция DBEDIT() оставлена для совместимости с предыдущими версиями xClipper и потому ее использование в программах не рекомендуется. Для этих целей она должна быть заменена классом объектов TBrowse. Более подробную информацию вы найдете в главе "Стандартные классы".
Этот пример демонстрирует вызов DBEDIT() с функцией пользователя: USE Customer INDEX Customer NEW USE Sales INDEX Sales NEW SET RELATION TO CustNum INTO Customer // acColumns = {"Branch", "Salesman", "Amount", "Customer->Customer"} DBEDIT( 4, 0, 22, 79, acColumns, "UserFunc")
DBEVAL(<блок кода>,[<FOR-лог.условие>],[<WHILE-лог. условие>], [<к-во записей>],[<номер записи>],[<переключатель>]) --> NIL
<блок кода> | - это блок кода, выполняемый для каждой обрабатываемой |
записи. | |
<FOR-лог.условие> | - это необязательное условие, определенное как блок |
кода, который выполняется для каждой записи в группе. Он выполняет те | |
же функции, что и предложение FOR в командах обработки записей. | |
<WHILE-лог. условие> | - это необязательное условие, определенное как |
блок кода, который выполняется для каждой записи, начиная с текущей | |
и до тех пор, пока условие не примет значение "ложь" (.F.). Он | |
выполняет те же функции, что и предложение WHILE в командах обработки | |
записей. | |
<к-во записей> | - это необязательный аргумент, определяющий |
количество записей, вовлекаемых в обработку, начиная с текущей. | |
Он работает аналогично предложению NEXT. | |
<номер записи> | - это необязательный аргумент, определяющий номер |
обрабатываемой записи. Если этот параметр определен, блок кода | |
выполняется для этой заданной записи. Он работает аналогично | |
предложению RECORD. | |
<переключатель> | - это необязательный логический аргумент, |
определяющий, начинается ли группа записей, обрабатываемых | |
DBEVAL(), с текущей записи и завершается в конце файла, или | |
на обработку передается весь файл. Этот аргумент аналогичен | |
предложению REST и ALL в командах обработки записей. Если его | |
значение "истина" (.T.), то величина группы аналогична REST, | |
в противном случае - ALL ( все записи). Если аргумент не задан, | |
по умолчанию принимаются все записи файла. | |
DBEVAL() всегда возвращает NIL.
DBEVAL() - это функция работы с базами данных, выполняющая блок кода для каждой записи, которая входит в определенную группу и (или) удовлетворяет заданному условию в текущей рабочей области. При каждой итерации DBEVAL() выполняет заданный блок. Все записи, входящие в группу или соответствующие условию, обрабатываются до тех пор, пока не будет достигнут конец файла. По умолчанию DBEVAL() работает с активной (текущей) рабочей областью. Однако можно заставить DBEVAL() работать с пассивной рабочей областью. Это достигается заданием выражения, уточненного алиасом. DBEVAL() работает аналогично функции AEVAL(), которая обрабатывает каждый элемент массива. Так же, как AEVAL(), DBEVAL() может быть использована в качестве примитива для построения команд пользователя, обрабатывающих файлы баз данных. Многие стандартные команды xClipper, обрабатывающие файлы баз данных, созданы с помощью DBEVAL().
Обратитесь к разделу "Блоки кода" в главе "Основные концепции" за более полной информацией по синтаксису и теории создания блоков кода. Обратитесь также к разделу "Система баз данных" в главе "Основные концепции" за более полной информацией о группировке записей и задании условий их выбора. Просмотрите стандартный файл описаний std.ch, находящийся в директории \include, куда включены примеры описаний стандартных команд обработки файлов баз данных xClipper, которые используют функцию DBEVAL().
Этот пример использует DBEVAL() как инструмент в функции пользователя COUNT(), предназначенной для подсчета количества записей в рабочей области в заданной группе. Условия выбора группы передаются функции COUNT() в виде массива. Для того, чтобы этот пример был еще более интересным, в нем используется команда пользователя, которая создает массив, задающий группу записей, тем самым позволяя сформировать условие выбора группы более простым способом. В пример также включены описания явных констант, которые определяют атрибуты объекта группы: // Описание команды // #command CREATE SCOPE <aScope> [FOR<for>] [WHILE<while>]; [NEXT<next>] [RECORD<rec>] [<rest:REST>] [ALL]; =>; aScope := { <{for}>, <{while}>, <next>, <rec>, <.rest.> } // // Описание констант // #define FOR_COND 1 #define WHILE_COND 2 #define NEXT_SCOPE 3 #define REC_SCOPE 4 #define REST_SCOPE 5 // // Создание группы записей и расчет количества записей в ней // LOCAL mySet, myCount USE Customer NEW CREATE SCOPE mySet FOR Customer = "Smith" WHILE Zip > "90000" myCount = Count( mySet ) RETURN FUNCTION Count( aScope ) LOCAL Count := 0 DBEVAL( { || nCount++,; aScope[ FOR_COND ],; aScope[ WHILE_COND ],; aScope[ NEXT_SCOPE ],; aScope[ REC_SCOPE ],; aScope[ REST_SCOPE ]; } ) RETURN nCount
DBF() --> алиас
No arguments
DBF() возвращает имя алиаса текущей рабочей области в виде строки символов. Если нет активной базы данных в текущей рабочей области, DBF() возвращает строку нулевой длины ("").
DBF() - это функция, оставленная для совместимости с предыдущими версиями xClipper и функцией DBF() в xBASE. Она реализуется в xClipper при помощи включения в нее функции ALIAS() без аргументов, поэтому использование DBF() в новых программах не рекомендуется. Она должна быть заменена функцией ALIAS().
DBFILTER() --> значение фильтра
No arguments
DBFILTER() возвращает значение фильтра, определенного в текущей рабочей области в виде строки символов. Если фильтр не определен, DBFILTER() возвращает строку нулевой длины ("").
DBFILTER() - это функция работы с базами данных, которая используется для сохранения и повторного выполнения активного фильтра путем возврата строки символов, представляющей собой выражение, которое определяет значение фильтра с последующей рекомпиляцией и выполнением его при помощи макрооператора (&). Эта функция работает аналогично функциям DBRELATION() и DBRSELECT(), которые используют для сохранения и повторного выполнения скомпонованного выражения отношения в рабочей области. Так как каждая рабочая область имеет активный фильтр, DBFILTER() может возвратить его значение для любой области. Это достигается путем включения DBFILTER() в выражение, уточненное алиасом, как показано ниже.
Этот пример открывает два файла баз данных, устанавливает два фильтра и затем выдает на экран выражения фильтров для обеих рабочих областей: USE Customer INDEX Customer NEW SET FILTER TO Last = "Smith" USE Invoices INDEX Invoices NEW SET FILTER TO CustId = "Smi001" SELECT Customer // ? DBFILTER() // Результат: Last = "Smith" ? Invoices->(DBFILTER()) // Результат: CustId = "Smi001" В следующем примере функция пользователя CreateQry() использует DBFILTER() для создания файла хранения переменных памяти, содержащего текущее значение фильтра в PRIVATE переменной cFilter: FUNCTION CreateQry( cQryName ) PRIVATE cFilter := DBFILTER() SAVE ALL LIKE cFilter TO ( cQryName + ".qwy") RETURN NIL Позднее можно восстановить фильтр при помощи функции пользователя SetFilter() : FUNCTION SetFilter( cQryName ) RESTORE FROM &cQryName..qwy ADDITIVE SET FILTER TO &cFilter. RETURN NIL
DBGOBOTTOM() --> NIL
No arguments
DBGOBOTTOM() всегда возвращает NIL.
DBGOBOTTOM() Перемещает указатель на последнюю логическую запись в текущей рабочей области.
DBGOBOTTOM() выполняет те же функции, что и стандартная команда GO BOTTOM. Более подробную информацию смотрите в команде GO.
The following example uses DBGOBOTTOM() to position the record pointer on the last logical record: cLast := "Winston" DBUSEAREA( .T., "DBFNTX", "Sales", "Sales", .T. ) DBSETINDEX( "LASTNAME" ) // Sales->( DBGOBOTTOM() ) IF ( Sales->Last == "Winston" ) IF RLOCK() Sales->( DBDELETE() ) ? "Record deleted: ", Sales->( DELETED() ) ELSE ? "Unable to lock record..." ENDIF END
DBGOTO(<номер записи>) --> NIL
DBGOTO() всегда возвращает NIL.
DBGOTO() перемещает указатель на запись, номер которой равен <номер записи>. Если такой номер не существует, указатель устанавливается на запись LASTREC()+1, а значение, возвращаемое функциями как EOF(), так и BOF() - "истина" (.T.).
DBGOTO() выполняет те же функции, что и стандартная команда GO. Более подробную информацию смотрите в команде GO.
DBGOTOP() --> NIL
No arguments
DBGOTOP() всегда возвращает NIL.
DBGOTOP() Перемещает указатель на первую логическую запись в текущей рабочей области.
DBGOTOP() выполняет те же функции, что и стандартная команда GO TOP. Более подробную информацию смотрите в команде GO.
DBGOTOP() WHILE ( !EOF() ) ? FIELD->Name DBSKIP() END
DBRECALL() --> NIL
No arguments
DBRECALL() всегда возвращает NIL.
DBRECALL() восстанавливает текущую запись, если она помечена для удаления.
DBRECALL() выполняет те же функции, что и стандартная команда RECALL. Более подробную информацию смотрите в команде RECALL.
The following example recalls a record if it is deleted and attempts to lock the record if successful: cLast := "Winston" DBUSEAREA( .T., "DBFNTX", "Sales", "Sales", .T. ) DBSETINDEX( "LASTNAME" ) // IF ( Sales->(DBSEEK(cLast)) ) IF Sales->( DELETED() ) IF Sales( RLOCK() ) Sales( DBRECALL() ) ? "Record recalled" ELSE "Unable to lock record..." ENDIF ENDIF ELSE ? "Not found" ENDIF
DBREINDEX() --> NIL
No arguments
DBREINDEX() всегда возвращает NIL.
DBREINDEX() заново строит все активные индексы в текущей рабочей области. После индексации указатель записи в текущей рабочей области устанавливается на первую логическую запись согласно управляющему индексу.
DBREINDEX() выполняет те же функции, что и стандартная команда REINDEX. Более подробную информацию смотрите в команде REINDEX.
The following example reindexes the work area: cLast := "Winston" DBUSEAREA( .T., "DBFNTX", "Sales", "Sales", .T. ) DBSETINDEX( "LASTNAME" ) // IF ( Sales->(DBSEEK(cLast)) ) IF RLOCK() DELETE FOR Sales->LastName == "Winston" Sales->( DBREINDEX() ) ELSE ? "Unable to lock record..." ENDIF ELSE ? "Not found" ENDIF
DBRELATION(<номер отношения>) --> выражение связи
DBRELATION() возвращает строку символов, содержащую скомпонованное выражение связи, номер которого определен аргументом <номер отношения>. Если отношение с заданным номером не существует, DBRELATION() возвращает строку нулевой длины ("").
DBRELATION() - это функция работы с базами данных, которая используется в комбинации с функцией DBRSELECT() для определения скомпонованного выражения и рабочей области действующего отношения, заданного командой SET RELATION. DBRELATION() возвращает скомпонованное выражение, определенное в предложении TO.
DBRSELECT() возвращает скомпонованную рабочую область такой, как она была определена в предложении INTO.
По умолчанию DBRELATION() выполняется для активной ( текущей ) рабочей области. Однако она может быть выполнена для пассивной рабочей области путем включения DBRELATION() в выражение, уточненное алиасом ( смотри пример ниже ).
В этом примере открываются три файла базы данных, устанавливается два дочерних отношения из родительской рабочей области и затем на экран выдается выражение, связанное со второй дочерней рабочей областью: USE Invoices INDEX Invoices NEW USE BackOrder INDEX BackOrder NEW USE Customer INDEX Customer NEW SET RELATION TO CustNum INTO Invoices, OrderNum INTO BackOrder // ? DBRELATION(2) // Результат: OrderNum Затем можно извлечь то же скомпонованное выражение из пассивной рабочей области, используя выражение, уточненное алиасом: USE Archive NEW ? Customer --> (DBRELATION(2)) // Результат: OrderNum В этом примере функция пользователя Relation() возвращает результаты работы DBRELATION() и DBRSELECT() в виде массива: FUNCTION Relation( nRelation ) RETURN { DBRELATION(nRelation), ALIAS(DBRSELECT(nRelation)) }
DBRSELECT(<номер отношения>) --> номер рабочей области
DBRSELECT() возвращает номер рабочей области в виде целого числа для отношения, номер которого определен аргументом <номер отношения>. Если отношение с заданным номером не определено, DBRSELECT() возвращает ноль.
DBRSELECT() - это функция работы с базами данных, которая используется в комбинации с функцией DBRELATION() для определения рабочей области и скомпонованного выражения действующего отношения, созданного командой SET RELATION. DBRSELECT() возвращает рабочую область, определенную в предложении INTO. DBRELATION() возвращает скомпонованное выражение, определенное в предложении TO. Для определения алиаса вместо номера рабочей области используйте выражение ALIAS( DBRSELECT( <номер отношения> )).
По умолчанию DBRSELECT() работает с текущей ( активной ) рабочей областью. Однако она может работать в пассивной рабочей области. Для этого необходимо включить DBRSELECT() в выражение, уточненное алиасом (смотри пример ниже).
Этот пример открывает три рабочих области, устанавливает два отношения из родительской области с дочерними и затем выдает на экран скомпонованное выражение отношения со второй дочерней областью вместе с алиасом определяемой рабочей области: USE Invoices INDEX Invoices NEW USE BackOrder INDEX BackOrder NEW USE Customer INDEX Customer NEW SET RELATION TO CustNum INTO Customer, OrderNum INTO BackOrder // ? DBRELATION(2), DBRSELECT(2) // Результат: OrderNum 3 ? ALIAS(DBRSELECT(2)) // Результат: BackOrder Несколько позже можно получить ту же самую информацию из пассивной рабочей области, используя выражение, уточненное алиасом: USE Archive NEW ? Customer->(DBRELATION(2)) // Результат: OrderNum ? Customer->(DBRSELECT(2)) // Результат: 3
DBSEEK(<выражение поиска>, [<признак относительного поиска>]) --> признак завершения
<выражение поиска> | - выражение любого типа, которое определяет |
ключевое значение в искомой записи. | |
<признак относительного поиска> | - необязательное логическое значение, |
которое определяет, выполняется ли режим относительного поиска. | |
Это определяет, куда будет установлен указатель записи, если заданное | |
ключевое значение не найдено (см. ниже). Если <признак относительного | |
поиска> опущен, то используется режим, установленный командой SET() с | |
аргументом _SET_SOFTSEEK. |
DBSEEK() возвращает "истина" (.T.), если заданное ключевое выражение было найдено и "ложь" (.F.) в противном случае.
DBSEEK() - перемещает указатель на первую логическую запись, ключевое значение которой равно <выражение поиска>. Если такая запись найдена, то она становится текущей записью, и DBSEEK() возвращает "истина" (.T.). В противном случае DBSEEK() возвращает "ложь" (.F.), а указатель перемещается следующим образом: при нормальном (не относительном) поиске указатель установится на записи с номером LASTREC() + 1, и функция EOF() возвратит "истина" (.T.). При относительном поиске указатель установится на первой записи, ключевое значение которой больше, чем заданное ключевое значение. Если такой записи не существует, указатель установится на записи с номером LASTREC()+1, и функция EOF() возвратит значение "истина" (.T.)
Функция DBSEEK() может применяться рабочей области, где есть активные индексы.
DBSEEK() выполняет те же функции, что и стандартная команда SEEK. Более подробную информацию смотрите в команде SEEK.
ACCEPT "Имя работника: " TO cName IF ( Employee->(DBSEEK(name)) ) Employee->(ViewRecord()) ELSE ? "Не найден" END
DBSELECTAREA(<номер рабочей области> | <алиас>) --> NIL
DBSELECTAREA() всегда возвращает NIL.
При помощи DBSELECTAREA() определенная рабочая область становится текущей рабочей областью. Все последующие операции над базой данных будут применяться к этой рабочей области до тех пор, пока другая рабочая область не будет явно задана. DBSELECTAREA() выполняет те же функции, что и стандартная команда SELECT. Более подробную информацию смотрите в команде SELECT.
DBSELECTAREA("Table1")
DBSETDRIVER([<драйвер>]) --> текущий драйвер
DBSETDRIVER() возвращает имя текущего драйвера баз данных.
DBSETDRIVER() устанавливает драйвер баз данных, используемый при активации новых рабочих областей без явно заданного драйвера. Если указанный драйвер недоступен, то функция не оказывает действия. DBSETDRIVER() - возвращает имя текущего драйвера баз данных, используемого по умолчанию при открытии баз данных.
В этом примере устанавливается драйвер "DBFNTX". В случае недоступности драйвера выдается сообщение. DBSETDRIVER("DBFNTX") IF ( DBSETDRIVER() <> "DBFNTX" ) ? "DBFNTX драйвер не доступен" ENDIF
DBSETFILTER(<условие - блок кода>,[<текст условия>]) --> NIL
DBSETFILTER() всегда возвращает NIL.
DBSETFILTER() устанавливает логическое условие фильтра для текущей рабочей области. Когда фильтр установлен, записи, не удовлетворяющие условию фильтра, логически не видны. То есть, операции, обрабатывающие логические записи, такие записи не рассматривают.
Выражение фильтра, задаваемое при вызове функции DBSETFILTER(), должно при вычислении для записей, удовлетворяющих условиям фильтра, давать результат "истина" (.T.) и "ложь" (.F.) в противном случае.
Выражение фильтра может быть представлено или как один блок кода <условие - блок кода>, или как блок кода и эквивалентный <текст условия>, выражающие одинаковые условия. Если второй аргумент отсутствует, то функция DBFILTER() будет возвращать пустую строку.
DBSETFILTER() выполняет те же функции, что и стандартная команда SET FILTER. Более подробную информацию смотрите в команде SET FILTER.
USE Employees NEW DBSETFILTER( {|| Age < 40}, "Age < 40")
DBSETINDEX( <имя индексного файла> ) --> NIL
DBSETINDEX() всегда возвращает NIL.
DBSETINDEX() открывает индексный файл для текущей рабочей области. Любые индексные файлы, уже связанные с текущей рабочей областью, продолжают быть активными. Если заново открытый индекс является единственным индексом, связанным с рабочей областью, то он становится управляющим индексом, в противном случае, управляющий индекс не переназначается.
После открытия нового индекса указатель записей устанавливается на первую логическую запись в соответствии с управляющим индексом.
DBSETINDEX() выполняет те же функции, что и стандартная команда SET INDEX или предложение INDEX команды USE. Более подробную информацию смотрите в команде SET INDEX.
DBSETORDER( <номер индексного файла> ) --> NIL
DBSETORDER() всегда возвращает NIL.
DBSETORDER() определяет, какой из активных индексов текущей рабочей области является управляющим индексом. Управляющий индекс - это индекс, определяющий логический порядок записей в рабочей области.
Активные индексы пронумерованы от 1 до общего числа активных индексов, в порядке, в котором эти индексы были открыты. <номер индексного файла> определяет номер желаемого индекса.
DBSETORDER() выполняет те же функции, что и стандартная команда SET ORDER. Более подробную информацию смотрите в команде SET ORDER.
USE Employees NEW SET INDEX TO Name, Age DBSETORDER(2)
DBSETRELATION( <номер области> | <алиас>, <выражение - блок кода>, [<текстовое выражение>] ) --> NIL
<номер области> | - числовая величина, которая определяет номер |
дочерней рабочей области. | |
<алиас> | - символьная величина, которая определяет алиас дочерней |
рабочей области. | |
<выражение - блок кода> | - блок кода, определяющий выражение отношения |
связи в исполняемой форме. | |
<текстовое выражение> | - необязательная символьная величина, |
определяющая выражение отношения связи в текстовой форме. Если | |
<текстовое выражение> | опущено, то функция DBRELATION() возвратит |
пустую строку. |
DBSETRELATION() всегда возвращает NIL.
DBSETRELATION() - связывает рабочую область, определенную при помощи <номер области> или <алиас> (дочернюю рабочую область) с текущей рабочей областью (родительская рабочая область). Все активные отношения связи остаются активными.
Установленная связь между двумя рабочими областями заставляет дочернюю рабочую область работать синхронно с родительской рабочей областью. Это достигается автоматическим перемещением указателя записей в дочерней рабочей области всякий раз, когда указатель в родительской рабочей области перемещается на новую запись. Если дочерняя рабочая область имеет активный индекс, то перемещение указателя в родительской рабочей области заставляет автоматически работать команду SEEK в дочерней рабочей области. При этом ключ поиска является результатом вычисления заданного <выражение - блок кода>. Если дочерняя рабочая область не имеет активного индекса, то перемещение указателя в родительской рабочей области заставляет автоматически работать команду GOTO в дочерней рабочей области. При этом номер записи для GOTO является результатом вычисления <выражение - блок кода>.
Выражение отношения может быть задано или как одно <выражение - блок кода>, или как два аргумента: <выражение - блок кода> и эквивалентный ему <текст выражения>. Если текстовый вариант не задан, то функция DBRELATION() будет возвращать пустую строку.
DBSETRELATION() выполняет те же функции, что и стандартная команда SET RELATION с предложением ADDITIVE. Более подробную информацию смотрите в команде SET RELATION.
USE Employees NEW USE Department NEW INDEX Dept SELECT Employee DBSETRELATION("Department", {|| Employee->Dept}, "Employee->Dept") LIST Employee->Name, Department->Name
DBSKIP(<кол-во записей>) --> NIL
DBSKIP() всегда возвращает NIL.
DBSKIP() перемещает указатель вперед или назад относительно текущей записи. При попытке передвинуть указатель вперед за последнюю запись указатель установится в позиции LASTREC()+1, и функция EOF() возвратит значение "истина" (.T.). При попытке передвинуть указатель назад за первую запись указатель установится на первую запись, и функция BOF() возвратит значение "истина" (.T.).
DBSKIP() выполняет те же функции, что и стандартная команда SKIP. Более подробную информацию смотрите в команде SKIP.
DBGOTOP() WHILE ( !EOF() ) ? FIELD->Name DBSKIP() END
DBSTRUCT() -> массив, содержащий структуру
No arguments
DBSTRUCT() возвращает структуру текущей базы данных в массиве с длиной, равной количеству полей в файле базы данных. Каждый элемент массива является подмассивом, содержащим информацию об этом поле. Подмассивы имеют следующий формат:
Массив, возвращаемый функцией DBSTRUCT(). --------------------------------------------------------------------- Позиция Метасимвол dbstruct.ch --------------------------------------------------------------------- 1 cName DBS_NAME 2 cType DBS_TYPE 3 nLength DBS_LEN 4 nDecimals DBS_DEC ---------------------------------------------------------------------
Если в текущей рабочей области нет открытой базы данных, то DBSTRUCT() возвращает пустой ({}) массив.
DBSTRUCT() - это функция работы с базами данных, функционирующая подобно команде COPY STRUCTURE EXTENDED. Однако первая создает массив с данными о структуре файла, а вторая - файл базы данных. Есть еще одна функция DBCREATE(), которая может создавать файл базы данных по информации о структуре из массива.
По умолчанию DBSTRUCT() работает с активной (текущей) рабочей областью. Однако она может работать и с пассивной рабочей областью, если включить ее в выражение, уточненное алиасом, как показано ниже.
Для облегчения работы в комплект поставки xClipper входит файл описаний dbstruct.ch, размещаемый в директории \include, в котором определены константы описания атрибутов каждого поля.
Следующий пример открывает два файла баз данных и затем при помощи DBSTRUCT() создает массив, содержащий структуру базы данных. При этом используется выражение, уточненное алиасом. Далее, при помощи функции AEVAL(), составляется список имен полей: #include "dbstruct.ch" // LOCAL aStruct USE Customer NEW USE Invoices NEW // aStruct := Customer->(DBSTRUCT()) AEVAL( aStruct, { |aField| QOUT(aField[DBS_NAME]) } )
DBUNLOCK() --> NIL
No arguments
DBUNLOCK() всегда возвращает NIL.
DBUNLOCK() снимает блокировку записи или всей базы данных, установленную текущим процессом в текущей рабочей области. DBUNLOCK() используется только для баз данных, открытых для совместного использования в сетевой среде.
DBUNLOCK() выполняет те же функции, что и стандартная команда UNLOCK. Более подробную информацию смотрите в команде UNLOCK.
The following example illustrates a basic use of the DBUNLOCK() function: cLast := "Winston" USE Sales SHARED NEW VIA "DBFNTX" DBSETINDEX( "LASTNAME" ) // IF ( Sales->(DBSEEK(cLast)) ) IF Sales->( RLOCK() ) Sales->( DBDELETE() ) ? "Record deleted: ", Sales( DELETED() ) Sales->( DBUNLOCK() ) ELSE ? "Unable to lock record..." ENDIF ELSE ? "Not found" ENDIF
DBUNLOCKALL() --> NIL
No arguments
DBUNLOCKALL() всегда возвращает NIL.
DBUNLOCKALL() снимает блокировки записи или всей базы данных, установленные текущим процессом для всех рабочих областей. DBUNLOCKALL() используется только для баз данных, открытых для совместного использования в сетевой среде. Вызов функции DBUNLOCKALL() эквивалентен вызову функции DBUNLOCK() в каждой рабочей области.
DBUNLOCKALL() выполняет те же функции, что и стандартная команда UNLOCK ALL. Более подробную информацию смотрите в команде UNLOCK ALL.
The following example marks a record for deletion if an RLOCK() attempt is successful, then clears all locks in all work areas: cLast := "Winston" USE Sales SHARED NEW VIA "DBFNTX" DBSETINDEX( "SALEFNAM" ) DBSETINDEX( "SALELNAM" ) // USE Colls SHARED NEW VIA "DBFNTX" DBSETINDEX( "COLLFNAM" ) DBSETINDEX( "COLLLNAM" ) // DBSELECTAREA( "Sales" ) // select "Sales" work area // IF ( Colls->(DBSEEK(cLast)) ) IF Colls->( DELETED() ) ? "Record deleted: ", Colls->( DELETED() ) IF Colls->( RLOCK() ) Colls->( DBRECALL() ) ? "Record recalled..." ENDIF ENDIF ELSE ? "Not found" DBUNLOCKALL() // remove all locks in ENDIF // all work areas
DBUSEAREA( [<признак новой области>], [<драйвер>], <имя>, [<алиас>], [<совместный доступ>], [<только чтение>] ) --> NIL
<признак новой области> | - необязательное логическое значение. |
Значение "истина" (.T.) определяет, что текущей рабочей областью | |
перед открытием базы данных становится неиспользуемая рабочая область | |
с наименьшим номером. Если <признак новой области> - "ложь" (.F.) или | |
опущен, используется текущая рабочая область. Если в этой рабочей | |
области уже есть открытый файл базы данных, то он закрывается. | |
<драйвер> | - необязательная символьная величина. Если присутствует, |
то она определяет имя драйвера баз данных, который будет | |
использоваться в рабочей области. Если <драйвер> опущен, то по | |
умолчанию используется текущий драйвер (см. замечание ниже). | |
<имя> | - определяет имя открываемой базы данных (.dbf). |
<алиас> | - необязательная символьная величина. Если присутствует, |
то она определяет алиас, связанный с рабочей областью. Алиас должен | |
быть допустимым в xClipper идентификатором. Если <алиас> опущен, то | |
значение алиаса такое же, как <имя>. | |
<совместный доступ> | - необязательная логическая величина. Если |
аргумент присутствует, то он определяет, открывается ли база данных в | |
режиме доступности для других процессов в сети. Значение "истина" | |
(.T.) определяет, что другие процессы могут иметь доступ, а значение | |
"ложь" (.F.) определяет, что текущий процесс должен иметь монопольный | |
доступ. Если <совместный доступ> опущен, то текущая глобальная | |
установка _SET_EXLUSIVE определяет, разрешен ли совместный доступ к | |
файлам баз данных. | |
<только чтение> | - необязательная логическая величина, которая |
определяет, запрещены ли изменения данных в рабочей области. | |
Значение "истина" (.T.) определяет запрет изменений, а "ложь" | |
(.F.) - разрешение. Если аргумент <только чтение> опущен, то | |
предполагается значение "ложь" (.F.). |
DBUSEAREA() всегда возвращает NIL.
DBUSEAREA() открывает базу данных (.dbf-файл) в текущей или новой рабочей области.
DBUSEAREA() выполняет те же функции, что и стандартная команда USE. Более подробную информацию смотрите в команде USE.
DBUSEAREA(.T.,"DBFNTX","Employee")
DELETED() --> признак удаления
No arguments
DELETED() возвращает значение "истина" (.T.), если текущая запись помечена как удаляемая, в противном случае она возвращает значение "ложь" (.F.). Если в текущей рабочей области нет открытой базы данных, DELETED() возвращает значение "ложь" (.F.).
DELETED() - это функция работы с базами данных, которая определяет, не отмечена ли текущая запись в активной рабочей области как удаляемая. Так как каждая рабочая область, имеющая открытую базу данных, всегда имеет текущую запись, каждая рабочая область имеет свое значение функции DELETED().
По умолчанию DELETED() работает с текущей (активной) рабочей областью. Однако она может работать и с пассивной рабочей областью, если DELETED() поместить в выражение, уточненное алиасом (смотри пример ниже).
В программах функция DELETED() чаще всего используется для получения признака удаления записи как части условия обработки записей или для выдачи признака удаления как части экранной информации или данных отчетов.
В этом примере показано использование функции DELETED() в активной и пассивной рабочих областях: USE Customer NEW USE Sales NEW ? DELETED() // Результат: .F. DELETE ? DELETED() // Результат: .T. ? Customer->(DELETED()) // Результат: .F. Этот пример демонстрирует, как функция DELETED() может быть использована для выдачи признака удаления на экран и в отчет: @ 1, 65 SAY IF(DELETED(), "Удалена", "Активна" )
DESCEND(<выражение>) --> дополнение выражения
DESCEND() возвращает данные того же типа, что и выражение <выражение> в форме дополнения, за исключением дат, которые возвращаются в числовой форме. Значение функции DESCEND() с аргументом CHR(0) - CHR(0).
DESCEND() - функция преобразования данных, которая возвращает значение аргумента <выражение> в форме дополнения. Значение аргумента используется в сочетании с командой INDEX для создания индексов, сортирующих данные по убыванию. Это достигается тем, что ту часть выражения в индексе, которая должна сортировать по убыванию значений, представляют как аргумент функции DESCEND(). При последующем поиске при помощи команды SEEK, DESCEND() включается в выражение поиска.
В этом примере используется функция DESCEND() в выражении команды INDEX для создания сортировки по убыванию дат: USE Sales NEW INDEX ON DESCEND(OrdDate) TO SalesDate Далее, DESCEND() может быть использована в команде SEEK при поиске значений в индексе, построенном по убыванию : SEEK DESCEND(dFindDate) В этом примере показано, как создать индекс для сортировки по убыванию, используя данные разных типов. Ключ создается путем сцепления данных типа даты и символьных полей после предварительных преобразований. Вместо функции DTOC() используется функция STR(), так как DESCEND() данные типа даты преобразует в числовое значение: USE Sales NEW INDEX ON STR( DESCEND(SaleDate)) + Salesman TO LastSale
EOF() --> признак конца файла
No arguments
EOF() возвращает значение "истина" (.T.) при попытке переместить указатель записи за последнюю логическую запись файла базы данных, в остальных случаях она возвращает значение "ложь" (.F.). Если файл базы данных не открыт в текущей рабочей области, EOF() возвращает значение "ложь" (.F.). Если текущий файл базы данных не содержит ни одной логической записи, EOF() возвращает значение " истина" (.T.).
EOF() - это функция работы с базами данных, которая используется для проверки, не достиг ли указатель записи конца файла при его движении вперед по файлу базы данных. Все команды, передвигающие указатель записи, могут изменять значение EOF().
Наиболее типичным случаем использования EOF() является ее включение в качестве аргумента условия <лог. условие> конструкции DO WHILE при последовательной обработке записей файла базы данных. В этом случае <лог. условие> должно включать проверку на .NOT.EOF(), заставляя цикл завершаться в том случае, когда EOF() возвращает значение "истина" (.T.).
Функции EOF() и FOUND() могут быть взаимозаменяемыми при проверке успешности выполнения команд SEEK, FIND или LOCATE. Однако в этом случае более предпочтительной является функция FOUND().
Когда функция EOF() возвращает значение "истина" (.T.), указатель записи устанавливается на значение LASTREC() + 1 независимо от того, было ли активно предложение SET FILTER или командой SET DELETED установлен режим ON. При дальнейших попытках передвижения указателя записи вперед значение EOF() будет оставаться неизменным и ошибки времени выполнения не будет. Значение "истина" (.T.), установленное функцией EOF(), не изменится до следующей попытки передвижения указателя записи.
По умолчанию функция EOF() работает с файлом базы данных в текущей (активной) рабочей области. Однако она может быть использована с файлом базы данных пассивной рабочей области. В этом случае EOF() должна быть частью выражения, уточненного алиасом (смотри пример ниже).
Этот пример демонстрирует использование функции EOF() при свободном перемещении указателя записи по файлу базы данных: USE Sales GO BOTTOM ? EOF() // Результат: .F. SKIP ? EOF() // Результат: .T. Этот пример использует выражение, уточненное алиасом при просмотре значения функции EOF() в пассивной рабочей области: USE Sales NEW USE Customer NEW ? Sales->(EOF()) ? Customer->(EOF()) Этот пример иллюстрирует, как функция EOF() может быть использована в качестве части условия при последовательных операциях над файлом базы данных: USE Sales INDEX CustNum NEW DO WHILE !EOF() nOldCust = Sales->CustNum nTotalAmount := 0 DO WHILE nOldCust = Sales->CustNum .AND. (!EOF()) ? Sales->CustNum, Sales->Description, Sales->SaleAmount nTotalAmount += Sales->SaleAmount SKIP ENDDO ? "Общий итог :", nTotalAmount ENDDO
FCOUNT() --> число полей
No arguments
FCOUNT() возвращает число полей в файле базы данных, открытом в текущей рабочей области как целое числовое значение. Если нет открытого файла базы данных, FCOUNT() возвращает нуль.
FCOUNT() является функцией базы данных. Она используется в прикладных программах, настраиваемых на базы данных с разной структурой записей. К их числу относятся программы с настраиваемым вводом/выводом и программы отчетов.
Обычно функция FCOUNT() используется для установления верхнего предела для цикла FOR...NEXT или DO WHILE, который обрабатывает один файл за один раз. По умолчанию FCOUNT() обрабатывает файл в текущей (активной) рабочей области. Но если ее использовать как элемент выражения, уточненного алиасом, можно получить данные о количестве полей записи файла базы данных в пассивной рабочей области.
Пример иллюстрирует, как FCOUNT() возвращает число полей в текущей и пассивной рабочей области: USE Sales NEW USE Customer NEW ? FCOUNT() // Результат: 5 ? Sales->(FCOUNT()) // Результат: 8 В данном примере показано, как использовать FCOUNT(), чтобы описать массив для последующей загрузки в него информации о полях: LOCAL aFields := ARRAY(FCOUNT()) AFIELDS(aFields) В данном примере показано использование FCOUNT() как верхнего предела цикла FOR...NEXT по списку полей записи файла текущей рабочей области: LOCAL nField USE Sales NEW FOR nField := 1 TO FCOUNT() ? FIELD(nField) NEXT
FIELDGET(<номер поля>) --> значение поля
FIELDGET() возвращает значение определенного поля. Если <номер поля> не соответствует номеру какого-либо поля в текущей базе данных, то FIELDGET() возвратит NIL.
FIELDGET() - функция баз данных, возвращающая значение поля, указанного его порядковым номером в структуре базы данных. Это позволяет, кроме всего прочего, получать значение поля без использования оператора макроподстановки.
Следующий пример позволяет сравнить функцию FIELDGET() и эквивалентный фрагмент программы, использующий операцию макроподстановки для получения значения поля: LOCAL nField := 1, FName, FVal USE Customer NEW // // Использование оператора макроподстановки FName := FIELD( nField ) FVal := &FName // Использование FIELDGET() FVal := FIELDGET( nField )
FIELDNAME(<номер позиции>) --> имя поля
FIELDNAME() возвращает имя поля с заданным номером в виде символьной строки в верхнем регистре. Если поле с указанным значением аргумента <номер позиции> отсутствует, FIELDNAME() возвращает пустую строку ("").
FIELDNAME() является функцией обработки баз данных. Она возвращает имя поля, порядковый номер которого в структуре записи соответствует позиции, заданной в качестве его индекса.
Обычно она используется в прикладных программах, когда неизвестны имена полей. Если требуется получить имена сразу нескольких полей, удобнее использовать функцию AFIELDS(), так как она создает массив с именами полей, или команду COPY STRUCTURE EXTENDED, создающую базу данных с информацией о полях.
Если необходима дополнительная информация о структуре файла базы данных для совместной обработки, можно использовать функции TYPE() и LEN(). Для получения количества цифр после десятичной запятой в числовых полях, можно использовать следующее выражение:
LEN(SUBSTR(STR(<имя поля>), RAT(".", STR(<имя поля>)) + 1))
По умолчанию функция FIELDNAME() обрабатывает файл в текущей (активной) рабочей области. Однако для обработки файла в пассивной рабочей области необходимо ее включить в уточненное алиасом выражение, как показано в примере ниже.
В следующих примерах показано использование FIELDNAME() совместно с другими функциями: USE Sales ? FIELDNAME(1) // Результат: BRANCH ? FCOUNT() // Результат: 5 ? LEN(FIELDNAME(0)) // Результат: 0 ? LEN(FIELDNAME(40)) // Результат: 0 В следующем примере показано использование FIELDNAME() для получения списка имен и типов полей в Customer.dbf: USE Customer NEW FOR nField := 1 TO FCOUNT() ? PADR(FIELDNAME(nField), 10), VALTYPE(&(FIELDNAME(nField))) NEXT В данном примере показано использование выражений, уточненных алиасом, для осуществления доступа к именам полей в пассивной рабочей области: USE Sales NEW USE Customer NEW USE Invoices NEW // ? Sales-> (FIELDNAME(1)) // Результат: SALENUM ? Customer-> (FIELDNAME(2)) // Результат: Custnum
FIELDPOS(<имя поля>) --> номер поля
FIELDPOS() возвращает порядковый номер заданного поля внутри списка полей, связанных с текущей или заданной рабочей областью. Если в рабочей области нет полей с заданным именем, то FIELDPOS() возвращает ноль.
FIELDPOS() - функция баз данных, являющаяся обратной функциям FIELD() или FIELDNAME(), и возвращающая имя поля по его номеру в списке полей рабочей области. FIELDPOS() наиболее часто используется в сочетании с функциями FIELDPUT() и FIELDGET().
Как и другие функции баз данных, FIELDPOS() может использоваться для возвращения имени поля в любой невыбранной рабочей области, используя функцию с алиасным выражением. Смотрите пример ниже
В этом примере демонстрируется обычное использование функции FIELDPOS(): USE Customer NEW ? FIELDPOS("Name") // Результат: 1 ? FIELDGET(FIELDPOS("Name")) // Результат: Кэт В этом примере демонстрируется, как использовать FIELDPOS() для получения позиции заданного поля в невыбранной рабочей области с помощью алиасного выражения: USE Customer NEW USE Invoices NEW ? Customer->(FIELDPOS("Name")) // Результат: 1 ? Customer->(FIELDGET(FIELDPOS("Name"))) // Результат: Кэт
FIELDPUT(<номер поля>,<выражение>) --> присвоенное значение
FIELDPUT() возвращает значение, присвоенное указываемому полю. Если <номер поля> не соответствует номеру какого-либо поля в текущей базе данных, FIELDPUT() возвратит NIL.
FIELDPUT() - функция баз данных, присваивающая значение <выражение> полю с порядковым номером <номер поля> в базе данных текущей рабочей области. Использование номера поля, а не его имени, позволяет, кроме всего прочего, получать значение без использования операции макроподстановки.
Следующий пример позволяет сравнить функцию FIELDPUT() с эквивалентным фрагментом программы, использующим операцию макроподстановки для присвоения значения полю: // Использование оператора макроподстановки FName := FIELD(nField) // Получение имени поля FIELD->&FName := FVal // Присвоение значения полю // Использование FIELDPUT() FIELDPUT(nField, FVal) // Присвоение значения полю
FLOCK() --> признак завершения
No arguments
FLOCK() возвращает значение "истина"(.Т.), если попытка захватить открытый файл базы данных в текущей (активной) рабочей области успешна; в противном случае она возвращает значение "ложь"(.F.). Для получения дополнительной информации по захвату файлов читайте главу "Программирование в сети" в книге "Программирование и утилиты".
FLOCK() является функцией обработки баз данных, которая используется в сетевой среде для захвата открытого и совместно используемого файла базы данных, чтобы не давать другим пользователям возможности изменить файл до тех пор, пока не будет снят запрет. Однако записи в захваченном файле остаются доступными другим пользователям только для чтения.
По своим действиям FLOCK() похожа на команду USE...EXCLUSIVE и функцию RLOCK(). USE...EXCLUSIVE открывает файл базы данных так, чтобы никакой другой пользователь не мог открыть тот же самый файл в то же самое время, и является наиболее грубым механизмом захвата базы данных в xClipper. Функция RLOCK() - в этом смысле более гибкая, так как распространяет запрет на изменение только одной совместно используемой записи. FLOCK() находится посередине.
Как правило, FLOCK() используется совместно с операциями, обрабатывающими все записи файла базы данных. Обычно это команды, которые имеют дело с группой записей или выбирают их по условию, такие, например, как DELETE или REPLACE ALL. Ниже приводится список таких команд:
Команды, которые требуют FLOCK(). --------------------------------------------------------------------- Команда Режим --------------------------------------------------------------------- APPEND FROM FLOCK() или USE...EXCLUSIVE DELETE (несколько записей) FLOCK() или USE...EXCLUSIVE RECALL (несколько записей) FLOCK() или USE...EXCLUSIVE REPLACE (несколько записей) FLOCK() или USE...EXCLUSIVE UPDATE ON FLOCK() или USE...EXCLUSIVE ---------------------------------------------------------------------
При каждом вызове функция FLOCK() предпринимает попытку заблокировать файл базы данных и возвращает логическое значение результата этой попытки.
Захват файла не может быть осуществлен, если в это же время другой пользователь захватил весь файл или какую-либо запись этого файла базы данных, или при открытии файла была применена команда EXCLUSIVE USE. Если функция FLOCK() завершилась успешно, блокировка файла сохраняется до тех пор, пока вы не выполните команды UNLOCK, CLOSE, DATABASE или функцию RLOCK().
По умолчанию FLOCK() действует в текущей (активной) рабочей области, но может действовать и в пассивной рабочей области путем включения ее в выражение, уточненное алиасом, как показано в примере, приведенном ниже.
Данный пример демонстрирует использование FLOCK() для группового изменения цен в Inventory.dbf: USE Inventory NEW IF FLOCK() REPLACE ALL Inventory->Price WITH Inventory->Price * 1.1 ELSE ? "Файл недоступен" ENDIF В данном примере показано использование выражения уточненного алиасом для блокировки файла в пассивной рабочей области: USE Sales NEW USE Customer NEW // IF Sales->(FLOCK()) ? "Sales используется другим пользователем" ENDIF
FOUND() --> признак завершения операции поиска
No arguments
FOUND() возвращает значение "истина" (.Т.), если последняя команда поиска была успешной, в противном случае - "ложь" (.F.).
FOUND() является функцией обработки баз данных, позволяющей определить, является ли операция поиска (выполняемая командами FIND, LOCATE, CONTINUE, SEEK, SET RELATION) успешной. По выполнении какой-либо из этих команд, FOUND() устанавливает значение "истина"(.Т.), если поиск был успешным; в противном случае она возвращает значение "ложь"(.F.).
Если командами поиска являются LOCATE или CONTINUE, их завершение считается успешным, если они встретят следующую запись, совпадающую с условием поиска в заданной группе. Если командами поиска являются FIND, SEEK или SET RELATION, их завершение считается успешным, когда будет найден первый ключ в управляющем индексе, совпадающий с заданным аргументом поиска. Если команда SET SOFTSEEK устанавливает режим ON, указатель записи перемещается на запись, значение ключа которой больше, чем аргумент поиска или равно ему. Если значение ключа равно аргументу поиска, FOUND() принимает значение "истина"(.Т.); в противном случае, она принимает значение "ложь"(.F.).
Значение функции FOUND() сохраняется до тех пор, пока не выполнится другая команда по перемещению указателя записи. Если эта команда не является командой поиска, функция FOUND() автоматически принимает значение "ложь"(.F.).
Для каждой рабочей области можно получить значение функции FOUND(). Это означает, что если какая-либо рабочая область связана отношением с дочерней рабочей областью при помощи команды SET RELATION, запрос FOUND() для дочерней рабочей области возвратит значение "истина"(.Т.) в том случае, если поиск был успешным.
По умолчанию функция FOUND() анализирует активную рабочую область. Однако для анализа необходимо включить ее в уточненное алиасом выражение (см. пример ниже).
В следующем примере иллюстрируется поведение FOUND() после команд перемещения указателя записи: USE Sales INDEX Sales ? INDEXKEY(0) // Результат: SALESMAN SEEK "1000" ? FOUND() // Результат: .F. SEEK "100" ? FOUND() // Результат: .T. SKIP ? FOUND() // Результат: .F. В следующем примере показано использование FOUND() для анализа в пассивной рабочей области с помощью выражения, уточненного алиасом: USE Sales INDEX Sales NEW USE Customer INDEX Customer NEW SET RELATION TO CustNum INTO Sales // SEEK "Smith" ? FOUND(), Sales->(FOUND()) В примере показано, как фрагмент кода обрабатывает все записи Customer со значением ключа "Smith", используя FOUND(), чтобы определить, когда меняется значение ключа: USE Customer INDEX Customer NEW SEEK "Smith" DO WHILE FOUND() . . <операторы> . SKIP LOCATE REST WHILE Name = "Smith" ENDDO
HEADER() --> количество байтов
No arguments
HEADER() возвращает количество байтов заголовка текущего файла базы данных в виде целого арифметического значения.
HEADER() - это функция обработки базы данных, которая используется вместе с функциями LASTREC(), RECSIZE() и DISKSPACE() для создания процедур сохранения файлов.
По умолчанию HEADER() оперирует с текущей (активной) рабочей областью. Для того, чтобы функция могла оперировать с пассивной рабочей областью, необходимо включить ее как элемент в выражение, уточненное алиасом (смотрите пример ниже).
Этот пример определяет размер заголовка файла SALES.dbf: USE Sales NEW ? HEADER() // Результат: 258 Этот пример определяет псевдо-функцию DbfSize(), которая использует HEADER() в сочетании с RECSIZE() и LASTREC() для вычисления длины в байтах текущего файла базы данных: #define DbfSize() ((RECSIZE() * LASTREC()) + HEADER() + 1) Позже можно использовать DbfSize() так же, как любую другую функцию: USE Sales NEW USE Customer NEW ? DbfSize() ? Sales -> (DbfSize())
INDEXEXT() --> расширение имени индекса
No arguments
Пока не скомпонован другой драйвер базы данных, INDEXEXT() возвращает значение ".NTX.", означающее, что по умолчанию действует штатный драйвер xClipper. Если скомпонован драйвер баз данных, совместимых с dBASEIII PLUS, функция возвратит значение ".NDX.".
INDEXEXT() возвращает расширение имени индексного файла, принятое по умолчанию определяя, какой драйвер базы данных скомпонован в текущий момент.
В этом примере INDEXEXT() используется для проверки на существование индексного файла Customer независимо от того, какой драйвер используется в текущей программе: USE Customer NEW // IF .NOT. FILE("Customer" + INDEXEXT()) INDEX ON CustName TO Customer ENDIF
INDEXKEY(<номер индекса>) --> выражение ключа
INDEXKEY() возвращает ключевое выражение для заданного индекса в виде символьной строки. Если соответствующего индекса нет, то INDEXKEY() возвращает пустую строку ("").
INDEXKEY() - это функция обработки баз данных, определяющая ключевое выражение заданного индекса в текущей рабочей области и возвращающая его как символьную строку. Для расчета ключевого выражения задайте INDEXKEY() как макровыражение:
INDEXKEY(<номер индекса>).
INDEXKEY() имеет ряд приложений, но на ум сразу же приходят два специфических примера. Используя INDEXKEY(), вы можете выполнить команду TOTAL по ключевому выражению управляющего индекса, не задавая ключевого выражения в исходном тексте. Другой пример вы найдете, рассматривая функцию пользователя DBEDIT(). Здесь вы можете определить, обновлять экран или нет после того, как пользователь отредактирует запись. Обычно необходимо обновить экран только если изменилось ключевое выражение управляющего индекса для текущей записи. Оба эти примера иллюстрируются ниже.
По умолчанию INDEXKEY() действует в выбранной (активной) в текущий момент рабочей области. Можно сделать так, чтобы эта функция действовала в пассивной рабочей области, используя ее как элемент выражения, уточненного алиасом( смотри пример ниже ).
Этот пример демонстрирует, как получить доступ к ключевым выражениям индексов, открытых в текущей рабочей области: #define ORD_NATURAL 0 #define ORD_NAME 1 #define ORD_SERIAL 2 // USE Customer INDEX Name, Serial NEW SET ORDER TO ORD_SERIAL ? INDEXKEY(ORD_NAME) // Результат: Name index exp ? INDEXKEY(ORD_SERIAL) // Результат: Serial index exp ? INDEXKEY(ORD_NATURAL) // Результат: Serial index exp Этот пример показывает, как получить доступ к ключевому выражению управляющего индекса в пассивной рабочей области: USE Customer INDEX Name, Serial NEW USE Sales INDEX Salesman NEW INDEXKEY(0), Customer-> (INDEXKEY(0)) Этот пример иллюстрирует использование INDEXKEY() в качестве части ключевого выражения в команде TOTAL. Заметим, что INDEXKEY() задана с использованием макровыражения, чтобы вызвать вычисление этого выражения: USE Sales INDEX Salesman NEW TOTAL ON &(INDEXKEY(0)) FIELDS SaleAmount TO SalesSummary Этот пример демонстрирует, как можно использовать функцию INDEXKEY() для определения, должен ли обновляться экран в процессе выполнения функции DBEDIT() после того, как пользователь отредактировал текущее значение поля. Обычно необходимо обновлять экран, если пользователь заменяет поле, которое является частью управляющего индексного ключа. FieldEdit() - это функция пользователя, которая может быть вызвана из функции пользователя DBEDIT(), чтобы отредактировать текущее поле, если пользователь нажал редактирующую клавишу : #include "Dbedit.ch" #define ORD_NATURAL 0 // FUNCTION FieldEdit() LOCAL indexVal // Сохранить текущее значение выражения ключа // и его значение indexVal = &(INDEXKEY(ORD_NATURAL)) . . <команды ввода значения в текущее поле> . // Обновить экран, если изменено значение ключа IF indexVal != &(INDEXKEY(ORD_NATURAL)) nRequest = DE_REFRESH ELSE nRequest = DE_CONT ENDIF RETURN nRequest
INDEXORD() --> порядковый номер
No arguments
INDEXORD() возвращает целое числовые значение. Возвращаемое значение равно позиции управляющего индекса в списке открытых в текущей рабочей области индексов. Нулевое значение указывает, что управляющего индекса нет, и записи доступны в естественном порядке.
INDEXORD() - это функция базы данных, которая может быть использована для определения позиции управляющего индекса в списке индексных файлов, открытых в текущей рабочей области при последнем выполнении команд USE...INDEX или SET INDEX TO. Часто бывает полезным сохранить последний управляющий индекс, чтобы можно было восстановить его позже.
По умолчанию INDEXORD() оперирует в выбранной текущей (активной) рабочей области. Можно сделать так, чтобы эта функция оперировала с пассивной рабочей областью, используя ее как элемент выражения, уточненного алиасом (смотрите пример ниже).
Этот пример использует функцию INDEXORD() для сохранения порядкового номера текущего индекса. После изменения на новый индекс сохраненное значение используется для восстановления первоначального индекса: USE Customer INDEX Name, Serial NEW nOrder := INDEXORD() // Результат: 1 SET ORDER TO 2 ? INDEXORD() // Результат: 2 SET ORDER TO nOrder ? INDEXORD() // Результат: 1 Этот пример использует уточненное алиасом выражение для определения порядкового номера управляющего индекса в пассивной рабочей области: USE Sales INDEX Salesman, CustNum NEW USE Customer INDEX Name, Serial NEW ? Sales --> (INDEXORD()) // Результат: 1
LASTREC() | RECCOUNT()* --> число записей
No arguments
LASTREC() возвращает число физических записей в текущей базе данных в виде целого числа. Команды установки фильтров - такие, как SET FILTER или SET DELETED, на результат влияния не оказывают. LASTREC() возвращает 0, если в текущей рабочей области нет открытой базы данных.
LASTREC() является функцией обработки баз данных, которая возвращает количество физических записей в текущем файле базы данных. LASTREC() аналогична RECCOUNT(), которая оставлена для совместимости с программами, разработанными на предыдущих версиях xClipper .
По умолчанию LASTREC() работает с текущей (активной) рабочей областью. Однако она может работать и с пассивной рабочей областью, если ее включить в выражение, уточненное алиасом (смотрите пример ниже).
Этот пример иллюстрирует взаимоотношения между функциями LASTREC(), RECCOUNT() и командой COUNT: USE Sales NEW ? LASTREC(), RECCOUNT() // Результат: 84 84 // SET FILTER TO Salesman = "1001" COUNT TO nRecords ? nRecords, LASTREC() // Результат: 14 84 В этом примере определяется количество записей в файле базы данных в пассивной рабочей области при помощи выражения, уточненного алиасом: USE Sales NEW USE Customer NEW ? LASTREC(), Sales->(LASTREC())
LUPDATE() --> дата модификации
No arguments
LUPDATE() возвращает дату последнего изменения файла базы данных, открытого в текущей рабочей области. Если нет открытого файла базы данных, то LUPDATE() возвращает пустую дату.
LUPDATE() является функцией обработки баз данных, которая определяет дату последнего изменения файла базы данных в текущей рабочей области. По умолчанию LUPDATE() обращается к текущей (активной) рабочей области.
Она может обращаться и к пассивной рабочей области, если ее включить в выражение, уточненное алиасом, как показано в примере .
Этот пример демонстрирует тот факт, что изменение файла базы данных не меняет дату его корректировки до закрытия: ? DATE() // Результат: 09/01/90 USE Sales NEW ? LUPDATE() // Результат: 08/31/90 // APPEND BLANK ? LUPDATE() // Результат: 08/31/90 CLOSE DATABASES // USE Sales NEW ? LUPDATE() // Результат: 09/01/90 Этот пример иллюстрирует использование выражения, уточненного алиасом, для обращения к файлу базы данных, открытому вне текущей рабочей области: USE Sales NEW USE Customer NEW ? LUPDATE(), Sales->(LUPDATE())
ORDBAGEXT() --> cBagExt
No arguments
ORDBAGEXT() returns a character expression.
ORDBAGEXT() is an order management function that returns a character expression that is the default order bag extension of the current or aliased work area. cBagExt is determined by the RDD active in the current work area.
ORDBAGNAME(<nOrder> | <cOrderName>) --> cOrderBagName
ORDBAGNAME() returns a character string, the order bag name of the specific order.
ORDBAGNAME() is an order management function that lets you access the name of the order bag in which <cOrderName> resides. You may identify the order as a character string or with an integer that represents its position in the order list. In case of duplicate names, ORDBAGNAME() only recognizes the first matching name.
Note: ORDBAGNAME(0) works as ORDBAGNAME(INDEXORD())
ORDLISTADD(<cOrderBagName> [, <cOrderName>]) --> NIL
<cOrderBagName> | is the name of a disk file containing one or more |
orders. You may specify <cOrderBagName> as the file name with or | |
without the path name or appropriate extension. If you do not include | |
the extension as part of <cOrderBagName>, xClipper uses the default | |
extension of the current RDD. | |
<cOrderName> | the name of the specific order from the order bag to be |
added to the order list of the current work area. If you do not specify | |
<cOrderName> | , all orders in the order bag are added to the order list of |
the current work area. |
ORDLISTADD() always returns NIL.
ORDLISTADD() is an order management function that adds the contents of an order bag, or a single order in an order bag, to the order list. This function lets you extend the order list without issuing a SET INDEX command that, first, clears all the active orders from the order list.
Any orders already associated with the work area continue to be active. If the newly opened order bag contains the only order associated with the work area, it becomes the controlling order; otherwise, the controlling order remains unchanged.
After the new orders are opened, the work area is positioned to the first logical record in the controlling order.
ORDLISTADD() is similar to the SET INDEX command or the INDEX clause of the USE command, except that it does not clear the order list prior to adding the new order(s).
ORDLISTADD() supersedes the DBSETINDEX() function.
The active RDD determines the order capacity of an order bag. The default DBFNTX and the DBFNDX drivers only support single-order bags, while other RDDs may support multiple-order bags (e.g., the DBFCDX driver). When using RDDs that support multiple-order bags, you must explicitly SET ORDER (or ORDSETFOCUS()) to the desired controlling order. If you do not specify a controlling order, the data file will be viewed in first order.
RECCOUNT() | LASTREC() --> количество записей
No arguments
RECCOUNT() возвращает количество физических записей в текущем файле базы данных в виде целого числа. Команды установки фильтров, такие как SET FILTER или SET DELETED, не влияют на возвращаемое значение. RECCOUNT() возвращает ноль, если в текущей рабочей области нет открытого файла базы данных.
RECCOUNT() - функция обработки баз данных, являющаяся синонимом функции LASTREC(). По умолчанию RECCOUNT() обрабатывает файл активной рабочей области. Однако при помощи LASTREC() можно обрабатывать и файлы пассивных рабочих областей. Для этого необходимо использовать ее в качестве элемента выражения, уточненного алиасом (смотрите пример ниже).
Этот пример иллюстрирует сходство и различие между командой COUNT и функцией RECCOUNT(): USE Sales NEW ? RECCOUNT() // Результат: 84 // SET FILTER TO Salesman = "1001" COUNT TO nRecords ? nRecords // Результат: 14 ? RECCOUNT() // Результат: 84 Этот пример показывает, как получить доступ к записям в пассивной рабочей области с помощью выражения, уточненного алиасом: USE Sales NEW USE Customer NEW ? RECCOUNT(), Sales->(RECCOUNT())
RECNO() --> номер текущей записи
No arguments
RECNO() возвращает номер текущей записи в виде целого числа. Если в рабочей области содержится файл базы данных с нулевыми количеством записей, RECNO() возвращает (1), BOF() и EOF() возвращают значение "истина" (.Т.), LASTREC() возвращает ноль.
Если указатель записи перемещается за последнюю запись, то RECNO() возвращает значение (LASTREC()+1), а EOF() - значение "истина" (.T.). При попытке установить указатель записи перед первой записью, функция RECNO() возвращает номер первой логической записи, а BOF() возвращает значение "истина"(.Т.).
RECNO() - это функция обработки баз данных, которая возвращает текущий номер записи в рабочей области. В файловой схеме базы данных xClipper каждый файл базы данных упорядочен по физическим номерам записей. В каждой рабочей области указатель записи выделяет текущую запись в открытом файле базы данных. Этот номер записи и возвращает функция RECNO(). Организация нумерации записей позволяет осуществлять прямой доступ к каждой записи без последовательного просмотра всего файла базы данных.
RECNO() обычно используется в программах, которые обрабатывают записи, выбирая их по номерам. Примером может служить команда SET RELATION... TO RECNO(), связывающая файлы баз данных по их номерам записей. Команду GO RECNO() также можно использовать для восстановления текущей записи с диска.
По умолчанию RECNO() обрабатывает текущую (активную) рабочую область. Для обработки пассивной рабочей области ее необходимо использовать как элемент выражения, уточненного алиасом (как показано в примере ниже).
RECSIZE() --> количество байтов
No arguments
RECSIZE() возвращает длину записи в байтах файла базы данных, открытого в текущей рабочей области в виде целого числа. Если не существует открытого файла базы данных, то RECSIZE() возвращает ноль.
RECSIZE() - функция обработки баз данных, которая определяет длину записи суммированием длин всех полей и затем добавлением к ним длины поля флажка признака удаления, используемого функцией DELETED(). Значение RECSIZE(), умноженное на значение функции LASTREC(), определяет количество байтов, занимаемое записями файла.
RECSIZE() полезна в программах, выполняющих автоматическое резервирование файлов. При ее использовании в сочетании с функцией DISKSPACE() RECSIZE() помогает убедиться в том, что имеется достаточно свободного места на диске для записи файла.
По умолчанию RECSIZE() обрабатывет текущую (активную) рабочую область. Для обработки пассивной рабочей области ее необходимо использовать как выражение, уточненное алиасом (см. пример ниже).
Функция пользователя DbfSize() использует RECSIZE() для вычисления размера текущего файла базы данных: FUNCTION DbfSize RETURN ((RECSIZE() * LASTREC()) + HEADER()) Этот пример иллюстрирует использование RECSIZE() для определения длины записи файлов базы данных, открытых в пассивной рабочей области: USE Customer NEW USE Sales NEW // ? RECSIZE(), Customer->(RECSIZE()) ? DbfSize(), Customer->(DbfSize())
RLOCK() --> признак завершения
No arguments
RLOCK() возвращает значение "истина"(.Т.), если блокирование текущей записи прошло успешно и "ложь"(.F.) - в противном случае.
RLOCK() - это функция работы в сети, применяемая для блокирования текущей записи и запрещающая другим пользователям обновлять запись до тех пор, пока она блокирована. RLOCK() осуществляет раздельную блокировку, предоставляя другим пользователям право только считывать данные блокированной записи и оставляя право изменять ее только за текущим пользователем. Запись остается блокированной до тех пор, пока не будет блокирована другая запись, выполнится команда UNLOCK, закроется текущий файл базы данных или будет выполнена функция FLOCK() для текущего файла базы данных.
При каждом вызове RLOCK() производится одна попытка блокировать текущую запись и результат возвращается в виде логического значения. Попытка блокировки считается неудачной, если в этот момент уже была выполнена блокировка файла или этой записи другим пользователем, или файл был открыт в режиме монопольного пользования (EXCLUSIVE USE).
По умолчанию RLOCK() обрабатывает текущую (активную) рабочую область. Функция может обрабатывать и пассивную рабочую область, если ее использовать как элемент выражения, уточненного алиасом (смотрите пример ниже). Эта возможность особенно полезна, поскольку RLOCK() автоматически не блокирует записи, логически связанные с записью активной рабочей области.
Как правило, RLOCK() используется для работы с текущей записью. При этом наиболее часто используемые команды:
@...GET
DELETE (единственная запись)
RECALL (единственная запись)
REPLACE (единственная запись)
За более подробной информацией обращайтесь к главе "Программирование в сети" книги "Программирование и утилиты".
Этот пример демонстрирует, как можно стереть записи в сетевой среде с использованием RLOCK(): USE Customer INDEX CustName SHARED NEW SEEK "Smith" IF FOUND() IF RLOCK() DELETE ? "Smith удален" ELSE ? "Запись используется другим пользователем" ENDIF ELSE ? "Smith не найден в базе Customer" ENDIF CLOSE Этот пример показывает, как задать RLOCK() в качестве алиасного выражения, чтобы блокировать запись в пассивной рабочей области: USE Sales SHARED NEW USE Customer SHARED NEW // IF !Sales->(RLOCK()) ? "Текущая запись базы Sales используется другим пользователем" ENDIF
SELECT([<алиас>]) --> номер рабочей области
SELECT() возвращает рабочую область заданного алиаса как целое числовое значение.
SELECT() является функцией работы с базами данных, которая определяет номер рабочей области по заданному алиасу. Возвращаемое число может быть в диапазоне от 0 до 250. Если аргумент <алиас> не задан, возвращается номер текущей (активной) рабочей области. Если значение аргумента <алиас> задано, но такого алиаса не существует, SELECT() возвращает ноль.
Примечание: Функция SELECT() и команда SELECT, заданная с помощью аргумента, заданного в виде выражения, в некоторой степени похожи друг на друга. Это не должно вызывать недоумений, поскольку функция SELECT(), как правило, не вызывается в виде команды на отдельной строке.
Этот пример показывает, как использовать SELECT(), чтобы определить, какая рабочая область USE...NEW выбрана: USE Sales NEW SELECT 1 ? SELECT("Sales") // Результат: 4 Для повторного выбора значения, возвращаемого из функции SELECT(), нужно использовать команду SELECT с синтаксисом SELECT(<имя поля>), как например: USE Sales NEW nWorkArea = SELECT() USE Customer NEW SELECT(nWorkArea)
USED() --> признак наличия открытой базы данных
No arguments
USED () возвращает значение "истина" (.Т.), если существует открытый файл базы данных; в противном случае она возвращает значение "ложь" (.F.).
USED () - функция работы с базами данных, которая используется для определения наличия открытого файла базы данных в текущей (активной) рабочей области. По умолчанию USED() анализирует текущую рабочую область. Однако функция USED() может анализировать и пассивные рабочие области, если ее использовать как элемент выражения, уточненного алиасом. ( Смотри пример ниже ).
Этот пример определяет, есть ли открытый файл базы данных в текущей рабочей области: USE Customer NEW ? USED() // Результат .Т. CLOSE ? USED() // Результат .F. Этот пример демонстрирует работу функции USED() в выражении, уточненном алиасом: USE Customer NEW USE Sales NEW USE Invoices NEW SELECT O // ? Customer --> (USED()) // Результат: .Т. ? Sales --> (USED()) // Результат: .Т. ? Invoices --> (USED()) // Результат: .Т. ? BackOrder --> (USED()) // Результат: .F.
Пред. | Начало | След. |
CONVERSION | Уровень выше | MISCELLANEOUS |