Глава 3. Базы данных, кодовые таблицы и индексы

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

3.1. Структура базы данных

Под базой данных понимается файл с расширением ".dbf" (Формат его соответствует формату файлов реляционных таблиц в стандарте xBase, но поддерживает русские буквы в именах полей и длинные символьные поля).
Описание структуры базы данных выполняют в файле шаблона с расширением ".dbh" (обычно его имя совпадает с именем базы данных).

Пример файла шаблона (Doc.dbh)

FCOD    C   1            - Код состояния документа
NDOC    N   6            - Исходный номер документа
DDOC    D                - Исходная дата выписки документа
DREG    D                - Дата регистрации поступления
DATE    D                - Дата акцепта
VD      C   2   *vdtab   - Вид документа
ND      N   6            - Номер документа
NDE     C   1            - Регистрационное расширение ND
PD      C   2   *rmtab1  - Рабочее место (подразделение)
VDE     C   2   *rmtab3  - Подвид док.
BUH     C   2   *buhtab  - Бухгалтерия - автор
BOX     N   4            - Номер пачки
SUMDOC  N  18 2          - Сумма по документу
VKD     C   1   *vkstab  - Картотека клиентов Дт
NKD     N   6            - Номер карточки Дт
VKK     C   1   *vkstab  - Картотека клиентов Кт
NKK     N   6            - Номер карточки Кт
OSNOV   C  15            - Идентификатор основания
OWNER   N   4            - Инициатор документа
SCRIPT  C 400            - Описание документа
RECDAT  D                - Дата последнего изменения
USER    C   4 0 6 0      - Подпись автора изменения
RECNUM  C   4 0 8 0      - Архивный номер
POST    C   2            - Почтовый номер

(Описание типов данных см. в п.1.4)

3.2. Поля баз данных

3.2.1. Общие сведения

Имя поля представляет собой последовательность букв (латинских и/или русских) и цифр, начинающуюся с буквы. Символ "_" (подчеркивание) рассматривается как буква. Прописные и строчные буквы не различаются. (Например, имена поля USER, user и User - равнозначны).
Длина имени поля - до 10 знаков.

Для обращения к полю текущей (активной) базы данных достаточно указать его имя. Для обращения к полю другой открытой базы данных нужно указать ее внешнее имя (псевдоним), знак "->" и имя поля, например:
DOC->NKD (где: DOC - имя базы, NKD - имя поля).

В программах с именами полей можно оперировать точно так же, как и с именами программных переменных. Например, можно отредактировать какое-либо поле или модифицировать его значение программным путем, используя операцию присваивания (накопления).
Логическим полям можно присваивать значения .TRUE. (.T.) или .FALSE. (.F.), а при редактировании - значения 1 и 0.

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

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

3.2.2. Особые поля баз данных

Интерпретатор zCode оперирует со стандартными типами полей: NUM, CHAR, DATE, LOG. Вместе с тем он позволяет придать символьным полям особые свойства.

Поля, наделенные такими свойствами, называются особыми полями. Особые поля входят в состав программных переменных и над ними можно производить такие же действия, как и над обычными переменными. Далее рассматриваются четыре вида особых полей:
- Упакованные числовые массивы;
- Массивы символьных строк переменной длины;
- Массивы символьных строк постоянной длины;
- Кодированные поля (см. п.3.3.4).

  • Упакованные числовые массивы

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

    В четырехбайтовых сегментах данные хранятся в формате long (в бинарном представлении). Таким образом, для хранения двенадцати сумм требуется символьное поле длиной 4 * 12 = 48 байт. В четырехбайтовом представлении каждое число может содержать до 9 значащих цифр, например:
       1.25, 2.5, 123456789, 123.456789 ...
    

    Восьмибайтовые сегменты используются для хранения чисел в формате double (в бинарном представлении). Для хранения двенадцати сумм требуется символьное поле длиной 8 * 12 = 96 байт. В восьмибайтовом представлении каждое число может содержать до 18 значащих цифр, например:
         1.25, 2.5, 123456789012345678, 123.456789012345678 ...
    

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

    Особое поле массива упакованных чисел - это символьное поле с длиной, кратной 4 или 8 байтам. Любое символьное поле, удовлетворяющее этому условию, можно представить как поле упакованного числового массива. Для этого достаточно в шаблоне базы данных ( dbh -файле) для выбранного символьного поля указать два числа: общее число значащих цифр элемента массива и число десятичных знаков после точки, например:
                                   число десятичных знаков
                                    -----
            NUM_ARRAY   C   36  0   7   2
           ----------  ---  -----  ---  ---
            имя поля   тип  длина всего  после точки
                                  ------------------
                                размер элемента массива
    
    Обратите внимание:
           36 - кратно 4, а не размеру элемента массива (т.е. 7).
    

    Доступ к элементу упакованного числового массива производится с помощью индексных скобок, например:
         SUM => NUM_ARRAY [Val (TAB_NO)] ;
    
    В индексных скобках [ ] может присутствовать любое допустимое выражение числового типа (из расширенного списка), например:
       LOG_ARRAY [@I+1] -  просмотр суммы следующего месяца
                           (если под системной переменной @I понимается
                           расчетный месяц).
    

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

    При редактировании формат элемента массива доминирует над форматом гнезда. Во время редактирования элемента массива клавишей F2 можно расписать значение текущего (редактируемого) элемента на все последующие элементы массива.

  • Массивы символьных строк переменной длины

  • Любое поле базы данных символьного типа можно интерпретировать как набор строк переменной длины. При этом информация в данном поле автоматически дробится на порции символом '|'. Для получения такого вида доступа достаточно в программе добавить к имени любого символьного поля индексные скобки, например:
         LETTER [@I], LETTER [@I + 1] ;
    

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

    Поля символьных строк можно использовать в выражениях, редактировать, программным путем вписать туда новое значение (операцией присваивания => ).

  • Массивы символьных строк постоянной длины

  • Любое поле базы данных символьного типа можно интерпретировать как набор строк постоянной длины. При этом ширина поля должна быть кратной размеру элемента символьного массива. Для преобразования поля в символьный массив достаточно в шаблоне базы данных (dbh-файле) напротив выбранного для этой цели символьного поля записать дополнительное число - размер элемента символьного массива, например:
           CHAR_ARRAY   C   360  36
           ----------  ---  ---  ---
            имя поля   тип длина размер элемента массива
                           поля
    
       В этом примере поле CHAR_ARRAY представлено в виде
       массива из 10 строк длиной по 36 байт каждая.
    

    Для получения доступа к произвольному элементу символьного массива достаточно добавить к имени поля индексные скобки, например:
         CHAR_ARRAY [@I], CHAR_ARRAY [@I + 1] ;
    

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

    3.3. Кодовые таблицы и кодированные поля

    См. также Функции

    3.3.1.Назначение кодовых таблиц

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

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

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

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

    3.3.2. Структура кодовых таблиц

    Кодовая таблица - это файл с символьной информацией, содержащий не более 256 строк длиной не более 256 байт. Такой файл должен иметь расширение ".dic" (от слова dictionary - словарик) и располагаться в том же каталоге, что и база данных.

    Кодовая таблица разбивается на поля с помощью строки шаблона, которая располагается непосредственно за основными (кодовыми) строками и отделяется от них символом конца файла (с шестнадцатеричным ASCII кодом 1A или 26 - десятичным) или точкой (.) в первой позиции строки.
    Строка шаблона может отсутствовать, в этом случае можно обращаться к строкам кодовой таблицы (используя функцию CODESTR) без выделения полей.

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

    Для обозначения ключевого поля допускается использовать только символы '#', причем ключ должен начинаться с первой позиции.
    Для обозначения комментария используются символы '*', причем комментарий может начинаться с любой позиции. Обычно его располагают в последних позициях.
    Остальные поля могут быть обозначены любыми символами, кроме '#' и '*', в том числе цифровыми и русскими.

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

    Информация, следующая за строкой шаблона, не принимается интерпретатором в расчет. Поэтому ниже строки шаблона можно располагать произвольные комментарии ко всей кодовой таблице в целом. При загрузке кодовой таблицы в оперативную память эти данные опускаются.
      Пример. Кодовая таблица единиц измерения (EI.DIC)
      -------------------------------------------------
    
      166 166    1 Кг.
      168 166 1000 Тонн
      796 796    1 Шт.
      >
      ### 111 2222 ****
    
      (Символом '>' условно обозначен код '1A').
    
      Строка шаблона содержит следующие поля:
    
      ###  - Трехразрядное поле ключа.
      **** - Четырехразрядное поле комментария.
      111  - Трехразрядное поле "главной" единицы измерения.
      2222 - Четырехразрядное поле коэффициента перевода текущей единицы
             измерения в "главную".
    

    В приведенном выше примере ключевое поле имеет длину 3 байта (###), поле комментария - 4 байта (****), поле "главной" единицы - 3 байта (111), а поле коэффициента пересчета - 4 байта (2222).

    Имя поля кодовой таблицы в программах задается одним символом. Например, поле (111) имеет имя '1', поле (2222) имеет имя '2' и т.д. (см. функцию CODEFIELD ).

    При описании полей в строке шаблона повторяемые символы можно заменять точками, например поле (2222) можно описать как (2...), поле (****) как (*...) и т.д.

    Пробелы между полями кодовой таблицы не обязательны. При необходимости можно "склеить" соседние поля.
    Пример. Кодовая таблица видов товарных картотек
    ------------------------------------------------
    
      Клиенты
      Сотрудники
      Подразделения
      .
      #*............
    
         В качестве ключа используется первая
       буква названия картотеки, а поле комментария
       примыкает непосредственно к ключевому полю.
    

    3.3.3. Загрузка кодовых таблиц

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

    Загрузка кодовой таблицы выполняется оператором CODETAB (или Codetab, codetab):

    CODETAB имя_таблицы [ (имя_файла) ] ;

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

    имя_файла - символьное выражение или константа, задающее полное или относительное путевое имя файла.

    Если имя_таблицы совпадает с именем_файла, а сам файл расположен в текущем каталоге баз данных, то задавать имя_файла необязательно. При этом имя файла должно иметь расширение ".dic".
      Примеры:
      --------
       Codetab  chtab ; /* chtab.dic - имя файла из каталога баз данных
                         (в данном примере chtab.dic - план счетов) */
    
       Codetab  Count ( ".\count.mnu") ;
                        /* count.mnu - файл в текущем каталоге */
    

    3.3.4. Кодированные поля

    Кодированным полем базы данных может быть любое символьное поле длиной до 4 байтов, связанное с кодовой таблицей. Чтобы связать символьное поле с кодовой таблицей, в шаблоне базы данных (dbh - файле) в соответствующей строке следует указать имя кодовой таблицы, например:
        PROF  C 4         *proftab     - Профессия
    
           здесь PROF      - имя поля;
                 С         - его тип (символьный);
                 4         - его длина (4 байта);
                 *proftab  - имя файла с расширением ".dic",
                             содержащего кодовую таблицу профессий.
    

    Звездочка (*) - обязательный элемент; она указывает, что далее следует имя кодового файла. Пробел между звездочкой и именем файла не допускается. Расширение указывать не обязательно, но если оно указано, оно должно быть ".dic", например:
           PROF  C 4         *proftab.dic - Профессия
    

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

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

    Редактирование кодированных полей осуществляется по следующим правилам:

    3.4. Открытие и индексирование баз данных

    3.4.1. Операторы USE, HEADFILE и SELECT

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

    Открытие базы данных выполняется оператором USE (Use,use), имеющим следующий синтаксис:

    USE [модификаторы] имя_базы
    [, HEADFILE = [имя_региона] [ ( имя_DBH_файла ) ] ] ;

    Здесь :

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

    Оператором HEADFILE cледует задавать имя_региона либо заключенное в круглые скобки имя_DBH_файла. Если задано и то и другое, то dbh - файл ищется по имени_DBH_файла, а региону присваивается имя_региона.

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

    - Если задано имя_региона, то псевдоним будет совпадать с именем_региона;
    - Иначе, если задано имя_DBH_файла, то для псевдонима будет использовано имя этого файла (без расширения и путевых каталогов);
    - Если заданно только имя_базы, то псевдоним будет совпадать с именем файла базы данных (без расширения и пути).

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

    Отдельным оператором HEADFILE можно cоздать пустой регион с требуемой структурой для открытия реальных баз данных. При этом используется формат :

    HEADFILE имя_региона ;

    Текущей (активной) для задачи становится последняя из открытых оператором USE баз данных. Если в конкретном фрейме требуется изменить выбор текущей (активной) базы данных, следует использовать оператор SELECT (Select,select) в одном из форматов:

    3.4.2. Примеры открытия баз данных

    В примерах "BASEDIR" - каталог по умолчанию баз данных, который указывается в файле Z.CFG.

    USE "tmp",  HEADFILE = ("C:\subconto\client");
    USE "tmp1", HEADFILE = ("C:\subconto\Client");
       /* Первая база будет иметь псевдоним client, вторая - Client */
    
    use "c:\z\base\dks" ;
    use "d:\swap\Dks" ;
       /* Первая база будет иметь внутреннее имя dks, вторая - Dks,
       хотя имя файла у них одинаково: DKS.DBF */
    
    use "c:z\base\dks" ;
    use "d:\swap\dks", Headfile = ("c:\z\base\Dks") ;
       /* Обе базы данных имеют одинаковую структуру, которая
       задается одним и тем же файлом шаблона C:\Z\BASE\DKS.DBH */
    
    use "dks" ;  /* Открывается файл "DKS.DBF", из каталога BASEDIR */
    
    use  My_dir + "doc" ;
        /* Определяется имя файла как конкатенация двух строк,
        а затем открывается файл с соответствующим именем */
    
    use ".\temp" ;
        /* Открывается или создается файл "TEMP.DBF" в текущем каталоге
        (а не в каталоге BASEDIR).  Файл шаблона "TEMP.DBH" должен быть
        расположен в текущем каталоге */
    
    use ".\temp", Headfile = tmp1 ;
        /* Открывается или создается файл "TEMP.DBF" в текущем каталоге.
        Файл "TMP1.DBH" должен быть расположен в каталоге BASEDIR */
    
    use ".\temp", Headfile = c:\headers\tmp1 ;
          /* Открывается или создается файл "TEMP.DBF",
          в текущем каталоге пользователя. Файл шаблона "TMP1.DBH"
          должен быть расположен в каталоге "C:\HEADERS\" */
    

    3.4.3. Специальные режимы

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

    Для задания резидентного режима служит модификатор -r в одной из 2 форм:

    -r или -r:block_factor

  • Форма -r без явного указания блок-фактора заставляет интерпретатор zCode разместить базу данных в расширенной памяти. На компьютере должен быть предварительно загружен один из менеджеров расширенной памяти, например, EMM386.EXE или QEMM.EXE.
  • Если менеджер отсутствует, либо на компьютере недостаточно памяти для полной буферизации открываемой базы, она будет открыта в обычном режиме.

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

  • Форма -r:block_factor с явным указанием блок-фактора (например, -r:100) заставляет интерпретатор размещать открываемую базу данных в оперативной памяти, в пределах первых 640 килобайт. При этом Вы должны быть уверены, что Ваша задача оставляет достаточно места в оперативной памяти для размещения всех данных из открываемой базы.

  • В этом режиме данные также размещаются блоками. Но, в отличие от предыдущего режима, блок-фактор задается программистом и длина блока определяется умножением длины записи на число записей в блоке, то есть на блок-фактор. Поэтому длина блока всегда кратна длине записи. Длина блока не должна превышать 64 килобайта; это следует иметь в виду, назначая блок-фактор.

    В обоих резидентных режимах действуют следующие правила: Использование резидентного режима иллюстрируется следующими примерами:
      use -r "client" ;
            /* Открытие базы "client.dbf" в расширенной
            памяти с полным кэшированием данного файла */
    
      use -r:100 -c "fantom" ;
            /* Создание в оперативной памяти пустой базы данных
             по образу файла "fantom.dbf", либо "fantom.dbh"
             с размещением данных блоками по 100 записей */
    

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

    Для задания этого режима служит модификатор -b:

    -b:block_factor

    block_factor - количество записей в блоке (блок-фактор),обязательный параметр буферизованного режима. Длина буфера определяется как произведение длины записи на блок-фактор и не должна превышать 64 килобайта. Буфер располагается в основной памяти.

    Использование буферизованного режима иллюстрируется следующими примерами:

    use -b:100 "dks" ;    /* Открытие базы "dks.dbf" в буферизованном
                           режиме для считывания */
    use -i -b:100 "out" ; /* Открытие базы "out.dbf" в буферизованном
                           режиме для записи (/считывания) */
    

    Обратите внимание во втором примере на модификатор -i, удаляющий индексные файлы и делающий базу неиндексированной. Буферизация не дает эффекта для операций записи при наличии индексных файлов.

    3.4.4. Индексные файлы

    Для организации требуемого порядка и оперативности доступа к записям баз данных используются индексные файлы, формат которых совместим с файлами СУБД "CLIPPER" (расширение ".ntx") или "DBASE" (расширение ".ndx").

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

    Во избежание этого система zCode использует списки индексных файлов. Такой список представляет собой файл, расположенный в том же каталоге, что и сама база данных ( dbf - файл). Он имеет имя, совпадающее с именем базы данных, а расширение - ".ils" (от "index list").

    Во время выполнения оператора USE интерпретатор проверяет наличие списка индексных файлов и, если он имеется, открывает все индексные файлы по списку, независимо от фактической потребности в их наличии для той или иной программы. В случае их отсутствия они создаются заново.

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

    Таким образом поддерживается целостность информационной системы при многопользовательской работе.

    Описание индексных файлов в ils - файле строятся по следующему шаблону:

    INDEX [модификатор] = имя_файла ("индексное выражение") ;

    где:

    Пример списка индексных файлов (M8001Z.ILS)
    -------------------------------------------
    
    index    = m8001z_1 ("FIO_B");
    index    = m8001z_2 ("STR(POS_B,6)+STR(TAB_B,8)");
    index    = m8001z_3 ("STR(TAB_B,8)");
    index    = m8001z_4 ("SUBSTR(STR(TAB_B,8),6,3)+FIO_B");
    

    В программе за оператором USE или SELECT также могут следовать один или несколько операторов описаний индексных файлов. Они имеют следующий формат:

    INDEX [модификатор] = имя_файла [ ("индексное выражение") ] ;

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

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

      Пример описания индексных файлов:
    
    use "people" ;
    index -u = ind_1( "POSTNUM") ;
    index    = ind_2( "DTOS( DATE) + FIO") ;
    
      Для базы people будут открыты все индексные файлы по списку из
     файла "people.ils", а файлы ind_1.ntx и ind_2.ntx будут строится
     заново при каждом исполнении программы.
    
    В дальнейшем к индексному файлу можно обратиться по его внутреннему имени, которое совпадает с именем дискового файла, причем имени индексного файла всегда предшествует имя базы данных с двоеточием в качестве разделителя, например:
    people:p_date, people:ind_1, people:ind_2

    Внутренние имена индексных файлов используются, например, в качестве параметра процедуры Seek() :

    Seek( People:ind_1, "101025") ;
            /* Поиск в базе данных People записи,
             содержащей значение "101025" в поле POSTNUM */
    

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

    KEY = KeyTop [, KeyBottom ] ;

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

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