DATABASE

Name

DATABASE -- 

Function

nFields             AFIELDS([<aFieldNames>], [<aTypes>], [<aWidths>], [<aDecimals>])
cAlias              ALIAS([<nWorkArea>])
lBoundary           BOF()
lSuccess            BROWSE([<nTop>], [<nLeft>], [<nBottom>], [<nRight>])
NIL                 DBAPPEND([<lReleaseRecLocks>])
NIL                 DBCLEARFILTER()
NIL                 DBCLEARINDEX()
NIL                 DBCLEARRELATION()
NIL                 DBCLOSEALL()
NIL                 DBCLOSEAREA()
NIL                 DBCOMMIT()
NIL                 DBCOMMITALL()
NIL                 DBCREATE(<cDatabase>, <aStruct>,[<cDriver>])
NIL                 DBCREATEINDEX(<cIndexName>, <cKeyExpr>, [<bKeyExpr>], [<lUnique>])
NIL                 DBDELETE()
NIL                 DBEDIT([<nTop>], [<nLeft>], [<nBottom>], <nRight>], [<acColumns>], [<cUserFunction>], [<acColumnSayPictures> | <cColumnSayPicture>], [<acColumnHeaders> | <cColumnHeader>], [<acHeadingSeparators> | <cHeadingSeparator>], [<acColumnSeparators> | <cColumnSeparator>], [<acFootingSeparators> | <cFootingSeparator>], [<acColumnFootings> | <cColumnFooting>])
NIL                 DBEVAL(<bBlock>,[<bForCondition>],[<bWhileCondition>],[<nNextRecords>], [<nRecord>],[<lRest>])
cAlias              DBF()
cFilter             DBFILTER()
NIL                 DBGOBOTTOM()
NIL                 DBGOTO(<xIdentity>)
NIL                 DBGOTOP()
NIL                 DBRECALL()
NIL                 DBREINDEX()
cLinkExp            DBRELATION(<nRelation>)
nWorkArea           DBRSELECT(<nRelation>)
lFound              DBSEEK(<expKey>, [<lSoftSeek>], [<lLast>])
NIL                 DBSELECTAREA(<nArea> | <cAlias>)
cCurrentDriver      DBSETDRIVER([<cDriver>])
NIL                 DBSETFILTER(<bCondition>, [<cCondition>])
NIL                 DBSETINDEX(<cOrderBagName>)
NIL                 DBSETORDER(<nOrderNum>)
NIL                 DBSETRELATION(<nArea> | <cAlias>, <bExpr>, <cExpr>)
NIL                 DBSKIP([<nRecords>])
aStruct             DBSTRUCT()
NIL                 DBUNLOCK()
NIL                 DBUNLOCKALL()
NIL                 DBUSEAREA( [<lNewArea>], [<cDriver>], <cName>, [<xcAlias>], [<lShared>], [<lReadonly>])
<cPath>             DefPath()
lDeleted            DELETED()
ValueInverted       DESCEND(<exp>)
nOsCode             DOSERROR([<nNewOsCode>])
lBoundary           EOF()
nFields             FCOUNT()
nErrorCode          FERROR()
bFieldBlock         FIELDBLOCK(<cFieldName>)
ValueField          FIELDGET(<nField>)
cFieldName          FIELDNAME/FIELD(<nPosition>)
nFieldPos           FIELDPOS(<cFieldName>)
ValueAssigned       FIELDPUT(<nField>, <expAssign>)
bFieldWBlock        FIELDWBLOCK(<cFieldName>, <nWorkArea>)
lExists             FILE(<cFilespec>)
<aSelected>         __Fledit( <aSrc>, <aList>)
lSuccess            FLOCK()
lSuccess            FOUND()
nBytes              HEADER()
cExtension          INDEXEXT()
cKeyExp             INDEXKEY(<nOrder>)
nOrder              INDEXORD()
nRecords            LASTREC() | RECCOUNT()*
dModification       LUPDATE()
cTextBuffer         MEMOEDIT([<cString>], [<nTop>], [<nLeft>], [<nBottom>], [<nRight>], [<lEditMode>], [<cUserFunction>], [<nLineLength>], [<nTabSize>], [<nTextBufferRow>], [<nTextBufferColumn>], [<nWindowRow>], [<nWindowColumn>])
cString             MEMOREAD(<cFile>)
lSuccess            MEMOWRIT(<cFile>, <cString>)
lError              NETERR([<lNewError>])
cBagExt             ORDBAGEXT()
cOrderBagName       ORDBAGNAME(<nOrder> | <cOrderName>)
NIL                 ORDLISTADD(<cOrderBagName> [, <cOrderName>])
nRecords            RECCOUNT() | LASTREC()
Identity            RECNO()
nBytes              RECSIZE()
lSuccess            RLOCK()
nWorkArea           SELECT([<cAlias>])
lDbfOpen            USED()
<nCode>             WEIGHTASC(<sString>)
<sTable>            WEIGHTTABLE()

Description

Function AFIELDS()

  AFIELDS([<массив имен полей>], [<массив типов полей>],
 [<массив размеров полей>], [<массив размеров дробной части>])
 --> количество полей
 
 

AFIELDS() - функция, которая заполняет группу массивов информацией о структуре активного в данный момент файла базы данных; элементы массивов с одним номером содержат при этом информацию об одном поле. AFIELDS() во многом схожа с функцией ADIR(), заполняя группу созданных массивов информацией. Чтобы воспользоваться функцией AFIELDS(), нужно сначала создать массивы одинаковой длины, в которые будет занесена информация о структуре файла базы данных, при этом количество элементов в них должно соответствовать количеству полей в записи файла базы данных (т.е.FCOUNT()). После того, как эти массивы созданы, можно использовать AFIELDS() для заполнения их данными о полях файла базы данных.

По умолчанию AFIELDS() обрабатывает активную рабочую область, однако при помощи AFIELDS() можно обрабатывать и пассивную рабочую область. Для этого необходимо использовать уточненное алиасом выражение (см. пример ниже).

AFIELDS() - функция, используемая для связи с предыдущей версией xClipper. Она может быть заменена функцией DBSTRUCT(), которая не требует создания группы массивов перед ее использованием и возвращает многомерный массив, содержащий данные о структуре файла текущей базы данных.

<массив имен полей>

- массив, заполняемый именами полей. Каждый его элемент - строка символов.

<массив типов полей>

- массив, заполняемый информацией о типах соответствующих полей массива <массив имен полей>. Каждый его элемент - строка символов.

<массив размеров полей>

- массив, заполняемый информацией о размерах соответствующих полей массива <массив имен полей>. Содержит элементы арифметического типа.

<массив размеров дробной части>

- массив, заполняемый информацией о количестве дробных знаков, определенных для соответствующих полей массива <массив имен полей>. Каждый элемент - арифметического типа. Если тип поля не арифметический, значение соответствующего элемента в массиве <массив размеров дробной части> - ноль.

Returns :

AFIELDS() возвращает количество полей или длину наименьшего аргумента массива, смотря по тому, что меньше. Если не определено ни одного аргумента или не открыта ни одна база данных в текущей рабочей области, AFIELDS() возвращает ноль.

See also : ACHOICE() ADIR()* AEVAL() ASCAN() DBCREATE()

Function ALIAS()

 ALIAS([<номер рабочей области>]) --> алиас

ALIAS() - функция работы с базами данных, которую используют с целью определения алиаса для заданной рабочей области. Алиас - это имя, присвоенное рабочей области при открытии в ней базы данных. Этим именем может быть либо имя файла базы данных, либо имя, явно указанное в предложении ALIAS команды USE. Функция ALIAS() является обратной по действию функции SELECT(). ALIAS() возвращает алиас по заданному номеру рабочей области, тогда как функция SELECT() возвращает номер рабочей области по заданному алиасу.

Function BOF()

 BOF() --> признак начала файла

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

После того, как функцией BOF() будет установлено значение "истина" (.T.), оно остается до тех пор, пока не будет сделана очередная попытка передвижения указателя записи.

По умолчанию функция BOF() выполняется для текущей активной рабочей области. Однако ее можно применить и для пассивной рабочей области, используя ее в выражении, уточненном алиасом ( см. пример ниже ).

Команда SKIP является единственной командой, которая может установить значение BOF() "истина" (.T.).

Function BROWSE()

 BROWSE([<верхняя строка>],[<левая колонка>], [<нижняя строка>],[<правая колонка>]) --> NIL

BROWSE() - это функция для организации интерфейса с пользователем. Список клавиш управления курсором, используемых в функции, приведен в описании функции DBEDIT().

Function DBAPPEND()

 DBAPPEND() --> NIL

DBAPPEND() добавляет новую запись в файл базы данных в текущей рабочей области. Если запись добавлена успешно, то каждому полю записи присваивается пустое значение соответствующего типа данных, и новая запись становится текущей записью. DBAPPEND() выполняет те же функции, что и стандартная команда APPEND BLANK. Более подробную информацию смотрите в описании команды APPEND BLANK.

Function DBCLEARFILTER()

 DBCLEARFILTER() --> NIL

DBCLEARFILTER() снимает условие фильтрации, если оно установлено в текущей рабочей области.

DBCLEARFILTER() выполняет те же функции, что и стандартная команда SET FILTER TO без логического выражения. Более подробную информацию смотрите в команде SET FILTER.

Function DBCLEARINDEX()

 DBCLEARINDEX() --> NIL

DBCLEARINDEX() закрывает все активные индексные файлы в текущей рабочей области. Все обновленные данные записываются в индексные файлы, после чего они закрывается.

DBCLEARINDEX() выполняет те же функции, что и стандартная команда SET INDEX TO без определения индексного файла. Более подробную информацию смотрите в команде SET INDEX.

Function DBCLEARRELATION()

 DBCLEARRELATION() --> NIL

DBCLEARRELATION() уничтожает все активные связи для текущей рабочей области.

DBCLEARRELATION() выполняет те же функции, что и стандартная команда SET RELATION TO без аргументов. Более подробную информацию смотрите в описании команды SET RELATION.

Function DBCLOSEALL()

 DBCLOSEALL() --> NIL

DBCLOSEALL() закрывает все открытые рабочие области, запрещая их дальнейшее использование. Это эквивалентно вызову функции DBCLOSEAREA() для каждой рабочей области в отдельности.

DBCLOSEALL() имеет такой же эффект, что и стандартная команда CLOSE DATABASES. Более подробную информацию смотрите в описаниях команд USE и CLOSE.

Function DBCLOSEAREA()

 DBCLOSEAREA() --> NIL

DBCLOSEAREA() закрывает текущую рабочую область, возвращая системе освобождаемую область памяти. Все корректировки базы данных записываются на диск, блокировки снимаются, любые ресурсы, связанные с текущей рабочей областью, закрываются или освобождаются.

DBCLOSEAREA() эквивалентна стандартной команде CLOSE или команде USE без аргументов. Более подробную информацию смотрите в командах USE и CLOSE.

Function DBCOMMIT()

 DBCOMMIT() --> NIL

При вызове функции DBCOMMIT() все изменения в текущей рабочей области записываются из буферов на диск.

DBCOMMIT() - выполняет те же функции, что и стандартная команда COMMIT, кроме того, что действует только в текущей рабочей области. Более подробную информацию смотрите в команде COMMIT.

Function DBCOMMITALL()

 DBCOMMITALL() --> NIL

При вызове функции DBCOMMITALL() все изменения во всех рабочих областях записываются из буферов на диск. Это эквивалентно вызову функции DBCOMMIT() для каждой рабочей области.

Более подробная информация находится в описании функции DBCOMMIT() и команды COMMIT.

Function DBCREATE()

 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.

Function DBCREATEINDEX()

 DBCREATEINDEX( <имя индексного файла>,<ключевое выражение>
 ,[<блок кода>],[<признак индексации>] ) --> NIL

DBCREATEINDEX() создает индексный файл для базы данных, открытой в текущей рабочей области. Если в рабочей области уже открыты активные индексные файлы, то они закрываются. После того, как новый индексный файл создан, он становится управляющим индексом для рабочей области, и указатель записи перемещается на первую логическую запись.

DBCREATEINDEX() выполняет те же функции, что и стандартная команда INDEX. Более подробную информацию смотрите в команде INDEX.

Function DBDELETE()

 DBDELETE() --> NIL

DBDELETE() помечает текущую запись как удаленную. Записи, помеченные для удаления, могут быть отфильтрованы с помощью команды SET DELETE или удалены из файла командой PACK.

DBDELETE() выполняет те же функции, что и стандартная команда DELETE, область действия которой - текущая запись. Более подробную информацию смотрите в команде DELETE.

Function DBEDIT()

 DBEDIT([<верхняя строка>],[<левая колонка>],
 [<нижняя строка>],[<правая колонка>],
 [<массив колонок>],
 [<функция пользователя>],
 [<массив SAY-шаблонов>] | [<SAY-шаблон>],
 [<массив заголовков колонок>] | [<заголовок колонок>],
 [<массив гор. разделителей>] | [<гор. разделитель>],
 [<массив верт. разделителей>] | [<верт. разделитель>],
 [<массив под. разделителей>] | [<под. разделитель>],
 [<массив строк подписей>] | [<строка подписей>] ) --> NIL

DBEDIT() - это функция взаимодействия программы с пользователем, которая выдает информацию записей из одной или более рабочих областей в табличной форме. Окно для выдачи информации функцией DBEDIT() делится на ячейки, формирующие колонки и строки. Колонки соответствуют полям баз данных, строки соответствуют записям.

Каждая колонка определена элементом массива <массив колонок>. Ширина каждой колонки определяется значением соответствующего элемента <массив колонок> или заданным значением предложения PICTURE в массиве <массив SAY-шаблонов>.

DBEDIT() поддерживает все клавиши управления курсором, включая <PgDn>, <PgUp>, <Home>, <End>, четыре клавиши со стрелками и все комбинации клавиши <Ctrl>, при помощи которых осуществляется управление курсором. Список клавиш управления курсором, если не задана функция пользователя, представлен в таблице 5-8. Если задан аргумент, определяющий имя функции пользователя (<функция пользователя>), все клавиши, представленные в таблице 5-8 активны также в сочетании с клавишами <Esc> и <Enter>. Когда DBEDIT() вызывает функцию пользователя, ей автоматически передается два аргумента:

Текущий режим, передаваемый как арифметическое выражение.

Индекс текущей колонки в <массив колонок>, передаваемый как арифметическое значение.

Первый параметр определяет текущее состояние DBEDIT() в зависимости от последней нажатой клавиши. Перечень возможных состояний приведен в таблице 5-9.

Второй параметр указывает на позицию описания в массиве <массив колонок>. Если массив <массив колонок> не определен, параметр указывает на позицию поля в структуре текущей базы данных. Получить имя поля можно при помощи функции FIELDNAME().

Активные клавиши DBEDIT().
 ---------------------------------------------------------------------
 Ключ                       Действие
 ---------------------------------------------------------------------
 &lt;Стрелка вверх&gt;            Вверх на одну строку
 &lt;Стрелка вниз&gt;             Вниз на одну строку
 &lt;Стрелка влево&gt;            Влево на колонку
 &lt;Стрелка вправо&gt;           Вправо на колонку
 &lt;Ctrl&gt;-&lt;Стрелка влево&gt;     Влево в пределах колонки
 &lt;Ctrl&gt;-&lt;Стрелка вправо&gt;    Вправо в пределах колонки
 &lt;Home&gt;                     Крайняя левая колонка текущего экрана
 &lt;End&gt;                      Крайняя правая колонка текущего экрана
 &lt;Ctrl&gt;-&lt;Home&gt;              Крайняя левая колонка
 &lt;Ctrl&gt;-&lt;End&gt;               Крайняя правая колонка
 &lt;PgUp&gt;                     Предыдущий экран
 &lt;PgDn&gt;                     Следующий экран
 &lt;Ctrl&gt;-&lt;PgUp&gt;              Первая строка текущей колонки
 &lt;Ctrl&gt;-&lt;PgDn&gt;              Последняя строка колонки
 &lt;Enter&gt;                    Завершить DBEDIT()
 &lt;Esc&gt;                      Завершить 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(). Значения номеров строк могут изменяться в пределах от 0 до MAXROW(). Если эти параметры опущены, то по умолчанию принимается, что координаты окна - 0, 0, MAXROW() и MAXCOL().

<массив колонок>

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

<функция пользователя>

- имя функции пользователя, которой передается управление при нажатии неопределенной клавиши или если клавиша не нажата. Имя функции определяется в виде символьного выражения без круглых скобок и аргументов. Отметим, что поведение функции DBEDIT() зависит от того, определена функция пользователя или нет. Более подробно этот вопрос рассматривается ниже.

<массив SAY-шаблонов>

- это параллельный массив, содержащий предложения PICTURE для форматирования каждой колонки. Если определить <массив SAY-шаблонов> не в виде массива, а в виде строки (<SAY-шаблон>), информация всех колонок будет выводиться в одном и том же формате. Более подробная информация о предложении PICTURE находится в описании функции TRANSFORM() и команды @...SAY.

<массив заголовков колонок>

- параллельный массив, содержащий символьные выражения, которые определяют заголовки каждой колонки. Для выдачи заголовков для отдельных колонок необходимо включить точку с запятой в выражение заголовка там, где требуется разорвать последовательность. Если параметр не задан, заголовки колонок выбираются из массива <массив колонок> или заполняются именами полей текущей рабочей области, если массив <массив колонок> также не задан.

<массив гор. разделителей>

- параллельный массив, состоящий из символьных выражений, который определяет символы, используемые для рисования горизонтальных линий, отделяющих заголовки колонок от области выдачи информации полей. Если <гор. разделитель> задать не в виде массива, для отделения всех колонок будет использован один и тот же разделитель. Если аргумент не задан, по умолчанию принимается разделителем двойная линия.

<массив верт. разделителей>

- это параллельный массив, содержащий символьные выражения, символы, используемые для рисования вертикальных линий, разделяющих колонки. Если задать <верт. разделитель> не в виде массива, будет использован один и тот же разделитель для всех колонок. Если аргумент не задан, по умолчанию принимается вертикальная линия.

<массив под. разделителей>

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

<массив строк подписей>

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

Returns :

DBEDIT() всегда возвращает NIL.

See also : ACHOICE() BROWSE() MEMOEDIT() TRANSFORM()

Function DBEVAL()

 DBEVAL(<блок кода>,[<FOR-лог.условие>],[<WHILE-лог. условие>],
 [<к-во записей>],[<номер записи>],[<переключатель>]) --> NIL

DBEVAL() - это функция работы с базами данных, выполняющая блок кода для каждой записи, которая входит в определенную группу и (или) удовлетворяет заданному условию в текущей рабочей области. При каждой итерации DBEVAL() выполняет заданный блок. Все записи, входящие в группу или соответствующие условию, обрабатываются до тех пор, пока не будет достигнут конец файла. По умолчанию DBEVAL() работает с активной (текущей) рабочей областью. Однако можно заставить DBEVAL() работать с пассивной рабочей областью. Это достигается заданием выражения, уточненного алиасом. DBEVAL() работает аналогично функции AEVAL(), которая обрабатывает каждый элемент массива. Так же, как AEVAL(), DBEVAL() может быть использована в качестве примитива для построения команд пользователя, обрабатывающих файлы баз данных. Многие стандартные команды xClipper, обрабатывающие файлы баз данных, созданы с помощью DBEVAL().

Обратитесь к разделу "Блоки кода" в главе "Основные концепции" за более полной информацией по синтаксису и теории создания блоков кода. Обратитесь также к разделу "Система баз данных" в главе "Основные концепции" за более полной информацией о группировке записей и задании условий их выбора. Просмотрите стандартный файл описаний std.ch, находящийся в директории \include, куда включены примеры описаний стандартных команд обработки файлов баз данных xClipper, которые используют функцию DBEVAL().

<блок кода>

- это блок кода, выполняемый для каждой обрабатываемой записи.

<FOR-лог.условие>

- это необязательное условие, определенное как блок кода, который выполняется для каждой записи в группе. Он выполняет те же функции, что и предложение FOR в командах обработки записей.

<WHILE-лог. условие>

- это необязательное условие, определенное как блок кода, который выполняется для каждой записи, начиная с текущей и до тех пор, пока условие не примет значение "ложь" (.F.). Он выполняет те же функции, что и предложение WHILE в командах обработки записей.

<к-во записей>

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

<номер записи>

- это необязательный аргумент, определяющий номер обрабатываемой записи. Если этот параметр определен, блок кода выполняется для этой заданной записи. Он работает аналогично предложению RECORD.

<переключатель>

- это необязательный логический аргумент, определяющий, начинается ли группа записей, обрабатываемых DBEVAL(), с текущей записи и завершается в конце файла, или на обработку передается весь файл. Этот аргумент аналогичен предложению REST и ALL в командах обработки записей. Если его значение "истина" (.T.), то величина группы аналогична REST, в противном случае - ALL ( все записи). Если аргумент не задан, по умолчанию принимаются все записи файла.

Returns :

DBEVAL() всегда возвращает NIL.

See also : AEVAL() EVAL()

Example :

  Этот пример использует 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
 
 

Function DBF()

 DBF() --> алиас

DBF() - это функция, оставленная для совместимости с предыдущими версиями xClipper и функцией DBF() в xBASE. Она реализуется в xClipper при помощи включения в нее функции ALIAS() без аргументов, поэтому использование DBF() в новых программах не рекомендуется. Она должна быть заменена функцией ALIAS().

Function DBFILTER()

 DBFILTER() --> значение фильтра

DBFILTER() - это функция работы с базами данных, которая используется для сохранения и повторного выполнения активного фильтра путем возврата строки символов, представляющей собой выражение, которое определяет значение фильтра с последующей рекомпиляцией и выполнением его при помощи макрооператора (&). Эта функция работает аналогично функциям DBRELATION() и DBRSELECT(), которые используют для сохранения и повторного выполнения скомпонованного выражения отношения в рабочей области. Так как каждая рабочая область имеет активный фильтр, DBFILTER() может возвратить его значение для любой области. Это достигается путем включения DBFILTER() в выражение, уточненное алиасом, как показано ниже.

Function DBGOBOTTOM()

 DBGOBOTTOM() --> NIL

DBGOBOTTOM() Перемещает указатель на последнюю логическую запись в текущей рабочей области.

DBGOBOTTOM() выполняет те же функции, что и стандартная команда GO BOTTOM. Более подробную информацию смотрите в команде GO.

Function DBGOTO()

 DBGOTO(<номер записи>) --> NIL

DBGOTO() перемещает указатель на запись, номер которой равен <номер записи>. Если такой номер не существует, указатель устанавливается на запись LASTREC()+1, а значение, возвращаемое функциями как EOF(), так и BOF() - "истина" (.T.).

DBGOTO() выполняет те же функции, что и стандартная команда GO. Более подробную информацию смотрите в команде GO.

Function DBGOTOP()

 DBGOTOP() --> NIL

DBGOTOP() Перемещает указатель на первую логическую запись в текущей рабочей области.

DBGOTOP() выполняет те же функции, что и стандартная команда GO TOP. Более подробную информацию смотрите в команде GO.

Function DBRECALL()

 DBRECALL() --> NIL

DBRECALL() восстанавливает текущую запись, если она помечена для удаления.

DBRECALL() выполняет те же функции, что и стандартная команда RECALL. Более подробную информацию смотрите в команде RECALL.

Function DBREINDEX()

 DBREINDEX() --> NIL

DBREINDEX() заново строит все активные индексы в текущей рабочей области. После индексации указатель записи в текущей рабочей области устанавливается на первую логическую запись согласно управляющему индексу.

DBREINDEX() выполняет те же функции, что и стандартная команда REINDEX. Более подробную информацию смотрите в команде REINDEX.

Function DBRELATION()

 DBRELATION(<номер отношения>) --> выражение связи

DBRELATION() - это функция работы с базами данных, которая используется в комбинации с функцией DBRSELECT() для определения скомпонованного выражения и рабочей области действующего отношения, заданного командой SET RELATION. DBRELATION() возвращает скомпонованное выражение, определенное в предложении TO.

DBRSELECT() возвращает скомпонованную рабочую область такой, как она была определена в предложении INTO.

По умолчанию DBRELATION() выполняется для активной ( текущей ) рабочей области. Однако она может быть выполнена для пассивной рабочей области путем включения DBRELATION() в выражение, уточненное алиасом ( смотри пример ниже ).

Function DBRSELECT()

 DBRSELECT(<номер отношения>) --> номер рабочей области

DBRSELECT() - это функция работы с базами данных, которая используется в комбинации с функцией DBRELATION() для определения рабочей области и скомпонованного выражения действующего отношения, созданного командой SET RELATION. DBRSELECT() возвращает рабочую область, определенную в предложении INTO. DBRELATION() возвращает скомпонованное выражение, определенное в предложении TO. Для определения алиаса вместо номера рабочей области используйте выражение ALIAS( DBRSELECT( <номер отношения> )).

По умолчанию DBRSELECT() работает с текущей ( активной ) рабочей областью. Однако она может работать в пассивной рабочей области. Для этого необходимо включить DBRSELECT() в выражение, уточненное алиасом (смотри пример ниже).

Function DBSEEK()

 DBSEEK(<выражение поиска>,
 [<признак относительного поиска>]) --> признак завершения

DBSEEK() - перемещает указатель на первую логическую запись, ключевое значение которой равно <выражение поиска>. Если такая запись найдена, то она становится текущей записью, и DBSEEK() возвращает "истина" (.T.). В противном случае DBSEEK() возвращает "ложь" (.F.), а указатель перемещается следующим образом: при нормальном (не относительном) поиске указатель установится на записи с номером LASTREC() + 1, и функция EOF() возвратит "истина" (.T.). При относительном поиске указатель установится на первой записи, ключевое значение которой больше, чем заданное ключевое значение. Если такой записи не существует, указатель установится на записи с номером LASTREC()+1, и функция EOF() возвратит значение "истина" (.T.)

Функция DBSEEK() может применяться рабочей области, где есть активные индексы.

DBSEEK() выполняет те же функции, что и стандартная команда SEEK. Более подробную информацию смотрите в команде SEEK.

Function DBSELECTAREA()

 DBSELECTAREA(<номер рабочей области> | <алиас>)  --> NIL

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

Function DBSETDRIVER()

 DBSETDRIVER([<драйвер>]) --> текущий драйвер

DBSETDRIVER() устанавливает драйвер баз данных, используемый при активации новых рабочих областей без явно заданного драйвера. Если указанный драйвер недоступен, то функция не оказывает действия. DBSETDRIVER() - возвращает имя текущего драйвера баз данных, используемого по умолчанию при открытии баз данных.

Function DBSETFILTER()

 DBSETFILTER(<условие - блок кода>,[<текст условия>]) --> NIL

DBSETFILTER() устанавливает логическое условие фильтра для текущей рабочей области. Когда фильтр установлен, записи, не удовлетворяющие условию фильтра, логически не видны. То есть, операции, обрабатывающие логические записи, такие записи не рассматривают.

Выражение фильтра, задаваемое при вызове функции DBSETFILTER(), должно при вычислении для записей, удовлетворяющих условиям фильтра, давать результат "истина" (.T.) и "ложь" (.F.) в противном случае.

Выражение фильтра может быть представлено или как один блок кода <условие - блок кода>, или как блок кода и эквивалентный <текст условия>, выражающие одинаковые условия. Если второй аргумент отсутствует, то функция DBFILTER() будет возвращать пустую строку.

DBSETFILTER() выполняет те же функции, что и стандартная команда SET FILTER. Более подробную информацию смотрите в команде SET FILTER.

Function DBSETINDEX()

 DBSETINDEX( <имя индексного файла> ) --> NIL

DBSETINDEX() открывает индексный файл для текущей рабочей области. Любые индексные файлы, уже связанные с текущей рабочей областью, продолжают быть активными. Если заново открытый индекс является единственным индексом, связанным с рабочей областью, то он становится управляющим индексом, в противном случае, управляющий индекс не переназначается.

После открытия нового индекса указатель записей устанавливается на первую логическую запись в соответствии с управляющим индексом.

DBSETINDEX() выполняет те же функции, что и стандартная команда SET INDEX или предложение INDEX команды USE. Более подробную информацию смотрите в команде SET INDEX.

Function DBSETORDER()

 DBSETORDER( <номер индексного файла> ) --> NIL

DBSETORDER() определяет, какой из активных индексов текущей рабочей области является управляющим индексом. Управляющий индекс - это индекс, определяющий логический порядок записей в рабочей области.

Активные индексы пронумерованы от 1 до общего числа активных индексов, в порядке, в котором эти индексы были открыты. <номер индексного файла> определяет номер желаемого индекса.

DBSETORDER() выполняет те же функции, что и стандартная команда SET ORDER. Более подробную информацию смотрите в команде SET ORDER.

Function DBSETRELATION()

 DBSETRELATION( <номер области> | <алиас>,
 <выражение - блок кода>,
 [<текстовое выражение>] )   -->  NIL

DBSETRELATION() - связывает рабочую область, определенную при помощи <номер области> или <алиас> (дочернюю рабочую область) с текущей рабочей областью (родительская рабочая область). Все активные отношения связи остаются активными.

Установленная связь между двумя рабочими областями заставляет дочернюю рабочую область работать синхронно с родительской рабочей областью. Это достигается автоматическим перемещением указателя записей в дочерней рабочей области всякий раз, когда указатель в родительской рабочей области перемещается на новую запись. Если дочерняя рабочая область имеет активный индекс, то перемещение указателя в родительской рабочей области заставляет автоматически работать команду SEEK в дочерней рабочей области. При этом ключ поиска является результатом вычисления заданного <выражение - блок кода>. Если дочерняя рабочая область не имеет активного индекса, то перемещение указателя в родительской рабочей области заставляет автоматически работать команду GOTO в дочерней рабочей области. При этом номер записи для GOTO является результатом вычисления <выражение - блок кода>.

Выражение отношения может быть задано или как одно <выражение - блок кода>, или как два аргумента: <выражение - блок кода> и эквивалентный ему <текст выражения>. Если текстовый вариант не задан, то функция DBRELATION() будет возвращать пустую строку.

DBSETRELATION() выполняет те же функции, что и стандартная команда SET RELATION с предложением ADDITIVE. Более подробную информацию смотрите в команде SET RELATION.

Function DBSKIP()

 DBSKIP(<кол-во записей>) --> NIL

DBSKIP() перемещает указатель вперед или назад относительно текущей записи. При попытке передвинуть указатель вперед за последнюю запись указатель установится в позиции LASTREC()+1, и функция EOF() возвратит значение "истина" (.T.). При попытке передвинуть указатель назад за первую запись указатель установится на первую запись, и функция BOF() возвратит значение "истина" (.T.).

DBSKIP() выполняет те же функции, что и стандартная команда SKIP. Более подробную информацию смотрите в команде SKIP.

Function DBSTRUCT()

 DBSTRUCT() -> массив, содержащий структуру

DBSTRUCT() - это функция работы с базами данных, функционирующая подобно команде COPY STRUCTURE EXTENDED. Однако первая создает массив с данными о структуре файла, а вторая - файл базы данных. Есть еще одна функция DBCREATE(), которая может создавать файл базы данных по информации о структуре из массива.

По умолчанию DBSTRUCT() работает с активной (текущей) рабочей областью. Однако она может работать и с пассивной рабочей областью, если включить ее в выражение, уточненное алиасом, как показано ниже.

Для облегчения работы в комплект поставки xClipper входит файл описаний dbstruct.ch, размещаемый в директории \include, в котором определены константы описания атрибутов каждого поля.

Function DBUNLOCK()

 DBUNLOCK() --> NIL

DBUNLOCK() снимает блокировку записи или всей базы данных, установленную текущим процессом в текущей рабочей области. DBUNLOCK() используется только для баз данных, открытых для совместного использования в сетевой среде.

DBUNLOCK() выполняет те же функции, что и стандартная команда UNLOCK. Более подробную информацию смотрите в команде UNLOCK.

Function DBUNLOCKALL()

 DBUNLOCKALL() --> NIL

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

DBUNLOCKALL() выполняет те же функции, что и стандартная команда UNLOCK ALL. Более подробную информацию смотрите в команде UNLOCK ALL.

Function DBUSEAREA()

 DBUSEAREA( [<признак новой области>], [<драйвер>], <имя>,
 [<алиас>], [<совместный доступ>],
 [<только чтение>] )  --> NIL

DBUSEAREA() открывает базу данных (.dbf-файл) в текущей или новой рабочей области.

DBUSEAREA() выполняет те же функции, что и стандартная команда USE. Более подробную информацию смотрите в команде USE.

<признак новой области>

- необязательное логическое значение. Значение "истина" (.T.) определяет, что текущей рабочей областью перед открытием базы данных становится неиспользуемая рабочая область с наименьшим номером. Если <признак новой области> - "ложь" (.F.) или опущен, используется текущая рабочая область. Если в этой рабочей области уже есть открытый файл базы данных, то он закрывается.

<драйвер>

- необязательная символьная величина. Если присутствует, то она определяет имя драйвера баз данных, который будет использоваться в рабочей области. Если <драйвер> опущен, то по умолчанию используется текущий драйвер (см. замечание ниже).

<имя>

- определяет имя открываемой базы данных (.dbf).

<алиас>

- необязательная символьная величина. Если присутствует, то она определяет алиас, связанный с рабочей областью. Алиас должен быть допустимым в xClipper идентификатором. Если <алиас> опущен, то значение алиаса такое же, как <имя>.

<совместный доступ>

- необязательная логическая величина. Если аргумент присутствует, то он определяет, открывается ли база данных в режиме доступности для других процессов в сети. Значение "истина" (.T.) определяет, что другие процессы могут иметь доступ, а значение "ложь" (.F.) определяет, что текущий процесс должен иметь монопольный доступ. Если <совместный доступ> опущен, то текущая глобальная установка _SET_EXLUSIVE определяет, разрешен ли совместный доступ к файлам баз данных.

<только чтение>

- необязательная логическая величина, которая определяет, запрещены ли изменения данных в рабочей области. Значение "истина" (.T.) определяет запрет изменений, а "ложь" (.F.) - разрешение. Если аргумент <только чтение> опущен, то предполагается значение "ложь" (.F.).

Returns :

DBUSEAREA() всегда возвращает NIL.

See also : DBCLOSEAREA() DBSETDRIVER() SELECT() SET()

Function DELETED()

 DELETED() --> признак удаления

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

По умолчанию DELETED() работает с текущей (активной) рабочей областью. Однако она может работать и с пассивной рабочей областью, если DELETED() поместить в выражение, уточненное алиасом (смотри пример ниже).

В программах функция DELETED() чаще всего используется для получения признака удаления записи как части условия обработки записей или для выдачи признака удаления как части экранной информации или данных отчетов.

Function DESCEND()

 DESCEND(<выражение>) --> дополнение выражения

DESCEND() - функция преобразования данных, которая возвращает значение аргумента <выражение> в форме дополнения. Значение аргумента используется в сочетании с командой INDEX для создания индексов, сортирующих данные по убыванию. Это достигается тем, что ту часть выражения в индексе, которая должна сортировать по убыванию значений, представляют как аргумент функции DESCEND(). При последующем поиске при помощи команды SEEK, DESCEND() включается в выражение поиска.

Function EOF()

 EOF() --> признак конца файла

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() должна быть частью выражения, уточненного алиасом (смотри пример ниже).

Function FCOUNT()

 FCOUNT() --> число полей

FCOUNT() является функцией базы данных. Она используется в прикладных программах, настраиваемых на базы данных с разной структурой записей. К их числу относятся программы с настраиваемым вводом/выводом и программы отчетов.

Обычно функция FCOUNT() используется для установления верхнего предела для цикла FOR...NEXT или DO WHILE, который обрабатывает один файл за один раз. По умолчанию FCOUNT() обрабатывает файл в текущей (активной) рабочей области. Но если ее использовать как элемент выражения, уточненного алиасом, можно получить данные о количестве полей записи файла базы данных в пассивной рабочей области.

Function FIELDGET()

 FIELDGET(<номер поля>)  --> значение поля

FIELDGET() - функция баз данных, возвращающая значение поля, указанного его порядковым номером в структуре базы данных. Это позволяет, кроме всего прочего, получать значение поля без использования оператора макроподстановки.

Function FIELDNAME()

 FIELDNAME(<номер позиции>) --> имя поля

FIELDNAME() является функцией обработки баз данных. Она возвращает имя поля, порядковый номер которого в структуре записи соответствует позиции, заданной в качестве его индекса.

Обычно она используется в прикладных программах, когда неизвестны имена полей. Если требуется получить имена сразу нескольких полей, удобнее использовать функцию AFIELDS(), так как она создает массив с именами полей, или команду COPY STRUCTURE EXTENDED, создающую базу данных с информацией о полях.

Если необходима дополнительная информация о структуре файла базы данных для совместной обработки, можно использовать функции TYPE() и LEN(). Для получения количества цифр после десятичной запятой в числовых полях, можно использовать следующее выражение:

LEN(SUBSTR(STR(<имя поля>), RAT(".", STR(<имя поля>)) + 1))

По умолчанию функция FIELDNAME() обрабатывает файл в текущей (активной) рабочей области. Однако для обработки файла в пассивной рабочей области необходимо ее включить в уточненное алиасом выражение, как показано в примере ниже.

Function FIELDPOS()

 FIELDPOS(<имя поля>)  --> номер поля

FIELDPOS() - функция баз данных, являющаяся обратной функциям FIELD() или FIELDNAME(), и возвращающая имя поля по его номеру в списке полей рабочей области. FIELDPOS() наиболее часто используется в сочетании с функциями FIELDPUT() и FIELDGET().

Как и другие функции баз данных, FIELDPOS() может использоваться для возвращения имени поля в любой невыбранной рабочей области, используя функцию с алиасным выражением. Смотрите пример ниже

Function FIELDPUT()

 FIELDPUT(<номер поля>,<выражение>)  --> присвоенное значение

FIELDPUT() - функция баз данных, присваивающая значение <выражение> полю с порядковым номером <номер поля> в базе данных текущей рабочей области. Использование номера поля, а не его имени, позволяет, кроме всего прочего, получать значение без использования операции макроподстановки.

Function FLOCK()

 FLOCK() --> признак завершения

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() действует в текущей (активной) рабочей области, но может действовать и в пассивной рабочей области путем включения ее в выражение, уточненное алиасом, как показано в примере, приведенном ниже.

Function FOUND()

 FOUND() --> признак завершения операции поиска

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() анализирует активную рабочую область. Однако для анализа необходимо включить ее в уточненное алиасом выражение (см. пример ниже).

Function HEADER()

 HEADER() --> количество байтов

HEADER() - это функция обработки базы данных, которая используется вместе с функциями LASTREC(), RECSIZE() и DISKSPACE() для создания процедур сохранения файлов.

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

Function INDEXEXT()

 INDEXEXT() --> расширение имени индекса

INDEXEXT() возвращает расширение имени индексного файла, принятое по умолчанию определяя, какой драйвер базы данных скомпонован в текущий момент.

Function INDEXKEY()

 INDEXKEY(<номер индекса>) --> выражение ключа

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

INDEXKEY(<номер индекса>).

INDEXKEY() имеет ряд приложений, но на ум сразу же приходят два специфических примера. Используя INDEXKEY(), вы можете выполнить команду TOTAL по ключевому выражению управляющего индекса, не задавая ключевого выражения в исходном тексте. Другой пример вы найдете, рассматривая функцию пользователя DBEDIT(). Здесь вы можете определить, обновлять экран или нет после того, как пользователь отредактирует запись. Обычно необходимо обновить экран только если изменилось ключевое выражение управляющего индекса для текущей записи. Оба эти примера иллюстрируются ниже.

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

Example :

 Этот пример демонстрирует, как получить доступ к ключевым
 выражениям индексов, открытых в текущей рабочей области:
 
 #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 &amp;(INDEXKEY(0)) FIELDS SaleAmount TO SalesSummary
 
 Этот пример демонстрирует, как можно использовать функцию
 INDEXKEY() для определения, должен ли обновляться экран в процессе
 выполнения функции DBEDIT() после того, как пользователь
 отредактировал текущее значение поля.  Обычно необходимо обновлять
 экран, если пользователь заменяет поле, которое является частью
 управляющего индексного ключа. FieldEdit() - это функция
 пользователя, которая может быть вызвана из функции пользователя
 DBEDIT(), чтобы отредактировать текущее поле, если пользователь
 нажал редактирующую клавишу :
 
 #include "Dbedit.ch"
 #define ORD_NATURAL 0
 //
 FUNCTION FieldEdit()
 LOCAL indexVal
 // Сохранить текущее значение выражения ключа
 // и его значение
 indexVal = &amp;(INDEXKEY(ORD_NATURAL))
 .
 . <команды ввода значения в текущее поле>
 .
 // Обновить экран, если изменено значение ключа
 IF indexVal != &amp;(INDEXKEY(ORD_NATURAL))
 nRequest = DE_REFRESH
 ELSE
 nRequest = DE_CONT
 ENDIF
 RETURN nRequest

Function INDEXORD()

 INDEXORD() --> порядковый номер

INDEXORD() - это функция базы данных, которая может быть использована для определения позиции управляющего индекса в списке индексных файлов, открытых в текущей рабочей области при последнем выполнении команд USE...INDEX или SET INDEX TO. Часто бывает полезным сохранить последний управляющий индекс, чтобы можно было восстановить его позже.

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

Function LASTREC()

 LASTREC() | RECCOUNT()* --> число записей

LASTREC() является функцией обработки баз данных, которая возвращает количество физических записей в текущем файле базы данных. LASTREC() аналогична RECCOUNT(), которая оставлена для совместимости с программами, разработанными на предыдущих версиях xClipper .

По умолчанию LASTREC() работает с текущей (активной) рабочей областью. Однако она может работать и с пассивной рабочей областью, если ее включить в выражение, уточненное алиасом (смотрите пример ниже).

Function LUPDATE()

 LUPDATE() --> дата модификации

LUPDATE() является функцией обработки баз данных, которая определяет дату последнего изменения файла базы данных в текущей рабочей области. По умолчанию LUPDATE() обращается к текущей (активной) рабочей области.

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

Function ORDBAGEXT()

 ORDBAGEXT() --> cBagExt

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.

Function ORDBAGNAME()

 ORDBAGNAME(<nOrder> | <cOrderName>) --> cOrderBagName

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())

Function ORDLISTADD()

 ORDLISTADD(<cOrderBagName> [, <cOrderName>]) --> 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.

Function RECCOUNT()

 RECCOUNT() | LASTREC() --> количество записей

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

Function RECNO()

 RECNO() --> номер текущей записи

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

RECNO() обычно используется в программах, которые обрабатывают записи, выбирая их по номерам. Примером может служить команда SET RELATION... TO RECNO(), связывающая файлы баз данных по их номерам записей. Команду GO RECNO() также можно использовать для восстановления текущей записи с диска.

По умолчанию RECNO() обрабатывает текущую (активную) рабочую область. Для обработки пассивной рабочей области ее необходимо использовать как элемент выражения, уточненного алиасом (как показано в примере ниже).

Function RECSIZE()

 RECSIZE() --> количество байтов

RECSIZE() - функция обработки баз данных, которая определяет длину записи суммированием длин всех полей и затем добавлением к ним длины поля флажка признака удаления, используемого функцией DELETED(). Значение RECSIZE(), умноженное на значение функции LASTREC(), определяет количество байтов, занимаемое записями файла.

RECSIZE() полезна в программах, выполняющих автоматическое резервирование файлов. При ее использовании в сочетании с функцией DISKSPACE() RECSIZE() помогает убедиться в том, что имеется достаточно свободного места на диске для записи файла.

По умолчанию RECSIZE() обрабатывет текущую (активную) рабочую область. Для обработки пассивной рабочей области ее необходимо использовать как выражение, уточненное алиасом (см. пример ниже).

Function RLOCK()

 RLOCK() --> признак завершения

RLOCK() - это функция работы в сети, применяемая для блокирования текущей записи и запрещающая другим пользователям обновлять запись до тех пор, пока она блокирована. RLOCK() осуществляет раздельную блокировку, предоставляя другим пользователям право только считывать данные блокированной записи и оставляя право изменять ее только за текущим пользователем. Запись остается блокированной до тех пор, пока не будет блокирована другая запись, выполнится команда UNLOCK, закроется текущий файл базы данных или будет выполнена функция FLOCK() для текущего файла базы данных.

При каждом вызове RLOCK() производится одна попытка блокировать текущую запись и результат возвращается в виде логического значения. Попытка блокировки считается неудачной, если в этот момент уже была выполнена блокировка файла или этой записи другим пользователем, или файл был открыт в режиме монопольного пользования (EXCLUSIVE USE).

По умолчанию RLOCK() обрабатывает текущую (активную) рабочую область. Функция может обрабатывать и пассивную рабочую область, если ее использовать как элемент выражения, уточненного алиасом (смотрите пример ниже). Эта возможность особенно полезна, поскольку RLOCK() автоматически не блокирует записи, логически связанные с записью активной рабочей области.

Как правило, RLOCK() используется для работы с текущей записью. При этом наиболее часто используемые команды:

@...GET

DELETE (единственная запись)

RECALL (единственная запись)

REPLACE (единственная запись)

За более подробной информацией обращайтесь к главе "Программирование в сети" книги "Программирование и утилиты".

Function SELECT()

 SELECT([<алиас>]) --> номер рабочей области

SELECT() является функцией работы с базами данных, которая определяет номер рабочей области по заданному алиасу. Возвращаемое число может быть в диапазоне от 0 до 250. Если аргумент <алиас> не задан, возвращается номер текущей (активной) рабочей области. Если значение аргумента <алиас> задано, но такого алиаса не существует, SELECT() возвращает ноль.

Примечание: Функция SELECT() и команда SELECT, заданная с помощью аргумента, заданного в виде выражения, в некоторой степени похожи друг на друга. Это не должно вызывать недоумений, поскольку функция SELECT(), как правило, не вызывается в виде команды на отдельной строке.

Function USED()

 USED() --> признак наличия открытой базы данных

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