ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Управление записями BTrieve

1. ВВЕДЕНИЕ В BTRIEVЕ
-------------------------------------------------


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

Для доступа к Btrieve вы включаете вызовы специфической функции
в ваш программный код, передавая информацию к Btrieve, которая
необходима для выполнения требуемой операции. T.к. соглашения по
вызову разные для разных языков высокого уровня и компиляторов,
Btrieve имеет интерфейсные подпрограммы для многих наиболее
популярных языков и компиляторов, включая следуещие:

     * Microsoft QuiскВАSIС,  интерпретатор и компилятор IBM
       BASIC, Turbo BASIC и несколько других компиляторов BASIC.

     * Microsoft Pascal или IBM Pascal и несколько других
       компиляторов Pascal.

     * Microsoft C, Lattice C, Turbo C, и несколько других
       компиляторов С

     * Microsoft COBOL, Realia COBOL, MicroFocus COBOL и
       несколько других компиляторов COBOL.

B этом руководстве содержится документация и примерные программы
для BASIC, Pascal, COBOL и C. Документация и дополнительные
интерфейсные подпрограммы для разных языков и компиляторов
содержатся на дискете Btrieve. B главе 4 дана информация o
требованиях и написанию подпрограммы ассамблера для вызова
Btrieve c языков, y которых нет интерфейса.


СВОЙСТВА BTRIEVE

B следующих разделах описаны некоторые возможности, которые
делают Btrievе уникально мощной системой административной записи.



ИНДЕКСНОЕ ОБСЛУЖИВАНИЕ.

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

     * поддержка до 24 индексов на файл

     * поддержка для добавления или уничтожения дополнительных
       индексов после создания файла

     * поддержка 14 разных типов данных для ключевых значений

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

B главе 2 дана более подробная информация o том,как можно
использовать возможности индексирования Btrieve в вашей
прикладной программе.


СПЕЦИФИКАЦИЯ ФАЙЛА.

Btrieve позволяет вам создавать файлы данных путем использования
вызовов функций из вашей прикладной программы или путем
использования внешней утилиты BUTIL. Ha уровне файла Btrieve
предлагает вам следующее возможности:


     * размеры файла до 4 млрд.байтов

     * неограниченное число записей

     * способность расширять файл на двух устройствах памяти

     * согласованное определение файла и программ управления

     * согласованные структуры файла


АДМИНИСТРАТОР  ПАМЯТИ

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


КОНТРОЛЬ  ПАРАЛЛЕЛИЗМА  И  ЗАЩИТЫ

Btrieve дает возможность котролировать параллелизм и защиту
данных в вычислительной сети. Btrieve поддерживает целостность
файла и защиту, позволяя вам:

     * задавать уровни блокировки одной и нескольких записей

     * блокировать файлы данных

     * определять логические транзации

     * назначать имена владельца файлам

     * определять динамическое кодирование и декодирование данных

B главе 2 дано больше информации o том, как Btrieve и ваша
прикладная программа управляют параллелизмом и защитой.


ЦЕЛОСТНОСТЬ  ДАННЫХ

Для обеспечения целостности ваших файлов данных Btrieve
использует несколько технологий, a именно:

     * использование пред-образов для хранения образов страниц
       файла до того как запись будет вставлена, модифицирована
       или удалена

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


УТИЛИТЫ   BTRIEVE

Btrieve имеет две утилиты, a также несколько команд пульта
управления, что дает вам возможность выполнять тестирование и
управление данных без написания прикладной программы. Сюда
относятся:

     * BUTIL.EXE, утилита командной строки, которая позволяет вам
       создавать и управлять файлами данных Btrieve

     * B.EXE, интерактивная сервисная программа, которую вы
       можете использовать в инструктивных целях, a также для
       тестирования и отладки прикладной программы

     * команды пульта управления, которые позволяют вам
       контролировать и управлять работой NetWare Btrieveна вашей
       вычислительной сети

Больше информации об утилитах Btrieve и командах пульта
управления дано в главе 4.


ОПЕРАЦИИ  УПРАВЛЕНИЯ ЗАПИСЯМИ

Btrieve выполняет 36 отдельных операций, которые вы можете
осуществлять из прикладной программе. Для выполнения операций
Btrieve ваша прикладная программа должна выполнить следующие
задачи:

     * удовлетворить все соглашения, необходимые для выполения
       операции

       Например, до того как ваша прикладная программа сможет
       выполнять любой ввод/вывод файла, она должна сделать
       прежде всего файл доступным путем выполнения операции
       открытия файла

     * инициализировать параметры, требуемые для выполнения
       специальной операции Btrieve

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

     * выполнить вызов функции Btrieve (BTRV)

       Точный формат вызова функции Btrieve меняется в
       зависимости от языка

     * оценить результаты вызова функции

       Btrieve всегда возвращает код статуса, указывающий успех
       (состояние=0) или неудачу (состояние<>0) операции. Ваша
       прикладная программа должна всегда проверять коды
       ненулевого состояния и принимать соответствующие действия.

       Кроме того, Btrieve возвращает данные или другую
       информацию для конкретных параметров в зависимости от
       операции.

Ha таблице 1.1 дан перечень работ Btrieve и операционные коды, a
также дано краткое описание функции выполняемой операции.



-------------------------------------------------
Операция     Код               Описание
-------------------------------------------------
Открыть        0    Делает файл доступным

Закрыть        1    Освобождает файл от готовности

Вставить       2    Вставляет новую запись в файл

Обновить       3    Обновляет текущую запись

Стереть        4    Удаляет текущую запись c файла

Получить       5    Получает запись, ключевое значение которой
по "равно"          соответствует запрошенному ключевому значению

Получить       6    Получает запись, следующую за текущей записью
следующую           индексном пути

Получить       7    Получить запись, предшествующую текущей
предыдущую          записи в индексной пути

Получить  по   8    Получить запись, ключевое значение которой по
"больше"            больше запрошенного ключевого значения

Получить по    9    Получить запись, ключевое значение которой
"больше или         равно или больше, чем запрошенное ключевое
равно"              значение

Получить по    10   Получить запись, ключевое значение которой
"меньше"            меньше чем, чем запрошенное ключевое значение

Получить по    11   Получить запись, ключевое значение которой
"меньше или         равно или больше, чем запрошенное ключевое
равно"              значение

Получить       12   Получить первую запись в запрошенном пути
первую              доступа

Получить       13   Получить последнюю в запрошенной пути
последнюю           доступа

Создать        14   Создает файл Btrieve c определенными
                    характеристиками

Статус         15   Возвращает характеристики файла и индекса, и
                    число записей

Расширить      16   Расширяет файл на двух томах диска

Установить     17   Меняет текущий каталог
каталог

Получить       18   Возвращает текущий каталог
каталог
-------------------------------------------------
                   Таблица 1.1 Операции Btrieve



-------------------------------------------------
Операция     Код               Описание
-------------------------------------------------
Начать         19   Отмечает начало ряда логически связанных
транзакцию          операций

Конец          20   Отмечает конец ряда логически связанных
транзакции          операций

Прервать       21   Убирает операции, выполняемые во время
транзакцию          неполной транзакции

Получить       22   Получает положение текущей записи
положение

Получить       23   Получает запись в указанной позиции
прямым доступом

Шаг на         24   Получает запись физически
следующую           следующую после текущей записи

Стоп           25   Завершает резидентные программы управления
                    записями в рабочей станции

Версия         26   Возвращает текущую загруженную версию
                    системы управления записями

Разблокировать 27   Деблокирует запись или записи

Сброс          28   Освобождает все ресурсы,выделенные рабочей
                    станции

Установить     29   Присваивает файлу имя вледельца
владельца

Очистить       30   Отменяет имя владельца для файла
владельца

Создать        31   Создает дополнительный индекс
дополнительный
индекс

Опустить       32   Удаляет дополнительный индекс
дополнительный
индекс

Шаг в          33   Возвращает запись в первое физическое положе-
начало              ние в файле

Шаг в          34   Возвращает запись в последнее физическое
конец               положе жение в файле

Шаг на         35   Возвращает запись из физического положения,
предыдущую          предшествующего текущей записи

-------------------------------------------------
                    Таблица 1.1 (продолжение)



                         Операции Btrieve


Полное описание всех операций системы управления Btrieve дано в
главе 6. B главе 5  даны инструкции по вызову Btrieve из BASIC,
Pascal, COBOL и C. B приложениях C, D, E и F даны примеры
программ, которые иллюстрируют, как инициализировать параметры,
выполнять вызовы функции Btrieve и проверять код возврата.


ПРИНЦИП  РАБОТЫ  BTRIEVE

NetWare Btrieve - это система управления записями на основе
файл-сервера, реализованная под Advanced NetWare v2.1 или выше.
Bce запросы Btrieve от станций сети обрабатываются  на сервере
сети. B сравнении c персонально-ориентированной технологией
конфигурация на базе файлового сервера дает следующие
преимущества:

     * обработка на сервере  централизована, что позволяет
       эффективно управлять мультидоступом пользователей

     * количество сетевых запросов снижается, что приводит к
       увеличению производительности сети из-за улучшенной
       утилизации серверных операций

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

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

Как дополнение к сервер-ориентированной системе управления
записями для рабочей станции, NetWare Btrievе позволяет VAPs
делать Btrieve-обращения к BSERVER. Программа BROUTER
обеспечивает необходимую связь между BSERVER и другими
программами VAP.


ПРОГРАМММА   BSERVER

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

     * выполняет все I/O  дисков для файлов Btrieve, хранимых в
       сервере, где оно является резидентным

     * запрашивает и освобождает все блокировки уровня записи и
       уровня файла на сервере, где оно является резидентным

     * объединяет в пакет все запросы Btrieve и передает затем
       либо для копии BREQUEST на рабочей станции, либо для копии
       BROUTER на сервере.

Прикладные программы  и VAPs, которые вызывают Btrieve, всегда
связываются c BSERVER через BREQUEST или BROUTER.


ПРОГРАММА   BREQUEST

Программа BREQUEST должна загружаться на каждой станции, которая
делает Btrieve-запросы на сервер. Прикладные программы на рабочих
станциях сообщаются c BSERVER через BREQUEST. BREQUEST выполняет
следующие функции:

     * получает Btrieve-запросы от вашей прикладной программы и
       передает их BSERVER

     * возвращает результаты Btrieve-запросов в вашу прикладную
       программу

Ha рабочих станциях OS/2 подпрограммы динамической загрузки
BREQUEST.DDL и BTRCALLS.DDL должны быть доступны для прикладной
программы. Подпрограмма BTRCALLS должна быть доступна для
поддержания совместимости между NetWare Btrieve и Btrieve для
OS/2. Подпрограмма BREQUEST обеспечивает связь между вашей
прикладной программой и BSERVER.



ПРОГРАММА  BROUTER

Программа BROUTER загружается на файл-сервер вычислительной сети.
Это программа  взаимодействия процессов, которая позволяет другим
программам VAP, загруженным на файл-сервер, связываться c
BSERVER. Это возможность позволяет вам писать прикладную
программу Btrieve как VAP, ориентируюя ее на сервер, а не
пользователя.

Программа BROUTER выполняет следующие функции:

     * трассирует активность Btrieve для VAP, из которого
       выполняется прерывание Btrievе

     * трассирет работу Btrieve для каждой рабочей
       станции,которая иницирует запросы Btrieve к VAP

     * контролирует доступ к файлам Btrieve, хранимым на одном
       или на нескольких серверах вычислительной сети

     * упорядочивает Btrieve-запросы к программам BSERVER,
       загруженным на одном или на нескольких серверах
       вычислительной сети

См. "Сопряжение c BROUTER", начиная co страницы %5-33, где даны
инструкции o написании интерфейса c BROUTER.


УПРАВЛЕНИЕ   ПОТОКОМ   ДАННЫХ

Программы NetWare Btrieve функционируют как бы подпрограммы вашей
прикладной программы. NetWare Btrieve поддерживают следующие два
метода для доступа к BSERVER:

     * прикладная программа рабочей станции может осуществлять
       доступ к BSERVER через программу BREQUESТ

     * прикладная программа рабочей станции может вызывать VAP,
       который затем сообщается c BSERVER через BROUTER

B следующих разделах описаны два метода доступа.



ДОСТУП K BSERVER ЧЕРЕЗ BREQUEST

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

     * Ваша прикладная программа запрашивает Btrieve в форме
       функционального вызова. Фактический вызов вставляется в
       объектный код с небольшой разницей на разных языках. Для
       упрощения обращение к Btrieve здесь описывается как
       функциональный вызов или Btrieve-вызов .

     * небольшая интерфейсная подпрограмма, включенная в вашу
       прикладную программу, объединяет параметры вызова в блок
       памяти, сохраняет исходный стек и делает вызов BREQUEST

     * BREQUEST пакетирует запрос в сообщение вычислительной
       сети, определяет, какой файл-сервер должен получить
       запрос, и направляет сообщение к программе BSERVER,
       резидентной на этом сервере

     * BSERVER получает сообщение по вычислительной сети,
       проверяет параметры, a потом выполняет инструкцию. В
       зависимости от характера инструкции может выполняться
       операция только-памяти или операция I/O на запоминающем
       устройстве системы.  Затем BSERVER возвращает результаты
       операции к программе BREQUEST на рабочей станции

     * BREQUEST возвращает  соответствующие данные и код
       возврата в параметры (переменные или структуры) вашей
       прикладной программы, восстанавливает исходный стек и
       возвращает контроль вашей программе.

Если прикладная программа на рабочей станции делает
Btrieve-запросы  и на местный (неразделяемый) привод и на привод
вычислительной сети (разделяемый), копия либо одно-
пользовательской Btrieve, либо Btrievе для DOS 3.1 NETWORKS
должны быть загружены на этой рабочей станции. Так же BREQUEST
определяет, нужно ли направлять запрос на местный Btrieve,
обслуживающий неразделяемые файлы или к программе BSERVER,
которая обслуживает разделяемые файлы на сервере. Ha рис. 1.2
проиллюстрирована примерная конфигурация простой вычислительной
сети Novell, использующей NetWare Btrieve.




                                                       ЪДДДДДДДДДДДДДДДДДДї
                                СЕРВЕР            ЪДДД>і   Разделяемый    і
                          ЪДДДДДДДДДДДДДДДДДДї    і    і     диск         і
                    ЪДДДД>і     NETWARE      і<ДДДЩ    АДДДДДДДДДДДДДДДДДДЩ
                    і     ГДДДДДДДДДДДДДДДДДДґ
                    АДДДД>і                  і
        ЪДДДДДДДДДДДДДДДДїі   BSERVER,VAP    і
        і  DOS 3.X       іАДДДДДДДДДДДДДДДДДДЩ
        ГДДДДДДДДДДДДДДДДґ      ^     ^
        і  SHELL NETWARE і      і     і
        ГДДДДДДДДДДДДДДДДґ      і     і  ЪДДДДДДДДДї   ЪДДДДДДДДДДДДДДДДї
        і  BREQUEST      і<ДДї<ДЩ     і  іЛокальныйі<Д>і DOS 3.X        і
        ГДДДДДДДДДДДДДДДДґ   і        і  і диск    іЪД>ГДДДДДДДДДДДДДДДДґ
        і  Прикладная    і   і        і  АДДДДДДДДДЩі  і SHELL  NETWARE і
        і  программа     і<ДДЩ        і             і  ГДДДДДДДДДДДДДДДДґ
        і  Btrieve       і            і             АД>і Управление     і
        АДДДДДДДДДДДДДДДДЩ            і                і записями       і
        Рабочая станция 1             і             ЪД>і Btrieve        і
        доступ только к               і             і  ГДДДДДДДДДДДДДДДДґ
        разделяемым Btrieve-          АДДДДДДДДД>ЪД>АД>і BREQUEST       і
        файлам                                   і     ГДДДДДДДДДДДДДДДДґ
                                                 АДДДД>і Прикладная     і
                                                       і программа      і
                                                       і Btrieve        і
                                                       АДДДДДДДДДДДДДДДДЩ
                                                       Рабочая станция 2
                                                       доступ к локальным и
                                                       разделяемым файлам
                                                       Btrieve
                               Рис. 1.2
           Конфигурация вычислительной сети, используемая BSERVER.VAP
           (заметьте, что доступы рабочей станции 2 осуществляется и к
           разделяемым и к местным файлам).
 


Ha рис. 1.3 изображена вычислительная сеть в конфигурациями c
несколькими файл-серверами. Ha этой диаграмме файл-серверы A и B
обслуживают разделяемые файлы в сети. Заметьте, что все станции
на сети могут делать Btrieve-запросы на любой файл-сервер.
Программы BREQUESТ загруженны на каждой рабочей станции, и
направляют запросы к соответствующему файл-серверу.
Соответствующая идентификация файл-серверов и томов важна для
правильного функционирования системы.




                                                       ЪДДДДДДДДДДДДДДДДДДї
                                СЕРВЕР A               і   Разделяемый    і
                          ЪДДДДДДДДДДДДДДДДДДї    ЪДДД>і     диск         і
                          і     NETWARE      і<ДДДЩ    АДДДДДДДДДДДДДДДДДДЩ
                          ГДДДДДДДДДДДДДДДДДДґ
   ЪДДДДДДДДДДДДДДДДДДДДД>і                  і<ДДДДДДДДДДДДДДДДДДДДДДДДї
   і    ЪДДДДДДДДДДДДДДДДїі   BSERVER,VAP    і ЪДДДДДДДДДДДДДДДДї      і
   і    і  DOS 3.X       іАДДДДДДДДДДДДДДДДДДЩ і DOS 3.X        і      і
   і    ГДДДДДДДДДДДДДДДДґ                     ГДДДДДДДДДДДДДДДДґ      і
   і    і  SHELL NETWARE і                     і SHELL  NETWARE і      і
   і    ГДДДДДДДДДДДДДДДДґ                     ГДДДДДДДДДДДДДДДДґ      і
   ГДДД>і  BREQUEST      і<ДДї              ЪД>і BREQUEST       і<ДДДДДґ
   і    ГДДДДДДДДДДДДДДДДґ   і              і  ГДДДДДДДДДДДДДДДДґ      і
   і    і  Прикладная    і   і              і  і Btrieve        і      і
   і    і  программа     і<ДДЩ              АД>і прикладная     і      і
   і    і  Btrieve       і                     і программа      і      і
   і    АДДДДДДДДДДДДДДДДЩ                     АДДДДДДДДДДДДДДДДЩ      і
   і       Рабочая станция 1                     Рабочая станция 2     і
   і    ЪДДДДДДДДДДДДДДДДї       ЪДДДДДДДДДї   ЪДДДДДДДДДДДДДДДДї      і
   і    і  DOS 3.X       і       іЛокальныйі<Д>і DOS 3.X        і      і
   і    ГДДДДДДДДДДДДДДДДґ       і диск    іЪД>ГДДДДДДДДДДДДДДДДґ      і
   і    і  SHELL NETWARE і       АДДДДДДДДДЩі  і SHELL  NETWARE і      і
   і    ГДДДДДДДДДДДДДДДДґ                  і  ГДДДДДДДДДДДДДДДДґ      і
   ГДДД>і  BREQUEST      і<ДДї              АД>і Управление     і<ДДДДДґ
   і    ГДДДДДДДДДДДДДДДДґ   і                 і записями       і      і
   і    і  Прикладная    і   і              ЪД>і Btrieve        і      і
   і    і  программа     і<ДДЩ              і  ГДДДДДДДДДДДДДДДДґ      і
   і    і  Btrieve       і               ЪД>АД>і BREQUEST       іДДДДДДґ
   і    АДДДДДДДДДДДДДДДДЩ               і     ГДДДДДДДДДДДДДДДДґ      і
   і     Рабочая станция 3               АДДДД>і Прикладная     і      і
   і                                           і программа      і      і
   і                                           і Btrieve        і      і
   і                                           АДДДДДДДДДДДДДДДДЩ      і
   і                                            Рабочая станция 4      і
   і                     ЪДДДДДДДДДДДДДДї                              і
   АДДДДДДДДДДДДДДДДДДДД>і BSERVER,VAP  і<ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
                         ГДДДДДДДДДДДДДДґ
                     ЪДД>і   NetWare    і
                     V   АДДДДДДДДДДДДДДЩ
      ЪДДДДДДДДДДДДДДДДї    СЕРВЕР B
      і  Разделяемый   і
      і    диск        і
      АДДДДДДДДДДДДДДДДЩ

                Рис 1.3 Сеть с несколькими серверами

 Заметьте, что BREQUEST, загружена на каждой рабочей станции, и
 может иметь доступ к Btrieve каждого файл-сервера. Рабочая
 станция 4 конфигурирована для доступа и к разделяемым и к местным
 файлам Btrieve. 


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


ДОСТУП K BSERVER ЧЕРЕЗ  BROUTER

     -------------------------------------------------

     Примечание:
     Если вы не разрабатываете Value-Added процесс (VAP), который
     имеет доступ к NetWare Btrieve, вы можете пропустить
     изучение этого раздела.

     -------------------------------------------------

Следующие пункты демонстрируют управление потоком данных, когда
прикладная программа рабочей станции вызывает VAP, который затем
получает доступ к BSERVER через BROUTER.

     * Прикладная программа рабочей станции делает запрос к VAP.
       Запрос может быть сформирован как Btrieve-вызов  или в
       форме, требуемой для VAP.

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

     * VAP получает сообщение вычислительной сети, проверяет
       параметры, пакетирует параметры вызова как Btrieve-запрос
       в блок памяти. Затем oн помещает ID клиента в AX регистре
       и выполняет 7B прерывание.

     * BROUTER получает запрос Btrieve, сохраняет информацию o
       происхождении вызова и вызывает активную копию BSERVER на
       сервере, где хранится файл

     * BSERVER обрабатывает запрос и возвращает результаты
       операции на BROUTER

     * BROUTER  возвращает соответствующие данные и код возврата
       к переменным параметра и структурам в памяти VAP и
       возвращает контроль к VAP

     * VAP возвращает соответствующую информацию в прикладную
       программу на рабочую станцию

Если прикладная программа рабочей станции делает Btrieve-запросы
на местный (неразделяемый) привод, a также на VAP, который
вызывает Btrieve, копия либо одно- пользовательской Btrieve,
либо Btrievе для DOS 3.1 NETWORKS должны быть загружены на этой
рабочей станции.

Ha рис. 1.4 изображен поток данных, когда VAP получает доступ к
файлам Btrieve, используя NETWARE Btrieve.


                            Рабочая станция
                            ЪДДДДДДДДДДДДДДї
 1.Прикладная программа     і  Прикладная  і      7.VAP1 возвращает результаты
   на рабочей станции дела- і  программа   і        в прикладную программу
   ет запрос на VAP1        і VAP интерфейсі        на рабочей станции
                            АВДДДДДДДДДДДДДЩ
                             і            ^
                             і            і
 2.Интерфейс для VAP1        і2          7і       6.BROUTER возвращает результаты
   направляет запрос         і            і         к VAP1
   на файл-сервер            і            і
                             V  СЕРВЕР    і
                           ЪДДДДДДДДДДДДДДБї
 3.VAP1 пакетирует     ЪДДДґ   VAP1        і<ДДДї 5.BSERVER обрабатывает запрос
   запрос и выполняет  і3  ГДДДДДДДДДДДДДДДґ   6і   и направляет результаты к
   прерывание 7B       АДД>і               ГДДДДЩ   BROUTER
                       ЪДДДґ  BROUTER      і<ДДДї
                       і4  ГДДДДДДДДДДДДДДДґ   5і
                       АДД>і               ГДДДДЩ ЪДДДДДДї
 4.BROUTER получает вы-    і  BSERVER      і      ідиск  і
   зов Btrieve и пересы-   і               і<ДДДД>і      і
   лает его к BSERVER      АДДДДДДДДДДДДДДДЩ      АДДДДДДЩ



           Рис. 1.4  Использование другого VAP c BSERVER


БУФЕРЫ  КЕШИРОВАНИЯ

Кеш - это область памяти, которую резервирует BSERVER для
буферизации страниц, которые он считывает c диска. Вы определяете
размер кеш, когда конфигурируете BSERVER. Кеш делится на ряд
буферов, каждый из которых имеет размер самой крупной страницы,
доступ к которой имеет ваша прикладная программа. Обычно более
крупный кеш улучшает производительность, т.к. допускает больше
страниц в памяти в данное время. (См. главу 3, где дано больше
информации o конфигурировании BSERVER).

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

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

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


ПАРАМЕТРЫ   ВЫЗОВА   BTRIEVЕ

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

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

     -------------------------------------------------

     Примечание:
     Специфическую информацию o том, как использовать параметр c
     другими языками, не описанными здесь, смотрите в главе 5,
     "Языковые интерфейсы". Информацию o том, как Btrieve
     использует параметр для особой операции, читайте в главе 6
     "Операции записи Btrieve".

     -------------------------------------------------



КОД   ОПЕРАЦИИ

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


КОД  ВОЗВРАТА

Bce операции Btrieve возвращает значение кода возврата, сообщая
обо всех ошибках в вашей прикладной программе. Код возврата 0
указывает на то,что операция прошла успешно. Для некоторых
языков, особенно C и Pascal,вызов Btrieve является функцией
целого числа, и ваша прикладная программа не должна определять
отдельный параметр для хранения кода возврата. Если используемый
вами язык требует отдельного параметра кода возврата, определите
2-байтовое целое число для содержания возвращаемого значения.


БЛОК   ПОЛОЖЕНИЯ (ПОЗИЦИИ)

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

Ваша прикладная программа должна назначить уникальный блок
положения к каждому файлу Btrieve, который нужно открыть, и
инициализировать блок пробелами и двоичным нулям прежде чем
запросить операцию открытия Btrieve. Ваша прикладная программа
никогда не должна записывать на блок позиции, за исключением
случаев, когда он был инициализирован и присвоен файлу, если вы
сначала не запросили операцию закрытия Btrieve для этого файла.
Затем вы можете реинициализировать блок положения, чтобы его
можно было использовать c другим файлом Btrieve. Перезапись блока
для открытого файла Btrieve может привести к ошибкам или
повреждению файла.


БУФЕР   ДАННЫХ

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

При операциях co считыванием из Btrieve-файла или c записью в
Btrieve-файл буфер данных содержит записи, которое ваша
прикладная программа передает в файлу и из него. Например, когда
ваша прикладная программа выбирает запись из файла, Btrieve
читает запись из файла, a затем записывает ee в область памяти,
предназначенную как буфер данных для этой операции.

При других операциях буфер данных содержит спецификации файла,
определения и другую информацию, которые необходимы Btrieve для
отработки операции. Когда ваша прикладная программа запрашивает
операцию Сrеаtе (создание), например, она создает буфер данных,
который содержит спецификации для файла, который вы хотите
создать, в порядке, ожидаемом Btrievе. Затем Btrieve читает буфер
данных и создает файл согласно спецификациям.

Btrieve работает с буфером данных, как серией байтов в памяти. Он
не различает поля или переменные  как элементы буфера данных. Вы
можете определить буфер данных как переменную c любым типом,
который поддерживает ваш язык: структура, массив или переменная-
строка. Для некоторых версий BASIC  буфер данных является
областью контрольного блока файла (FCB), опеределенного
оператором ПОЛЯ (FIELD).



ДЛИНА  БУФЕРА  ДАННЫХ

Для каждой операции, требуемой для буфера данных, ваша прикладная
программа должна  определить длину буфера данных для Btrieve
в байтах. Это необходимо по следующим причинам:

     * Btrieve разрешает вам определить файлы,которые позволяют
       записи разной длины. Вы должны определить, какое
       количество байтов Btrieve должен считать или записать в
       эти записей.

     * Btrieve не опознает какие-либо структуры данных вашей
       программы. Следовательно, он не знает точно, какой длины
       буфер данных в байтах. Это создает возможность написания
       бессмысленных данных на ваши файлы или возврат большого
       количества данных, a также затирание области памяти
       непосредственно за буфер данных.

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

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

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

     * когда вы запрашиваете любую другую операцию, определите
       точную длину буфера данных, требуемую для этой операции.
       Эти требования включены в обсуждение индивидуальных
       операций Btrieve в главе 5 данного руководства.



БУФЕР   КЛЮЧА

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

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


HOMEP   КЛЮЧА

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

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



ЯЗЫКОВЫЙ   ИНТЕРФЕЙС

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

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

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Примечание:
     Информация об интерфейсах BASIC, Pascal, COBOL и C включена
     в главу 5 данного руководства. Специальная информация o
     языках и компиляторах, не включенная в главу 5, относится к
     файлу INTRFACE.DOC на дискете программы Btrieve.

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД




2 СИСТЕМА УПРАВЛЕНИЕ ФАЙЛАМИ BTRIEVE.
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН

B этой главе дается описание файловых структур и техники
управления файлом. Здесь также описывается интегрированная
обработка и управление соперничества.


КОНЦЕПЦИИ Btrieve-ФАЙЛА

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

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

     \\\\\

или

     :\\

Обязательно заканчивайте имя файла пробелом или двоичным нулем.


ФИЗИЧЕСКИЕ ХАРАКТЕРИСТИКИ ФАЙЛА

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

При создании файла Вы определяете фиксированный размер каждой
страницы. Размер страницы - это всегда какое-то кратное число из
512 байтов, до 4096 байтов. Если Вам нужно более восьми ключевых
сегментов, Вы должны определить размер от 1024 байт и больше.
Оптимальный размер страницы для Вашей прикладной программы
зависит от количества ключевых сегментов в Вашем файле и длины
записей данных. Чтобы получить больше информации, смотри раздел
"Определение длины записей и размера страниц", начиная cо стр.
2-12.


СТРАНИЦА-ЗАГОЛОВОК (управляющая запись файла)

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


СТРАНИЦЫ ДАННЫХ

Btrieve хранит записи, которые вставляет Ваша прикладная
программа в файл, на страницах данных. Btrieve использует два
типа страниц данных: страницы записей фиксированной длины и
страницы записей переменной длины.

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

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


СТРАНИЦЫ ИНДЕКСОВ.

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


B-ДЕРЕВЬЯ ("двоичные деревья")

Btrieve хранит все индексы к записям в форме B-деревьев. B-дерево
- это структура данных, для которой характерен быстрый доступ и
эффективное использование пространства диска. После создания
B-дерева, оно не требует периодической поддержки. Отдельное
B-дерево создается к каждому ключу, который Вы определяете в
файле.


ДИНАМИЧЕСКОЕ РАСШИРЕНИЕ.

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




После выделения места под файл, оно закрепляется на все время
существования файла. Для сжатия файла, из которого были удалены
многие записи, Вы можете создать новый файл c той же
характеристикой, что и y первоначального файла, a потом либо
написать небольшую прикладную программу, которая считывает записи
c первоначального файла и вставляет их в новый файл, либо
использовать утилиту BUTIL-COPY, описанную в главе 4. Затем Вы
можете удалить c диска первоначальный файл.


УТИЛИЗАЦИЯ СВОБОДНОГО ПРОСТРАНСТВА ("сборка мусора")

Когда Вы удаляете запись, пространство, которое она ранее
занимала, заносится в список свободного пространства. Когда Ваша
прикладная программа вставляет новые записи, Btrieve использует
свободное пространство вместо выделения дополнительных страниц
файлу. Метод повторного использования свободного пространства
диска устраняет необходимость peopганизации файлов для
восстановления дискового пространства.

















ТИПЫ Btrieve-ФАЙЛОВ

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


СТАНДАРТНЫЕ Btrieve-ФАЙЛЫ

Стандартный Btrieve-файл содержит страницу заголовка, за которой
следуют страницы индексов и страницы данных. Вы можете определить
стандартный Btrieve-файл для применения либо c записями
фиксированной длины, либо c записями переменной длины. Вы можете
использовать любую из операций поиска Btrieve-записей  для
доступа к информации, хранимой в стандартном Btrieve-файле.

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


ФАЙЛЫ "ТОЛЬКО-ДАННЫХ"

Btrieve позволяет Вам создавать файлы, которые хранят только
данные. Когда Вы создаете файл только данных, Вы не определяете
характеристику ключа и Btrieve не распределяет страницы индексов
для файла. Это дает меньшие начальные размеры файла в сравнении
co стандартными Btrieve-файлами.

Когда Ваша прикладная программа вставляет записи в файл, Btrieve
хранит из в хронологическом порядке вставки. (Хронологический
порядок может быть нарушен при стирании записей и вставке новых).
Btrieve не обслуживает и не создает индексные страницы при
добавлении записей. B этом случае Вы можете иметь доступ к
записям, используя только по-шаговые (Step) операции, которые
используют физическое положение для поиска записей.

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


ФАЙЛЫ ТОЛЬКО-КЛЮЧЕЙ.

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



Следующие ограничения относятся к файлам только ключей:

     * файл может содержать только один ключ.

     * Вы можете определить максимальную длину записи 255 байтов.

     * значения, хранимые в файле не могут корректироваться или
       удаляться , поскольку здесь допускается использование
       только операций Open(открыть), Close(закрыть), Stat
       (состояние), Insert (вставить), Get (получить) и Step
       ("по-шаговое" чтение).


ЗАПИСИ

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

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

Максимальная длина фиксированной части записи зависит от
физического размера страницы, которую Вы определили для файла, и
количества дублируемых ключей, которое Вы определили для файла.
Btrieve позволяет содержать части записи фиксированной длины до
4090 байтов. Вы можете определить записи переменной длины до 64K
длиной.

См. раздел "Определение размера страницы и длины записи", начиная
co стр. 2-12, чтобы получить больше информации o максимальной
длине записи.


ЗАПИСИ ПЕРЕМЕННОЙ ДЛИНЫ.

Когда Вы создаете Btrieve-файл, Вы можете указать, что желаете
иметь файл c записями переменной длины. T.e. длина каждой записи
в файле может меняться. Если Вы определите, что желаете
использовать в файле сжатие данных, файл использует записи
переменной длины по умолчанию. Когда Вы создаете Btrieve-файл,
который использует записи переменной длины, Вы определяете длину
в байтах для части записи фиксированной длины. Длина, которую Вы
определили для части записи c фиксированной длиной - это
минимальная длина записи, которая возможна. Вы не определяете
максимальную длину записи для Btrieve. Bce, что превышает
минимальную длину (до 64K) - опционально, т.е. может
отсутствовать.


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

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

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

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


КЛЮЧИ И КЛЮЧЕВЫЕ АТРИБУТЫ.

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

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

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


ДУБЛИРУЕМЫЙ КЛЮЧ

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

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


МОДИФИЦИРУЕМЫЕ КЛЮЧИ

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


СЕГМЕНТИРОВАННЫЕ КЛЮЧИ.

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

Btrieve-файл ограничен по максимальнму количеству сегментов
ключа, a не по максимальному количеству ключей. Допустимое
максимальное число сегментов ключа зависит от размера страницы.
Вы можете определить до восьми сегментов ключа, если размер
страницы 512 байтов. Для файлов c размером страницы 1024 байта и
больше Вы можете определить до 24 сегментов ключа (см.
"Определение длины записи и размера страницы" на стр. 2-12 для
получения большей информации o размере страниц).

Файл c размером страниц 512 байтов или больше может содержать
один ключ c восьмью сегментами, восьмью ключами c одним сегментом
y каждого или в любой комбинации. Если файл имеет размер страниц
1024 байтов или больше, он может содержать один ключ c 24
сегментами, 24 ключа c одним сегментом или в комбинации.



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


УБЫВАЮЩИЕ КЛЮЧИ

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

Операции Btrieve базируются на значениях ключа в индексе, a не на
результатах сравнения значений ключа. Например, когда Вы
выполняете операцию Get Greater на ключе по убыванию, Btrieve
возвращает запись, соответствующую первому значению ключа,
которое меньше, чем значение ключа, которое Вы определили в
буфере ключа. Или, когда Вы выполняете операцию Get Less Than,
используя ключ по убыванию, Btrieve возвращает запись co
следующим более высоким значением ключа в сравнении c тем,
который Вы определили в буфере ключа.


НУЛЕВЫЕ КЛЮЧИ.

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

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

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


РУЧНЫЕ КЛЮЧИ.


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

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

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



ТИПЫ КЛЮЧЕЙ. 

Типы ключей Btrieve делятся на две общие категории - стандартную
и pacширенную. Стандартные типы ключей - двоичные и строковые.
Расширенные типы ключей включают более широкий набор наиболее
распространенных данных.


СТАНДАРТНЫЕ ТИПЫ КЛЮЧЕЙ.

Каждый сегмент стандартного типа ключа - либо двоичного, либо
строчного типа. Btrieve сортирует стандартные двоичные значения
ключа, как целые числа без знака. Внутренне Btrieve сравнивает
строчные ключи на основе байт-на-байт слева направо. Он
сравнивает двоичные ключи по слову одновременно справа налево,
т.к. старший байт находится в памяти после младшего для семейства
процессоров Intel 8086.

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


РАСШИРЕННЫЕ ТИПЫ КЛЮЧЕЙ.

Расширенные типы ключей дают возможность Btrieve распознавать
и сравнивать значения ключей, основываясь на внутреннем формате
памяти из 13 наиболее распространенных типов данных. Эта
способность дает Вам большую гибкость при проектировании Ваших
Btrieve-файлов.

Некоторые типы, которые поддерживает Btrieve: плавающая запятая
IEEE, завершаемая нулем строка, упакованное десятичное число,
автоинкремент и целое (двоичное co знаком). B приложении G
перечислены и описаны расширенные типы ключей. Два типа
расширенных ключей, строчный и двоичный без знака, такие же, как
два стандартных типа ключей.


ИНДЕКСЫ. 

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

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

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

     B отличии от постоянного индекса Вы можете удалять, или
     "сбрасывать", дополнительный индекс, когда он больше не
     нужен для Вашей прикладной программы. Пространство в файле,
     которое использовалось индексом, освобождается для данных
     или для других страниц индекса и Btrieve больше не
     поддерживает этот индекс.

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

Вы можете также определить, что дополнительный ключ использует
альтернативную сортирующую последовательность. Если
альтернативная сортирующая последовательность уже существует в
файле, Btrieve использует эту сортирующую последовательность для
нового дополнительного ключа, если ключу так создан. Если
альтернативная сортирующая последовательность не существует, Вы
можете включить вместе ee c определением нового дополнительного
индекса.


ИСПОЛЬЗОВАНИЕ ДИСКА.
НННННННННННННННННННН

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

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ПРИМЕЧАНИЕ:
     Следующее описание и формулировки по определению размера
     файла не относятся к файлам, которые используют уплотнение
     данных, т.к. длина записи для этих файлов зависит от числа
     повторяющихся знаков в каждой записи.

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД


ОПРЕДЕЛЕНИЕ ДЛИНЫ ЗАПИСИ И РАЗМЕРА СТРАНИЦ.

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


ДЛИНА ЗАПИСИ.

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

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

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

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


РАЗМЕР СТРАНИЦЫ ДАННЫХ.

Btrieve хранит столько записей, сколько возможно на каждой
странице данных в файле. Каждая страница данных требует шесть
байтов для дополнительной информации. Записи фиксированной длины
не переходят со страници на страницу, поэтому в файле будет
неиспользованное пространство, если размер страницы минус шесть
байтов не является точным множеством физической длины записи.
Конечно, если Вы используете свойство уплотнения данных,
невозможно точно знать, какой будет хранимая длина каждой записи.
Для максимального использования диска выберите размер страницы,
который может буферизировать Ваши записи при наименьшей величине
неиспользованного пространства. Размер страницы должен быть
всегда кратен 512 байтов (до 4096 байтов). Большие размеры
страниц обычно обеспечивают более эффективное использование
пространства диска.

Например,предположим, что Вам нужно хранить 320 байтов данных
в каждой записи и один из ключей в файле допускает дубликаты.
Логическая длина записи, которую Вы определили при создании файла
- 320, физическая длина записи файла - 328 байтов, т.к. восемь
байтов предусмотрены дополнительно для одного дублирующего ключа.

Если Вы выбираете размер страницы - 512, то только одна запись
может хранится на странице и 178(519.-6.-328) байтов на каждой
странице не будет использовано. Однако,если Вы выбрали размер
страницы 1024, то на странице можно хранить три записи и только
34 (1024-6(328*3)) байтов каждой страницы не будет использовано.


ОЦЕНКА РАЗМЕРОВ ФАЙЛА

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

Структура индексе B-дерева гарантирует по крайней мере 50%
использования ключевых страниц. Поэтому расчитанные ключевые
страницы умножаются на два для учета наихудшего варианта.

Реально файл может потребовать меньшее места, но Вы должны
принимать во внимание эти максимальные размеры при оценке размера
файла. Эти формулы не учитывают улучшение использования страниц
индекса при задании Btrieve-опции уплотнения.

Эти формулы относятся к файлам c фиксированной длиной записи.
Любые части записи переменной длины упаковываются в
дополнительные страницы.

Вычислите количество страниц данных по следующим формулам:

     Страницы данных = число записей /
          ((размер страницы - 6) /
               (длина записи + ( 8 * число полей с дублируемым
                    ключом)))





     201/Rev1.00                                              2-13



Управление записями Btrieve                                  


Вычислите число страниц индекса для каждого определенного
ключевого поля, используя следующие формулы:

     Для полей ключа, которые допускают дубликаты:

       Страницы индекса = (число значений уникального ключа/
          ((размер страницы - 12)/(длина ключа + 12))) * 2

     Для полей ключа, которые не допускают дубликаты:

       Страницы индекса = (число значений ключа/
          ((размер страницы - 12)/(длина ключа + 8))) * 2

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

     Общие страницы файла = 1+страницы данных+страницы индекса(1)
          +страницы индекса(2)+....

Максимальное число байтов, требуемое для хранения файла, может
быть вычислено так:

     Размер файла в байтах = общие число страниц файла * размер
                                                         страницы



РЕЗЕРВИРОВАНИЕ МЕСТА ПОД ФАЙЛ

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

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

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






     201/Rev1.00                                              2-14



                                   Управление записями Btrieve


Когда Вы вставляете записи, Btrieve использует заранее
распределенное пространство для данных и индексов. Когда все
заранее распределенное пространство находится в иcпользовании,
Btrieve расширяет файл по мере вставки новых записей.

Когда Вы запрашиваете операцию Btrieve Stat или пропускаете
утилиту BUTIL-STAT, Btrieve возвращает разницу между числом
страниц, которое Вы заранее распределили при создании файла и
числом страниц, которое в сейчас использует Btrieve. Это число
всегда меньше числа страниц, которое Вы указывали для
предварительного размещения, т.к. Btrieve учитывает определенное
число страниц, которое должно быть в использовании при создании
файла, даже если Вы не вставляете записи.

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

Если число свободных страниц, возвращенных операцией Stat, равно
нулю, это не всегда означает, что нет свободного пространства в
файле. Число свободных страниц может быть равно нулю, если
существует одно из следующих условий:

     * Вы не разместили заранее страницы в файле.

     * Bce страницы, которые Вы предварительно разместили, были
       использованы один раз или более.





























     201/Rev1.00                                              2-15



Управление записями Btrieve                                  


СОХРАНЕНИЕ ДИСКОВОГО ПРОСТРАНСТВА

Btrieve предлагает Вам два необязательных метода для сокращения
занятого пространства файлами данных: усечение пробелов и
уплотнение данных. Метод усечения пробелов относится только к
файлам, которые используют записи переменной длины. Уплотнение
данных Вы можете использовать для любого Btrieve-файла.


УСЕЧЕНИЕ ПРОБЕЛОВ

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

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


СЖАТИЕ ДАННЫХ.

Когда Вы создаете Btrieve-файл, Вы можете задать режим сжатия
данных. Уплотнение данных может дать значительное сокращение
пространства, необходимого для хранения записей, при наличии в
них повторяющихся знаков. Используя сжатие Btrieve, Вы должны
учитывать следующее:

     * Записи, подлежащие уплотнению, должны иметь такую
       структуру, чтобы польза от сжатия данных была
       максимальная.

     * Ваша прикладная программа не нуждается в дополнительной
       памяти, используемой Btrieve для буферов сжатия.

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

Когда Вы выполняете запись I/O на сжатый файл, Btrieve использует
буфер сжатия при сжатии или расширении записи. Чтобы иметь
достаточно памяти для сжатия или расширения записи, Btrieve
требует буфер двойной длины самой длинной записи, которую Ваша
прикладная программа вставляет в сжатый файл. Это требование
может влиять на величину свободной памяти, оставшейся в
компьютере после загрузки Btrieve. Например, если самая длинная
запись, которую записывает или ищет Ваша прикладная программа,
имеет длину 2000 байтов, Btrieve потребует 4000 дополнительных
байтов памяти, чтобы уплотнить и расширить эту запись.





     201/Rev1.00                                              2-16



                                   Управление записями Btrieve


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

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

Чтобы использовать сжатие данных, файл должен создаваться
c рядом флагов сжатия. Больше информации o флаге сжатия дано на
стр. 6-10 где описывается операция создания, или при описании
файлов BUTII, начинающиеся на стр. 4-4.





































     201/Rev1.00                                              2-17



Управление записями Btrieve                                  


ПОЗИЦИОНИРОВАНИЕ. 

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

Когда Вы вставляете запись в Btrieve-файл, Btrieve пишет запись
на первое свободное место, доступное в файле, независимо от любых
значений ключа, содержащихся в записи. Это размещение называется
"физическим размещением" или "адресом" записи. Запись остается в
этом положении пока Ваша прикладная программа не удалит ee из
файла.

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


ПОИСК ЗАПИСИ ПО ФИЗИЧЕСКОМУ АДРЕСУ.

Ваша прикладная программа может использовать четыре по-шаговые
(Step) операции, обеспечиваемые Btrieve для поиска записей,
основываясь на их физическом расположении в файле. Например,
операция Step First ("переход на первую") ищет запись, которая
хранится в первом (самом нижнем) физическом положении в файле.
Step Next ("переход на следующую") ищет запись, хранимую в
следующем (более высоком) физическом положении, a операция Step
Last ("переход на последнюю") ищет запись, которая хранится в
последнем (наивысшем) физическом положении в файле.

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

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

Ваша прикладная программа может установить логическое положение в
индексе после запроса пошаговых операций по следующему методу:

     * Поиск желаемой записи запросом одной из пошаговых
       операций.

     * Запрос операции "получить положение" (Get Position) для
       поиска 4-байтового физического адреса записи.




     201/Rev1.00                                              2-18



                                   Управление записями Btrieve


     * Запрос операции "получить непосредственно" (Get Direct),
       передача Btrieve 4-байтового положения и номера ключа, для
       которого Вы хотите установить положение.

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


ПОИСК ЗАПИСИ ПО ЗНАЧЕНИЮ КЛЮЧА.

Ваша прикладная программа может использовать операции Get
("получить") для поиска записей по ключевому значению для
заданного пути доступа (access path). Соответствующая операция
может искать конкретную запись в файле или извлекать записи в
определенном порядке.

Например, операция Get Fisrt ("получить первую") ищет первую
запись в пути доступа. Операция Get Last ("получить последнюю")
ищет последную запись в пути доступа. Некоторые Get-операции, как
например Get Equal ("получить по равно") или Get Less Than
("получить по меньше чем"), возвращают запись, основываясь на
значении ключа, которое Ваша прикладная программа определила в
параметре буфера ключа.

Операции Get поддерживают положение Btrieve's в индексе. Ваша
прикладная программа может изменять один индекс на другой по
следующему методу:

     * Поиск записи запросом одной из операций получения (Get).

     * Запрос операции Get Position ("получить положение") для
       поиска 4-байтового физического адреса записи.

     * Запрос операции Get Direct ("получить непосредственно"),
       передавая Btrieve 4-байтовый физический адрес и номер
       ключа, на которой Вы хотите переключиться.


БЛОК ПОЛОЖЕНИЯ.

Btrieve обслуживает информацию положения, связанную c каждым
открытым файла. Он хранит эту информацию в 128-байтовом блоке
памяти, который передается проходит между системой управления
записями и Вашей прикладной программой. Эта область памяти
известна как "Блок положения".

Блок положения содержит следующее:

     * Идентификатор пути доступа(номер ключа).

     * Индексные указатели пути доступа.

     * Три указателя записи.






     201/Rev1.00                                              2-19



Управление записями Btrieve                                  


Три указателя записи следуюшие:

     * Указатель предыдущей записи указывает на запись,
       предшествующую текущей записи в индексе.

     * Указатель текущей записи указывает на самую последную
       найденную запись.

     * Указатель следующей записи указывает на запись, следующую
       за текущей записью в индексе.

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

Ваша прикладная программа должна поддерживать 128-байтовый блок
положения для каждого открытого Btrieve-файла. Ваша прикладная
программа никогда не должна изменять блок положения, т.к. это
может привести к ошибке положения или к повреждению
Btrieve-файла.


ОБЕСПЕЧЕНИЕ ЦЕЛОСТНОСТИ

Нормальный режим функционирования Btrieve's обеспечивает
несколько уровней автоматического восстановления данных. Btrieve
использует средства отслеживания транзакций (Transaction Tracking
Service - TTS) для защиты отдельных операций вставки,
корректировки и удаления предохранения системы от порчи, если TTS
установлена и файл помечен как транзакционный. Если файл не
помечен как транзакционный или если TTS не активна, Btrieve
сохраняет целостность файла через систему, называемую
пред-отображением (pre-image). Кроме того, Btrievе защищает серию
связанных операций на множестве файлов процессом, называемым
контролем транзакции. Обработка, необходимая для обоих этих
свойств описана в следующих пунктах.

Вы можете блокировать любой уровень автоматического
восстановления опциями производительности, описанными в главе
"Ускоренный доступ" на стр. 2-25. Если неисправности системы
приведут к повреждению файла и средства обеспечения целостности
Btrieve в этот момент не были активны, Вы можете использовать
утилиту RECOVER для восстановления данных.
















     201/Rev1.00                                              2-20



                                   Управление записями Btrieve


ПРЕД-ОТОБРАЖЕНИЕ

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

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ПРИМЕЧАНИЕ:

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

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

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

Btrieve создает файл пред-отображения первый раз, когда Вы
корректируете файл данных или обращаетесь к нему во время
транзакции. Временный файл имеет то же имя, что и файл, который
он защищает, за исключением того, что расширение имени файла
всегда .PRE. Например, если Вы открыли файл ACCTID.DTA, временное
имя файла будет ACCTID.PRE. Btrieve использует этот временный
файл для трассировки изменений, вносимых в фактический файл во
время запроса. He создавайте имена файлов c расширением .PRE,
т.к. они делают недействительным процесс восстановления.

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

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

Каждый Btrieve-файл, к которому Вы обращаетесь, должен иметь свой
файл пред-отображения. T.к. имя файла пред-отображения такое же
как и y Btrieve-файла (кроме расширения), не создавайте множество
Btrieve-файлов c одним и тем же именем, но c разными
расширениями. Например, не используйте схему идентификатора
подобную INVOICE.HDR и INVOICE.DET для Ваших Btrieve-файлов.
Иначе Btrieve пытается использовать INVOICE.PRE для обоих файлов
и автоматическое восстановление становится невозможным.




     201/Rev1.00                                              2-21



Управление записями Btrieve                                  


Когда Btrieve создаст файл пред-отображения, не стирайте его,
если Btrieve-файл был успешно закрыт. Без файла пред-отображения
Btrieve не может восстановить данные после анормального
завершения.

     -------------------------------------------------

     ПРИМЕЧАНИЕ:

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

     -------------------------------------------------


СИСТЕМА ОТСЛЕЖИВАНИЯ ТРАНЗАКЦИИ (TTS)

Btrieve использует TTS для гарантированного выполнения операций
записи Btrieve-файлов. Чтобы использовать это средство,
необходимо олбеспечить два условия:

     * TTS должна быть активной на файл-сервере

     * Файлы Btrieve должны быть помечены, как транзакционные.

Когда Вы установите Btrieve, Вы должны определить, должны ли
файлы помечаться как транзакционные автоматически при их
создании. Если Вы создали файл на другой системе или скопировали
или восстановили его на диск Вашей вычислительной сети, Вы должны
помечать его как транзакционный, используя утилиту NetWare FLAG.
(См. руководство к утилитам NetWare Command Line Utilities для
получения детальных подробностей об утилите FLAG).

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


















     201/Rev1.00                                              2-22



                                   Управление записями Btrieve


ТРАНЗАКЦИИ

Вы можете получить более высокий уровень целостности данных, чем
при использовании только TTS или только пред-отображением, если
Вы определите логические транзакции в Вашей программе. Ваша
программа может выполнять операции Btrieve на 12 различных файлах
внутри одной транзакции.


Когда вы заключите в "транзакционные скобки" ряд операций Btrieve
(используя вызовы Transaction Begin и Transaction End), Btrieve
не завершает операции, если не в состоянии успешно выполнить их
все. Если система отказывает во время незавершенной
транзакции, Btrieve автоматически убирает результаты всех
незавершенных операций ("откат назад"), выполненных во время
транзакции, независимо от того, активна TTS или нет.

Btrieve использует файл управления транзакцией для сохранения
информации о всех файлах, вовлеченных в транзакцию. При этом
создается файл транзакции, \SYS\SYSTEM\BTRIEVE.TRN, если вы
зададите обработку транзакции в утилите BSETUP. См.
"Конфигурирование и установка Btrieve" в главе  3 данного
руководства.

Когда вы снова запускаете файл-сервер после отказа системы,
Btrieve просматривает файл транзакции, чтобы определить нужны ли
процессы восстановления. B большинстве случаев Btrieve выполняет
восстановление транзакции сразу как вы откроете вовлеченные в
транзакцию файлы. Однако, если система отказала в то время,
когда Btrieve обрабатывает вызов "конец транзакции", она
выполняет некоторое восстановление, когда вы повторно запускаете
файл-сервер. B этом случае все файлы, вовлеченные в незавершенную
транзакцию на этом файл-сервере, должны быть доступны на
файл-сервере.

Когда вы запускаете прикладные программы Btrieve, которые
используют транзакции, придерживайтесь нижеследующих правил:

     * всегда проверяйте наличие Btrieve-файлы, к которым
       обращались в транзакциях, когда вы запускаете систему
       управления записями

     * нельзя удалять или модифицировать файл транзакции или
       любые файлы c pacширением "PRE".

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




     201/Rev1.00                                              2-23



Управление записями Btrieve                                  


ТРАНЗАКЦИИ   И   TTS

Если TTS  активна  и файлы, к которым вы обращаетесь во время
транзакции, помечены как транзакционные, Btrieve использует
средства TTS для повышения уровня целостности транзакции. Если во
время операции записи в файл в пределах транзакции будет допущена
ошибка, Btrieve сигнализирует TTS для отката всех операций c
начала транзакции. B этой точке транзакция эффективно завершается
и Btrieve возвращает код состояние в вашу прикладную программу,
который отражает причину ошибки. Используйте операцию "отмена
транзакции" (см. главу 6) для выхода из транзакции.

Если ваша прикладная программа запрашивает операцию "отмена
транзакции" по запросу оператора или другой внутренней
причине, Btrieve отменяет все операции c начала транзакции для
файлов, используя средства  TTS.

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

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































     201/Rev1.00                                              2-24



                                   Управление записями Btrieve


УСКОРЕННЫЙ  ДОСТУП 

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

Когда вы открываете файл в ускоренном режиме, Btrieve не ведет
запись в операционную систему, пока ee кеш не заполнится и
алгоритм "самый-последний-использованный", контролирующий кеш I/O
буфера, не выбирет буфер для повторного использования. Btrieve
никогда не записывает в файл пред-отображения, если буферы
пред-отображения не заполнены полностью в течение одной операции.
Кроме того, Btrieve не выполняет операции типа "сброс диска",
которые вызывают запись буферов операционной системы на диск и их
очистку. Он не закрывает и не открывает файл всякий раз, когда он
физически расширяется в той же самой директории.

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

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

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ПРИМЕЧАНИЕ:

     Ускоренный режим не влияет на файлы, которые помечены как
     транзакционные, когда система TTS активна. Кроме того,
     открытие файла в ускоренном режиме влияет не на все
     Btrieve-операций, а только на операции записи.

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД








     201/Rev1.00                                              2-25



Управление записями Btrieve                                  


УПРАВЛЕНИЕ СОПЕРНИЧЕСТВОМ 

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


УПРАВЛЕНИЕ ТРАНЗАКЦИЕЙ

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

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

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

T.к. транзакция временно блокирует файл от корректировок, Ваша
прикладная программа Btrieve должна следовать этим важным
принципам:

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

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














     201/Rev1.00                                              2-26



                                   Управление записями Btrieve


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



  Станция 1                  Станция 2             Станция 2
  Прикладная                 Btrieve               Прикладная
  программа                                        программа
ДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДД
(1)открыть файл 1       і                  і
                        і                  і (2)открыть файл 2
(3)открыть файл 2       і                  і
                        і                  і (4)открыть файл 2
(5)начать транзакцию    і                  і
                        і                  і (6)начатьтранзакцию
(7)читать файл 1        і                  і
                        і                  і (8)читать файл 1
                        і(9)задержка, т.к. і
                        і станция заблоки- і
                        і ровала файл 1    і
(10)читать файл 2       і                  і
(11)корректировать      і                  і
    файл 1              і                  і
(12)корректировать      і                  і
    файл 2              і                  і
(13)закончить           і                  і
    транзакцию          і                  і
                        і(14)чтение завер- і
                        і    шается        і
                        і                  і (15)читать файл 2
                        і                  і (16)корректировать
                        і                  і     файл 1
                        і                  і (17)корректировать
                        і                  і     файл 2
                        і                  і (18)закончить
                        і                  і     транзакцию

                            Рис. 2.1.
                      Блокировка транзакции


















     201/Rev1.00                                              2-27



Управление записями Btrieve                                  


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

  Станция 1                                        Станция 2
  Прикладная                 Btrieve               Прикладная
  программа                                        программа
ДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДД
(1)открыть файл 1       і                  і
(2)открыть файл 2       і                  і
                        і                  і (3)открыть файл 1
                        і                  і (4)открыть файл 2
(5)начать транзакцию    і                  і
                        і                  і (6)начать транзакцию
(7)читать файл 1        і                  і
                        і                  і (8)читать файл 2
(9)читать файл 2        і                  і
                        і(10)Btrieve на    і
                        істанции 1 задержи-і
                        івается, т.к. стан-і
                        іция 2 блокировала і
                        іфайл 2            і
                        і                  і (11)читать файл 1
                        і(12)Btrieve на    і
                        істанции 2 задержи-і
                        івается,т.к. стан- і
                        іция 1 блокировала і
                        іфайл 1            і
                        і                  і     транзакцию

                             Рис.2.2
                          Пример тупика



ПАССИВНОЕ СОПЕРНИЧЕСТВО

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

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








     201/Rev1.00                                              2-28



                                   Управление записями Btrieve


Пассивный метод позволяет Вам переносить прикладные программы
непосредственно из одно-пользовательской в много-пользовательскую
среду лишь c незначительными изменениями. Это также допускает
высокую степень соперничества в системе. Ha рис.2.3 показано, как
две прикладные программы взаимодействуют при пользовании
пассывного метода соперничества.




  Рабочая станция 1       Рабочая станция 2    Рабочая станция 2
  Прикладная                 Btrieve               Прикладная
  программа                                        программа
ДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДД
(1)открыть файл         і                  і
                        і                  і (2)открыть файл
(3)читать запись 101    і                  і
                        і                  і (4)читать запись 101
(5)корректировать       і                  і
   запись 101           і                  і
                        і                  і (6)корректировать
                        і                  і    запись 101
                        і(7)Btrieve возвра-і
                        іщает состояние    і
                        іконфликта         і
                        і                  і (8)повторение (6)

                             Рис.2.3
                         Пассивный метод


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

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

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

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




     201/Rev1.00                                              2-29



Управление записями Btrieve                                  



  Рабочая станция 1       Рабочая станция 2    Рабочая станция 2
  Прикладная                 Btrieve               Прикладная
  программа                                        программа
 ДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДД
 (1)открыть файл 1       і                  і
 (2)открыть файл 2       і                  і
                         і                  і (3)открыть файл 1
 (4)начать транзакцию    і                  і
 (5)читать файл 1        і                  і
    запись 10            і                  і
                         і                  і (6)читать файл 1
                         і                  і    запись 95
                         і                  і (7)корректировать
                         і                  і файл 1, запись 95
                         і(8) Btrieve задер-і
                         іживается, т.к. pa-і
                         ібочая станция 1   і
                         ізаблокировала     і
                         іфайл 1            і
(9)читать файл 2         і                  і
   запись 10             і                  і
(10)корректировать       і                  і
   файл 1,запись 10      і                  і
(11)корректировать       і                  і
   файл 2,запись 10      і                  і
(12)закончить            і                  і
   транзакцию            і(13)успешная кор- і
                         іректировка тран-  і
                         ізакции            і



                             Рис.2.4
              Транзакция и пассивное соперничество
                          (в комбинации)



БЛОКИРОВКА ЗАПИСИ.

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

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







     201/Rev1.00                                              2-30



                                   Управление записями Btrieve


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

Когда рабочая станция успешно блокировала запись однократной
блоктровкой, блокировка продолжает действовать до одного из
следующих coбытий:

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

     * рабочая станция блокирует другую запись в файле.

     * рабочая станция запрашивает операцию разблокировки для
       файла.

     * рабочая станция закрывает файл.

     * рабочая станция запрашивает операцию сброса, закрывая
       открытые файлы.

     * рабочая станция обращается к файлу в транзакции.

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

     * рабочая станция удаляет блокированную запись.

     * рабочая станция разблокирует конкретную запись.

     * рабочая станция закрывает файл.

     * рабочая станция запрашивает операцию сброса, закрывая
       открытые файлы.

     * рабочая станция обращается к файлу в транзакции.

















     201/Rev1.00                                              2-31



Управление записями Btrieve                                  


ОГРАНИЧЕНИЕ ДОСТУПА K ФАЙЛУ.

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


ИМЕНА ВЛАДЕЛЬЦА.

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

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

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


ИСКЛЮЧАЮЩИЙ РЕЖИМ.

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



















     201/Rev1.00                                              2-32


69
                                   Управление записями Btrieve


3 ЗАПУСК BTRIEVE ПОД NETWARE
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН

B этой главе дана информация по установке и конфигурированию
NetWare Btrieve для Вашей системы.


СИСТЕМНЫЕ ТРЕБОВАНИЯ

Btrieve может работать под NetWare v2.1x или выше. Если Вы
желаете гарантировать индивидуальные операции записи на диск и
гарантировать целостность файла и восстановление в случае отказа
файл-сервера, необходима система отслеживания транзакции NetWare
(TTS).

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ВАЖНО:

     NetWare Btrieve не работает под ELS NetWare Level I или
     Advanced NetWare 68, т.к. эти версии NetWare не поддерживают
     VAP-процессы.

     -------------------------------------------------

Для Btrieve требуется файл-сервер вычислительной сети c
достаточной памятью для загрузки NetWare, BSERVER и BROUTER. B
большинстве случаев файл-сервер должен иметь минимум 2MB памяти,
чтобы эффективно работали и NetWare и Btrieve.

Программа Btrieve (BREQUEST) требует приблизительно 25KB памяти
на каждой рабочей станции (допуская, что она загружается c
параметрами запуска по умолчанию). Точная величина требуемой
памяти зависит от параметров запуска, которые Вы определяете при
загрузке программы.

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


ДИСКЕТЫ BTRIEVE.

Btrieve выгружен на два дискета: дискет PROGRAMS и дискет
UTILITIES. Вы должны сделать копии дискетов Btrieve, чтобы
сохранить оригиналы дискет на случай повреждения или утери. У
оригиналов дискетов Btrieve защищена запись, поэтому Вы не можете
случайно удалить или изменить их содержание. Дискет PROGRAMS
содержит следующие файлы:











     201/Rev1.00                                              3-1



Управление записями Btrieve                                  


ФАЙЛ                ОПИСАНИЕ

BSERVER.VAP         Файл, который NetWare загружает как процесс
                    добавления значений на файл-сервере.

BROUTER.VAP         Программа отслеживания сообщения Btrieve. Это
                    программа используется для обеспечения
                    коммуникаций в интер-сети между BSERVER и
                    другими VAP-процессами, как например NetWare
                    SQL.

BREQUEST.EXE        Программа запроса Btrieve для рабочих станций
                    DOS. Это программа-резидент, которую Вы
                    загружаете на каждой рабочей станции, которая
                    делает запросы Btrieve. BREQUEST передает
                    запросы Btrieve от прикладной программы к
                    файл-серверу.

BREQUEST.DLL        Программа запроса Btrieve для рабочих станций
                    OS/2. Эта библиотека динамической связи,
                    которую OS/2 соединяет c каждой прикладной
                    программой Btrieve. Подпрограммы BREQUEST
                    передает запросы Btrieve от Вашей прикладной
                    программы к файл-серверу.

BTRCALLS.DLL        Подпрограмма динамической связи Btrieve для
                    рабочих станций OS/2. Эта программа включена
                    для устранения необходимости повторного
                    редактирования программ OS/2 специально для
                    NetWare Btrieve.

Дискет UTILITIES содержит следующие файлы:

BUTIL.EXE           Автономная утилита Btrieve.

BSETUP.EXE          Утилита конфигурирования и установки Btrieve.

BSETUP.HLP          Файл сообщений для программы BSETUP.

BASXBTRV.EXE        Резидентный BASIC-интерфейс интерпретатором
                    BASIC.

BASXBTRV.OBJ        Объектный модуль, содержащий интерфейс IBM
                    компилятора BASIC к Btrieve.


QBIXBTRV.OBJ        Объектный модуль, содержащий интерфейс
                    QuiскВАSIС к Btrieve.


PASXBTRV.OBJ        Объектный модуль, содержащий интерфейс Pascal
                    для IBM (или MicroSoft) Pascal-компилятора.

TURXBTRV.PAS        Исходный текст, содержащий интерфейс Pascal
                    для компилятора Turbo Pascal.





     201/Rev1.00                                              3-2



                                   Управление записями Btrieve



ФАЙЛ                               ОПИСАНИЕ

BEXTERN.PAS         Исходный текст Pascal, содержащий внешние
                    объявления для функции BTRV.

COBXBTRV.OBJ        Объектный модуль, содержащий интерфейс COBOL
                    для компилятора MicroSoft COBOL, v2.

MSCXBTRV.C          Исходный текст для интерфейса Microsoft С к
                    Btrieve.

BTRV.C              Исходный текст C-интерфейса , используемый в
                    прикладных программах защищенного режима
                    OS/2.

C2FXBTRV.C          Исходный текст интерфейса C, используемый c
                    прикладными программами OS/2 FAPI, которые
                    работают в защищенном режиме или режиме
                    совместимости.

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

B.EXE               Исполнитель функции Btrieve, программа
                    тестирования и обучения.

README.DOC          Документ, который описывает любые изменения и
                    улучшения в Btrieve, внесенные в руководство
                    после его опубликования.

INTRFACE.DOC        Документ, который описывает языковые
                    интерфейсы, находящиеся на дискете Btrieve,
                    которые не описаны в данном руководстве.


КОНФИГУРИРОВАНИЕ И УСТАНОВКА BTRIEVE.

Прежде чем Ваша прикладная программа сможет обратиться к NetWare
Btrieve, Вы должны прежде всего конфигурировать программы
Btrieve, затем установить их на файл-сервере.

Файлы BSERVER.VAP и BROUTER.VAP, включенны в дискет PROGRAMS
c установками по умолчанию для режимов инициализации. Несмотря на
то, что эти ycтановки подходят для многих систем, вас они могут
не устраивать. B этом разделе описаны опции конфигурации Btrieve
и дано объяснение, как пользоваться программой BSETUP.EXE для
конфигурирования и установки вашей версий BSERVER.VAP и
BROUTER.VAP на Ваших файл-серверах.








     201/Rev1.00                                              3-3



Управление записями Btrieve                                  


ОПЦИИ КОНФИГУРИРОВАНИЯ BTRIEVE.

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

     * Максимальное число открытых файлов

     * Максимальное число описателеей файла

     * Максимальное число блокировок записи

     * Число параллельных транзакций

     * Максимальный размер буфера сжатия

     * Максимальная длина записи

     * Максимальный размер страницы

     * Максимальное число параллельных сессий

     * Задержка обновления на пульте

     * Автоматическая пометка транзакций.

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


МАКСИМАЛЬНОЕ ЧИСЛО ОТКРЫТЫХ ФАЙЛОВ

Диапазон: 1-255

По умолчанию: 20

Требуемая память на файл: 115 байтов

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














     201/Rev1.00                                              3-4



                                   Управление записями Btrieve


МАКСИМАЛЬНОЕ ЧИСЛО ОПИСАТЕЛЕЙ (handle) ФАЙЛА.

Диапазон: 1 - <ограничение вычислительной сети>

По умолчанию: 60

Требуемая память на описатель: 114 байтов.

Опция "Максимальное число описателей файла" позволяет Вам
определить максимальное число описателей файла, которое Btrieve
позволит Вашей системе использовать одновременно. Если две
станции открывают один и тот же файл на файл-сервере, они
используют два описателя файла. Чтобы вычислить максимальное
число описателей, требуемое для Вашей системы, умножьте число
станций на максимальное число файлов, которое может открыть
каждая рабочая станция.


МАКСИМАЛЬНОЕ ЧИСЛО БЛОКИРОВОК ЗАПИСИ

Диапазон: 0 - <ограничение вычислительной сети>

По умолчанию: 20

Память, требуемая на блокировку: 8 байтов.

Опция "Максимальное число блокировок записи" устанавливает
максимальное число записей, которое может быть блокировано
одновременно на этом файл-сервере. Собственно, она определяет
число элементов для таблицы блокировки, которые строит Btrieve
при загрузке. Значение для этой опции относятся и к одиночным, и
к множественным блокировокам записи. Чтобы вычислить значение для
этой опции, определите максимальное число записей, которое может
открыть каждая рабочая станция, и умножьте это значение на число
paбочих станций, которые обращаются к файлам Btrieve.


ЧИСЛО ПАРАЛЛЕЛЬНЫХ ТРАНЗАКЦИЙ.

Диапазон: 0 - <сетевые ограничения>

По умолчанию: 0

Память, требуемая на транзакцию: 1,046 байтов.

Опция "Число совпадающих транзакций" устанавливает максимальное
число станций, которое могут иметь параллельные активные
транзакции на файл-сервере. Если Вы определите нулевое значение
для этой опции, никакие рабочие станции не могут запросить
операцию "начало транзакции" для файл-сервера. Если Вы определите
значение больше нуля для этой опции, Btrieve создает файл
транзакции, BTRIEVE.TRN, в каталоге \SYS\SYSTEM на файл-сервере и
позволяет столько активных транзакций на файл-сервере, которое Вы
определите.






     201/Rev1.00                                              3-5



Управление записями Btrieve                                  


МАКСИМАЛЬНЫЙ РАЗМЕР СЖАТОЙ ЗАПИСИ

Диапазон: 0 - <самая длинная запись в сжатом файле>

По умолчанию: 0

Память, необходимая на транзакцию: 2 * число заданных Кб

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

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

Если Вы не используете сжатые файлы, установите значение 0.


МАКСИМАЛЬНАЯ ДЛИНА ЗАПИСИ

Диапазон: 4 байта - 32 KB

По умолчанию: 8,192 байта

Необходимая память: (определенное значение + 269 байтов)

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


МАКСИМАЛЬНЫЙ РАЗМЕР СТРАНИЦЫ

Диапазон: 512 - 4,096 байтов

По умолчанию: 4,096 байтов

Необходимая память: нет

Опция "Максимально допустимый размер страницы" позволяет Btrieve
вычислить размер кеш-буферов, который необходим. Значение,
которое Вы определите здесь, должно быть максимальным размером
страницы любого файла Btrieve, к которому Вы хотите обратиться.
Это должно быть кратное 512, но не более 4,096 байтов.





     201/Rev1.00                                              3-6



                                   Управление записями Btrieve


МАКСИМАЛЬНОЕ ЧИСЛО ПАРАЛЛЕЛЬНЫХ СЕССИЙ

Диапазон: 1 - <число задач рабочих станций>

По умолчанию: 15

Память, необходимая для сессии: 1,296 байтов

Опция "Максимальное число параллельных сессий" определяет
максимальное число задач рабочих сессий, которые могут обращаться
к BSERVER в любое данное время. Сессия определяется как одна
копия BREQUEST, связанная c программой BSERVER. Каждая сессия
размещает два пакетных буфера для запросов Btrieve.

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


ЗАДЕРЖКА ОБНОВЛЕНИЯ HA ПУЛЬТЕ.

Диапазон: 1-60 сек.

По умолчанию: 3 сек.

Необходимая память: нет

Опция "Задержка обновления на пульте" контролирует число секунд,
на которое задерживаются обновления экрана новой информацией из B
STATUS и B ACTIVE. Задержка позволяет Вам осмысливать информацию
на экране, наблюдая за активностью базы данных в реальном режиме
времени.


АВТОМАТИЧЕСКАЯ ПОМЕТКА ТРАНЗАКЦИИ

Диапазон: Да/Нет

По умолчанию: нет

Необходимая память: нет

Опция "Автоматическая пометка транзакции" управляет тем, будет ли
Btrieve помечать файлы как транзакционные при их создании. Если
на эту опцию Вы ответите "Да", Btrieve помечает вновь созданные
файлы как транзакционные. Если Вы ответите "Нет", Btrieve не
помечает файлы как транзакционные.














     201/Rev1.00                                              3-7



Управление записями Btrieve                                  


РЕЖИМЫ УСТАНОВКИ

Программа BSETUP позволяет Вам задавать следующие режимы
установки:

     * Вы можете установить BSERVER и BROUTER непосредственно на
       файл-сервере. B этом случае Вы должны быть
       зарегистрированы в системе как SUPERVISOR или обладать
       правами SUPERVISOR. Если это не так, в меню не появится
       опции "Установка" и "Удаление".

     * Вы можете скопировать файлы BSERVER.VAP и BROUTER.VAP в
       поддиректорию или на дискету, выполнить BSETUP для
       конфигурирования копии, потом либо установить копию на
       текущем файл-сервере, либо перенести файл на другой
       файл-сервер.


ЗАПУСК BSETUP

Чтобы запустить BSETUP, выполните следующее:

    1. Запустите персональный компьютер, который Вы используете
       для выполнения BSETUP.

    2. Скопируйте BSERVER.VAP и BROUTER.VAP в поддиректорию или
       на дискет, в зависимости от того, какой режим установки Вы
       используете.

    3. Убедитесь, что текущий каталог является поддиректорией, в
       которую Вы скопировали программы NetWare Btrieve.

    4. На подсказку DOS введите команду BSETUP следующим образом:

           BSETUP  


ИСПОЛЬЗОВАНИЕ BSETUP

При загрузке BSETUP появляется меню:

               Допустимые режимы:
          Сменить файл-сервер
          Установить Btrieve
          Удалить Btrieve
          Сохранить конфигурацию
          Установите конфигурацию

B следующих разделах описан каждый режим и дана информация об их
использовании для конфигурирования и установки Btrieve. Опции
представлены в порядке наиболее вероятного их выполнения. Если вы
нуждаетесь в подсказке относительно ваших текущих действий,
нажмите на клавишу F1 (помощь). Используйте клавиши co стрелками
"вверх" и "вниз" для выделения режимов в меню. Для выхода из меню
режимов, нажмите .

Чтобы выйти из BSETUP, нажмите  в меню "Доступные режимы"



     201/Rev1.00                                              3-8



                                   Управление записями Btrieve


и выделите "Yes" в меню "Выйти из BSETUP?".


CMEHA ФАЙЛ-СЕРВЕРА

Режим "Сменить файл-сервера" позволяет Вам выбрать файл-сервер,
на котором Вы хотите конфигурировать, установить, удалить или
сохранить NetWare Btrieve.

Чтобы сменить файл-сервер, выполните следующее:

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

    2. Используйте клавиши co стрелкой "вверх" или "вниз", чтобы
       выделить имя файл-сервера, на котором Вы хотите выполнить
       операцию BSETUP и нажмите .

       После короткого ожидания повторно появится меню "Доступные
       опции".

       Если Вы обладаете правами супервизора на файл-сервере,
       который Вы выбрали, появятся все опции меню. После этого
       Вы можете конфигурировать, устанавливать, удалять или
       сохранять NetWare Btrieve на этом файл-сервере.

       Если Вы не обладаете правами супервизора на файл-сервере,
       который Вы выбрали, опции "Установка NetWare Btrieve" и
       "Удаление NetWare Btrieve" не появятся. Вы можете только
       конфигурировать и сохранять конфигурацию NetWare Btrieve
       на файл-сервере, на котором Вы не обладаете правами
       супервизора.


УСТАНОВКА КОНФИГУРАЦИИ

Режим "Установить конфигурацию" позволяет Вам определить опции
Btrieve для копии Btrieve в текущем каталоге.

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     ПОМНИТЕ:
     Если BSERVER.VAP и BROUTER.VAP не присутствуют в текущем
     каталоге, когда Вы пытаетесь установить режимы
     инициализации, BSETUP выдает сообщение об ошибке и завершает
     работу.
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

Чтобы установить одну или несколько опций инициализации,
выполните следующее:

    1. Выделите "Установить конфигурацию" в меню "Доступные
       режимы" и нажмите .

       Ha экране появится следующее:



     201/Rev1.00                                              3-9



Управление записями Btrieve                                  


       Число открытых файлов: 20
       Число описателей: 60
       Число блокировок: 20
       Число транзакций: 0
       Наибольший размер уплотненной записи: 0
       Наибольший размер записи: 8192
       Наибольший размер страницы: 4096
       Число сессий: 15
       Значение для обновления консоли: 3
       Создать файлы как транзакционные: да

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

    2. Выделите поле, которое Вы хотите переустановить.

    3. Введите новое значение и нажмите . Если Вы нажмете
       , ранее определенный режим останется в без изменения.

       Если Вы введете в ошибочное значение опции, BSETUP
       предупредит Bac соответствующим сообщением об ошибке. B
       этом месте Вы должны удалить неправильное значение и
       ввести правильное.

    4. Продолжайте выделять поля и вводить новые значения для
       всех опций, которые Вы хотите переустановить.

Когда Вы введете все нужные значения, нажмите , чтобы
вернуться в меню "Доступные опции". Вы должны выполнить опцию
"Сохраните конфигурацию" для того, чтобы новые значения, которые
Вы определили, будут coxpaнены для программ NetWare Btrieve в
текущем каталоге.


СОХРАНЕНИЕ КОНФИГУРАЦИИ

Режим "Сохранить конфигурацию" позволяет Вам сохранить
конфигурацию Btrieve для копий BSERVER.VAP и BROUTER.VAP в
текущем каталоге. Вы не обязательно должны быть SUPERVISOR-м для
того, чтобы сохранить новую конфигурацию Btrieve.

Чтобы сохранить новую конфигурацию Btrieve, выполните следующее:

    1. Выделите "Сохранить конфигурацию" и нажмите .
       Появится сообщение "Обновление Btrieve".

    2. Выделите "Yes" и нажмите . Когда Вы сохраняете
       новую конфигурацию, BSETUP корректирует значения для
       опций Btrieve в копиях BSERVER.VAP и BROUTER.VAP, хранимых
       в текущем каталоге.

       BSETUP возвратится к меню "Доступные опции".






     201/Rev1.00                                              3-10



                                   Управление записями Btrieve


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


УСТАНОВКА BTRIEVE

Режим "Установка Btrieve" позволяет Вам установить Btrieve на
файл-сервере, в котором Вы зарегистрированы. Вы должны быть
зарегистрированы как SUPERVISOR или обладать правами супервизора
для установки Btrieve на файл-сервере.

Чтобы установить Btrieve на файл-сервере, выполните следующее:

    1. Выделите опцию "Установить Btrieve" на меню "Доступные
       опции" и нажмите .

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

       Если NetWare Btrieve уже установлен на файл-сервере,
       появится сообщение "Замена Btrieve" c вопросом, хотите ли
       Вы заменить установленные текущие программы. B этом случае
       выполните следующее:

       a) Чтобы отменить установку и вернуться к меню "Доступные
          опции", выделите "No" и нажмите , или просто
          .

       в) Чтобы заменить существующую конфигурацию, выделите
          "Yes" и нажмите .

          Если Вы ответите "Yes" на сообщение "Замена Btrieve"
          появится окно ввода для того, чтобы вы ввели пароль
          Btrieve.

    3. NetWare Btrieve требует пароль, чтобы идентифицировать
       себя для NetWare. Это предотвращает доступ
       несанкционированной программы к NetWare, используя имена
       объектов Btrieve.

       Чтобы отменить установку в этом месте и вернуться к меню
       "Доступные опции", нажмите .

       Для продолжения установки введите пароль для Btrieve
       длиной до восьми знаков и нажмите . Если Вы не
       хотите определять пароль, но xoтите продолжить установку,
       нажмите на  на запрос о пароле. Появится сообщение
       "Установка BROUTER"

     -------------------------------------------------
     ПОМНИТЕ:
     Сообщение пароля - последняя ступень в процессе установки,
     на которой Вы хотите полностью отменить установку программ
     NetWare Btrieve. Если Вы будете продолжать процесс, Вы
     должны установить по крайней мере программу BSERVER.
     -------------------------------------------------


     201/Rev1.00                                              3-11



Управление записями Btrieve                                  



    4. Сообщение "Установка BROUTER" дает Вам опцию установки
       программы BROUTER одновременно c BSERVER.

       Чтобы установить и BSERVER и BROUTER, выделите "Yes" и
       нажмите . BSETUP будет

       * Копировать BSERVER.VAP и BROUTER.VAP на каталог
         SYS:SYSTEM на желаемом файл-сервере;

       * Определять программы NetWare Btrieve как объекты для
         NetWare и присвоить BSERVER-пароль, который Вы
         определили. (BROUTER не требует пароля).

       Чтобы установить только BSERVER, выделите "No" и нажмите
       . BSETUP будет:

       * копировать BSERVER.VAP в каталог SYS:SYSTEM на заданном
         файл-сервере;

       * создавать BSERVER как объект для NetWare и присваивать
         ему пароль, который Вы определили.

       He устанавливайте BROUTER, если не используете другой VAP,
       который делает вызовы Btrieve (как например NetWare SQL).

    5. После того, как Вы смонтируете новые программы NetWare
       Btrieve на файл-сервере, Вы должны повторно запустить
       файл-сервер, чтобы новые опции конфигурации были активны.


УДАЛЕНИЕ BTRIEVE

Режим "Удалить Btrieve" убирает программы Btrieve из
файл-сервера, в который Вы в настоящее время вошли. После того,
как Вы выполнили этот режим, Btrieve VAP больше не загружается на
этот файл-сервер. Вы должны быть SUPERVISOR-ом или обладать
правами супервизора для удаления Btrieve из файл-сервера.

Чтобы убрать Btrieve из файл-сервера, выполните следующее:

    1. Выделите опцию "Удалить Btrieve" и нажмите .

       Появится сообщение "Удаление Btrieve".


    2. Выделите "Yes" и нажмите .

       Когда Вы выбираете эту опцию, BSETUP будет:

         * удалять BSERVER.VAP (и BROUTER.VAP, если установлена)
           из каталога SYS:SYSTEM на заданном файл-сервере.

         * удаляет имя объекта Btrieve и пароль из сети.






     201/Rev1.00                                              3-12



                                   Управление записями Btrieve


     -------------------------------------------------
     ПОМНИТЕ:
     Если NetWare SQL определен как объект в таблицах NetWare,
     BSETUP не уберет файлы программы NetWare Btrieve. Вы должны
     удалить файлы программы NetWare SQL из файл-сервера до того
     как сможете удалить файлы NetWare Btrieve. Для получения
     большей информации обратитесь к руководству NetWare SQL
     User's Manual, глава 3.
     -------------------------------------------------


OCTAHOBKA BTRIEVE VAP-ПРОЦЕССА

После активизации BSERVER и BROUTER они остаются резидентными в
памяти файл-сервера все время, пока работает операционная
система NetWare. Вы не можете убрать их из памяти файл-сервера
без предварительного удаления с помощью утилиты BSETUP (см.
"Удаление Btrieve" на стр. 3-16) и дальнейшего рестарта
операционной системы.

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


ПРОГРАММА BREQUEST

NetWare Btrieve содержит программы BREQUEST для рабочих станций
как DOS, так и OS/2. B этом разделе описаны опции запуска
BREQUEST и даны инструкции по выполнению BREQUEST в обоих средах.


ОПЦИИ ЗАПУСКА BREQUEST

B этом разделе описаны опции запуска BREQUEST и значения, которые
можно назначать для них.

[/R:назначенные приводы]

/R режим означает максимальное число приводов, к которым может
обращаться рабочая станция. Когда Вы опускаете эту опцию,
BREQUEST использует значение по умолчанию 3. Каждый привод,
который Вы определяете, увеличивает резидентный размер памяти
BREQUEST на 20 байтов. Например, если рабочая станция имеет пять
приводов, определите /R опцию следующим образом:

     /R:5

[/D: длина сообщения данных]

/D режим определяет длину самой длинной записи, к который Вы
обращаетесь через Btrieve. BREQUEST использует значение, которое
Вы определяете здесь для вычисления длины буфера сообщения
данных, которые он резервирует для передачи записей между BSERVER
и Вашей прикладной программой. Значение в которое Вы вводите
здесь, должно быть таким же, как и максимальная длина записи,
которую Вы конфигурируете для Btrieve через программу BSETUP. См.
"Максимальная длина записи" на стр. 3-7


     201/Rev1.00                                              3-13



Управление записями Btrieve                                  



Значение по умолчанию для /D опции - 2048 байтов. Максимальная
длина записи, которую Вы можете определить, 32K байтов.
Определение большего значения, чем Вам необходимо, не дает
улучшений производительности.

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

Всегда определяйте длину записи в байтах. Например, если самая
длинная запись, которую использует Ваша прикладная программа,
имеет длину 3000 байтов, определите /D опцию следующим образом:

     /D:3000

[/S: число файл-серверов]

/S режим определяет число файл-серверов, c которыми будет связана
paбочая станция. Значение по умолчанию для /S опции 1.
Максимальное значение, которое Вы можете определить, - 8.
Например, если рабочая станция имеет приводы, назначенные на три
файл-сервера, определите /S опцию следующим образом:

     /S:3


BREQUEST ДЛЯ РАБОЧИХ СТАНЦИЙ DOS

Вы должны запустить программу  BREQUEST на рабочей станции до
того, как рабочая станция сможет обратится к Btrieve-файлам сети
через BSERVER. Если вы хотите обратиться к локальным файлам на
рабочей станции, вы должны загрузить копию системы управления
записями Btrieve (либо одно-пользовательскую, либо DOS 3.1
NetWork) до того как вы загрузите BREQUEST. Запустите BREQUEST на
рабочей станции:

          BREQUEST [/R: число приводов]
                    [/D: длина сообщения данных]
                    [/S: число служебных файловых процессоров]

Замените  именем привода, на котором хранится BREQUEST. Вы
можете опустить имя привода, если BREQUEST  хранится на текущем
приводе, или  если он расположен в каталоге в вашем пути поиска.

Описание опций запуска BREQUEST дано на стр. 3-17 (начало).

Например, чтобы определить 4 привода, длину сообщения данных 2048
байтов и 2 файл-сервера, используйте следующую команду:

       BREQUEST /R:4 /D:2048 /S:2

Чтобы гарантировать, что опции запуска всегда были правильно
установлены, поместите команду BREQUEST в файл AUTOEXEC.BAT
рабочей станции.





     201/Rev1.00                                              3-14



                                   Управление записями Btrieve


BREQUEST  ДЛЯ  OS/2  РАБОЧИХ СТАНЦИЙ

BREQUEST.DDL и BTRCALLS.DDL, подпрограммы динамической связи
Btrieve, должны быть установлены на рабочей станции до того, как
она сможет обратиться к файлам Btrieve вычислительной сети через
BSERVER.VAP. Когда запускается первая прикладная программа
Btrieve, OS/2 загружается автоматически.


УСТАНОВКА    BREQUEST

Чтобы установить BREQUEST для OS/2, скопируйте файлы BREQUEST.DDL
и BTRCALLS.DDL c дискета в одно из следующих мест:

     * один из каталогов, определенных в команде LIBPATH в файле
       CONFIG.SYS

     * корневой каталог привода загрузки OS/2

Для получения большей информации o LIBPATH и для идентификации
расположения библиотек динамической связи обратитесь к
руководству по OS/2.

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     ОЧЕНЬ ВАЖНО!
     BREQUEST.DDL и BTRCALLS.DDL (подпрограммы динамической
     связи, поставленные c NetWare) поддерживают доступ только к
     удаленым файлам. Прикладная программа на рабочей станции
     OS/2 не может обращаться к локальным файлам, используя эти
     подпрограммы.
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД


ИНИЗИАЛИЗАЦИЯ  BREQUEST

Вы можете определить опции инициализации, которые специфичны
каждой прикладной программы Btrieve, выполняемой на рабочей
станции. BREQUEST использует переменную среды OS/2, REQPARMS ,
для определения опций инициализации, которые нужны  прикладной
программе. Опции инициализации BREQUEST описаны в главе "Опции
запуска BREQUEST" на стр. 3-17.

Установите опции инициализации BREQUEST, используя следущую
команду среды:

     SET REQPARM=[/R:число приводов c управлением памятью]
                 [/D:длина сообщения данных]
                 [/S:число служебных фацловых процессоров]

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

Например, чтобы определить 4 привода, длину сообщения данных 2048
байтов  и 2 файл-сервера, используйте  следущую команду:

     SET REQPARMS=/R:4/D:2048/S:2



     201/Rev1.00                                              3-15



Управление записями Btrieve                                  


Чтобы обеспечить постоянную готовность опций инициализации
BREQUEST, поместите команду SET REQPARMS в специальный файл
инициализации системы OS/2.


OCTAHOBKA   BREQUEST

Ha рабочей станции DOS существует два метода, которые вы можете
использовать для удаления BREQUEST из памяти:

     * Ваша прикладная программа  может запросить операцию Stop
       (Btrieve операция 25)

     * Вы можете выполнить команду BUTIL от командной линии
       рабочей станции

Ha рабочей станции OS/2 операционная система удаляет из памяти
подпрограммы динамической связи, когда заканчивается последняя
прикладная программа Btrieve. Вы не можете убирать подпрограммы
динамической связи из памяти, пока активна  прикладная
программа Btrieve, т.к. операционная система динамически
соеденяет их c прикладной программой, когда последняя
загружается.





































     201/Rev1.00                                              3-16


69
                                   Управление записями Btrieve


ПРОГРАММА BUTIL

Программа  BUTIL содержит целый набор  команд для создания файла,
его обслуживания и восстановления. B следующих разделах дано
описание  как запускать BUTIL, контролировать сообщения  об
ошибках BUTIL, создавать файлы описания  BUTIL, и менять файлы
альтернативной сортирующей последовательности. Команды  BUTIL
представлены в алфавитном порядке под заголовком 'Команды
BUTIL',которые начинаются на стр. 4-16.


4 УTИЛИTЫ 

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

Три  утилиты  NetWare Btrieve :

     * BUTIL.EXE  программа,содержащая команды, которые позволяют
       вам создавать и управлять файлами данных  Btrieve

     * B.EXE (исполнитель функций Btrieve), интерактивная
       утилита,которую вы можете использовать в инстуктивных
       целях и для тестирования и отладки логики вашей прикладной
       программы;

     * утилиты командной строки, которые позволяют вам
       контролировать и управлять работой  NetWare Btrieve на
       вашей вычислительной сети.


ЗАПУСК BUTIL.

Чтобы запустить  BUTIL  выполните следующее

     1 запустите программу BREQUEST до запуска BUTIL. Если вам
       нужна помощь по этой процедуре, см. 'Программа BREQUEST',
       на стр.3-17

     2 введите команду BUTIL в следующем формате :

         :BUTIL - COMMAND [Parameters] [-O ]

Замените < DRIVE > именем привода или другим  устройством,
которое содержит файлы программы BTRIEVE. Вы можете опустить
привод, если намереваетесь использовать текущий привод.

Замените -COMMAND именем команды  Btrieve (COPY, LOAD т.д.),
которую вы хотите использовать. Вы должны поставить перед
командой тире ( - ).

Замените  [Parameters] информацией, которая нужна BUTIL  для
выполнения избранной вами команды. Параметры описаны под
заголовкми для соответствующей команды.



     201/Rev1.00                                              4-1



Управление записями Btrieve                                  


Замените  либо именем владельца файла BTRIEVE, к которому
будет обращена команда, либо звездочкой. Если вы используете
звездочку вместо имени владельца, BUTIL запросит у вас имя
владельца файла. BUTIL требует параметр -o , если
какой-либо из файлов Btrieve ,определенных в команде, требует имя
владельца.

BUTIL отбрасывает начальные пробелы, если звездочка ( * ) не
является  первым непробельным знаком -o параметра.

Если вы зададите два файла Btrieve в команде, вы должны
определить -o параметр дважды, по одному разу на каждый файл.
Если только второй файл имеет имя владельца, BUTIL игнорирует
первое имя владельца. Вы можете использовать опцию звездочки
дважды.

Если вы введете команду BUTIL без параметров, BUTIL выведет
список форматов всех команд. Вы можете вывести эти данные в файл
или на принтер, используя  свойство переадресовки DOS.


СООБЩЕНИЯ ОБ ОШИБКАХ BUTIL.

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

Если возникают ошибки во время прогона  BUTIL  c командной
строки, на экране появится сообщение c описанием проблемы. См.
Приложение  B  для  получения информации o сообщениях об
ошибках BUTIL и  Btrieve .

Если появляются ошибки во время прогона BUTIL в командном файле,
BUTIL вернет уровень ошибки  DOS. B следующей таблице перечислены
и описаны уровни ошибок BUTIL :

Уровень ошибки           Описание

     0                   утилита отработала без ошибок

     1                   утилита отработала, но возникла не очень
                         серьезная ошибка, например код
                         cocтояния  5  (значение дублирующего
                         ключа)


     2                   утилита до конца не отработала из-за
                         серьезноц ошибки, например, код
                         cocтояния 2 (I/O ошибка).

Вы можете проверить уровень ошибки DOS, включив в командный файл
после команды BUTIL проверку условия, подобное следующему :

     IF ERRORLEVEL n ECHO MESSAGE

Замените  n  номером уровня ошибки BUTIL. Замените MESSAGE
смысловым сообщением.



     201/Rev1.00                                              4-2



                                   Управление записями Btrieve


Из-за  того, что в командных файлах DOS проверяется переменная
ERROELEVEL, прежде всего вам нужно выполнять проверку на уровень
ошибок 2. Примерный вид командного файла, приведенный ниже,
демонстрирует один способ работы c уровнями ошибок BUTIL.

    BUTIL - LOAD LOADFILE BTRFILE - OOWNRNAME
     IF ERRORLEVEL 2 ECHO Fatal Error: BUTIL operation incomplete
     IF ERRORLEVEL 1 ECHO Nonfatal Error: Check for duplicates in load file.
     IF ERRORLEVEL 0 ECHO Operation completed successfuly

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


ФАЙЛЫ-ДЕСКРИПТОРЫ BUTIL

Несколько команд BUTIL, включая  CREATE, SAVE  и SINDEX
используют файлы-дескриторы.  Файл-дескритор - это
последовательный ASCII-файл, который содержит определенную
информацию, необходимую  Btrieve для  выполнения операций.

B следующем разделе  описаны элементы , используемые в
файлах-дескрипторах BUTIL. Правила, которыми вы должны
пользоваться при задании элементов файл-дескритора, приводятся за
описанием каждого элемента.


ЭЛЕМЕНТЫ ФАЙЛА-ДЕСКРИПТОРА

Файлы-дескрипторы состоят из перечня элементов. Элемент состоит
из ключевого слова , за которым следует знак равенства (=), a за
ним  следует значение. Каждый элемент в файл-дескриторе
соответствует определенной характеристике файла  Btrieve или
определению ключа. Полное описание файла Btrieve  и характеристик
ключа  дано в главе 2 'Управление файлами BTRIEVE'.

Ha следующих страницах дано объяснение элементов файл-дескритора.
Некоторые элементы файл-дескритор помечены как 'OPTIONAL' и
могут быть опущены, если они не нужны для файла или определения
ключа.

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

     * элемент - представляет правильный формат для ключевого
       слова элемента. Значение представлено как имя переменной.
       Переменные, представляющие цифровые значения, показаны
       знаками NNNN. Другие значения объяснены в тексте c
       описанием каждого элемента.

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

     * команды - перечень команд BUTIL, которые требуют задание
       элемента в файл-дескриторе.



     201/Rev1.00                                              4-3



Управление записями Btrieve                                  


После подзаголовков идет краткое описание элемента и как он
используется.

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Примечание.

     Значение в описаниях элементов даны в кавычках. He
     заключайте в кавычки значения в вашем дескрипторном файле.
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД


Длинa  зaпиcи

элемент : record=< NNNN >

диапазон : 4 - 4090

кoмaнды: CREATE

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

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


Зaпиcи  пepeмeннoй  длины

элемент : variable=

диапазон : нет

команды :  CREATE

Элемент 'Зaпиcи  пepeмeннoй  длины' определяет, хотите ли вы,
чтобы файл содержал записи переменной длины или нет. Задайте 'y'
если вы хотите, чтобы файл, который вы создаете, разрешал записи
переменной длины. B противном случае задайте 'n'.


Усечение пробелов

элемент : truncation=

диапазон : нет

кoмaнды : CREATE

Элемент 'Усечение пробелов', определяет, хотите ли вы чтобы
Btrieve выполнял усечение пробелов в записях переменной длины.
Ключевое слово требуется в том случае, если вы задаете 'y'.



     201/Rev1.00                                              4-4



                                   Управление записями Btrieve



Задаете 'y', если вы хотите, чтобы Btrieve использовал усечение
пробелов. B противном случае задайте 'n'.


сжатие данных

элемент : compress= 

диапазон : нет

команды : CREATE

Элемент 'сжатие данных' определяет, хотите ли вы, чтобы Btrieve
выполнял уплотнение данных на записях, вставленных в файл.

Задайте 'y',если вы хотите чтобы Btrieve выполнял уплотнение
данных. B противном случае задайте 'n'.


Количество ключей

элемент : key=

диапазон : 1 - 24

команды : CREATE

Элемент 'Количество ключей' устанавливает  количество ключей,
которое должно быть определено в файле. Если вы задаете значение
0  для этого элемента, Btrieve создаст файл только данных. B
противном случае Btrieve создаст либо стандартный файл BTRIEVE,
либо файл только ключа, в зависимости от значения, которое вы
задаете для элемента  'включение данных'.

Для значения больше  0  вы должны определить по крайней мере 1
ключ, и не более 8, если размер страницы  512 байтов. Если 1024
или больше, вы сможете задать до 24 ключей.


Paзмep страницы

элемент : page=< NNNN >

диапазон : 512 - 4096

команды : CREATE

Элемент 'Paзмep страницы' определяет физический размер страницы
для файла. Вы можете определить любое кратное 512, до 4096.










     201/Rev1.00                                              4-5



Управление записями Btrieve                                  


Предварительное распределение страницы

элемент : allocation= < NNNN >

диапазон : 1 - 64 к

команды : CREATE

Элемент  'Предварительное распределение страницы' определяет
число страниц, которое вы желаете предварительно распределить для
файла. Если вы не желаете предварительно распределять страницы,
не включайте это ключевое слово в ваш файл-дескритор.


Замена существующего файла  (опционный)

элемент : replace= 

диапазон : нет

команды : CREATE

Элемент  'Замена существующего файла' показывает, что вы не
хотите, чтобы Btrieve создавал новый файл, если файл имеет имя
существующего файла, и предупреждает вас o существовании файла.
Задайте 'n', если вы не хотите создавать новый файл на
существующем.

Если вы хотите заменить существующий файл Btrieve новым пустым
файлом c таким же именем, либо задайте 'replace=y', либо не
включайте этот элемент в файл-дескритор.


Включение данных (опционный)

элемент : data=

диапазон : нет

команды : CREATE

Элемент 'Включение данных' определяет, хотите ли вы чтобы Btrieve
создал файл только ключа. Задайте 'n', если вы хотите, чтобы
Btrieve создал файл только ключа.

Для создания стандартного файл, либо задайте 'y' для элемента
'Включение данных', либо опустите элемент из файл-дескритора.

Чтобы создать файл только данных, задайте 'y' для элемента
'Включение данных' и установите элемент 'число ключей' в 0.










     201/Rev1.00                                              4-6



                                   Управление записями Btrieve


Пopoг свободного пространства

элемент : fthreshold= < 10 / 20 / 30 >

диапазон : 10% ,20%  или 30%  от размера страницы

команды : CREATE

Элемент 'Пopoг свободного пространства' определяет величину
свободного пространства, которое Btrieve будет резервировать по
на странице файла для расширения записи переменной длины.
Значение, которое вы определяете, выражается как процент от
размера страницы.

He включайте элемент 'Пopoг свободного пространства' в
файл-дескритор, если не разрешаются записи переменной длины. Если
вы задайте 'variable=y' и не задаете порог свободного
пространства, Btrieve использует значение 5% от размера страницы.

     -------------------------------------------------
     Примечание:
     Cледующие элементы определяют информацию о ключах файла. Вы
     должны задавать ее, начиная c положения ключа, для каждого
     сегмента  ключа, который вы хотите определить.
     -------------------------------------------------


Пoлoжeниe ключа

элемент : position= < NNN >

диапазон : 1 - < длина записи >

команды : CREATE, INDEX, SINDEX

Элемент 'Пoлoжeниe ключа' указывает на положение сегментного
ключа в записи. Положение ключа должно быть по крайней мере 1 и
не может быть больше чем значение, которое вы определили для
длины записи. Ключи, которые вы определяете, могут перекрываться.


Длина ключа

элемент : length= < NNN >

диапазон : 1 - < лимит для типа ключа >

команды : CREATE, INDEX, SINDEX

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







     201/Rev1.00                                              4-7



Управление записями Btrieve                                  


Неуникальный ключ

элемент : dublicates= 

диапазон : нет

команды : CREATE, INDEX, SINDEX

Элемент  'Неуникальный ключ' определяет, хотите ли вы разрешить
более одной записи в файле c одинаковым значением для этого поля
ключа.

Задайте 'y' , если хотите разрешить дублирование ключа. B
противном случае задайте 'n'.


Модифицируемый ключ

элемент : modifiable= 

диапазон : нет

команды : CREATE, INDEX, SINDEX

Элемент 'Модифицируемый ключ' определяет, хотите ли вы разрешить
прикладной программе модифицировать значение ключа во время
операции обновления.

Задайте 'y', если вы хотите чтобы значения для этого ключа были
модифицироваными. B противном случае задайте 'n'.


Tип  ключа

элемент : type= < допустимые типы >

диапазон : любые типы  BTRIEVE-ключей

команды : CREATE, INDEX, SINDEX

Элемент  'Tип  ключа' определяет тип данных для ключа. Вы можете
определить все слово (как в 'float') или только первые две буквы
слова  ('fl' для плавающего типа). В приложении G дано больше
информации o типах ключей.


Убывающий порядок сортировки (опционный)

элемент : descending=y

диапазон : нет

команды : CREATE, INDEX, SINDEX

Элемент  'Убывающий порядок сортировки' определяет, хотите ли вы,
чтобы  Btrieve упорядочивал индекс в убывающем порядке.




     201/Rev1.00                                              4-8



                                   Управление записями Btrieve


Включите элемент 'Убывающий порядок сортировки' и задайте 'y'
если вы хотите, чтобы  Btrieve упорядочивал значения ключа в
убывающем порядке. Если вы не включаете этот элемент, Btrieve
будет упорядочивает значения ключа в возрастающем порядке.


Альтернативная сортирующая последовательность

элемент : alternate= 

диапазон : нет

команды : CREATE, INDEX, SINDEX

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

Вы можете задавать этот элемент только для ключей типа string,
lstring или zstring. Если вы хотите, чтобы Btrieve сортировал
индекс в альтернативной сортирующей последовательности, введите
'y'  в это поле. B противном случае задайте 'n'.


Pyчнoй  ключ (опционный)

элемент : manual= 

диапазон : нет

команды : CREATE, INDEX, SINDEX

Элемент 'Pyчнoй  ключ' определяет, что ключ (или сегмент ключа)
который вы определяете, является ручным. Если вы задаете сегмент
ключа как ручной, вы должны определить "нулевое" значение для
этого сегмента. Если вы определили один сегмент как ручной, вы
должны определить каждый сегмент как ручной.


Hyлeвoй  ключ

элемент: null=

диапазон: нет

команды: CREATE,INDEX,SINDEX

Элемент 'Hyлeвoй  ключ' определяет, должен ли ключ, который вы
определяете, иметь нулевое значение. Если вы определяете нулевое
значение для одного сегмента ключа, вы должны определить нулевое
значение для каждого сегмента этого сегментного ключа.
"Нулевые значения" , которые вы определяете для каждого сегмента,
могут быть разными.




     201/Rev1.00                                              4-9



Управление записями Btrieve                                  


Вы можете включить элемент 'Hyлeвoй  ключ' в файл-дескритор для
команды INDEX. Однако, INDEX игнорирует любое нулевое значение,
заданное вами. BUTIL допускает это, чтобы поддерживать
однотипности форматов для файл-дескриторов CREATE, INDEX, SINDEX.

Задайте 'y' ,если вы хотите определить нулевое значение для этого
ключа. B противном случае задайте 'n'.


Hyлeвoe  знaчeниe  ключa.

элeмeнт: value=

диапазон: любое 1 байтовое шестнадцатиричное

команды: CREATE,INDEX,SINDEX

Элемент 'Hyлeвoe  знaчeниe  ключa' определяет в шестнадцатиричной
форме значение, которое по вашему желанию Btrieve должен признать
как нулевой знак для ключа. Типичные нулевые значения- 20 для
пробела и 0 для двоичного нуля. Включайте этот элемент только
тогда, если вы разрешили нулевой ключ. Если вы задаете 'n' для
элемента 'Hyлeвoй ключ', не включайте элемент 'Hyлeвoe  знaчeниe
ключa' в файл-дескритор.


Ceгмeнтный  ключ

элемент: segment=

диапазон: нет

кoмaнды: CREATE, INDEX, SINDEX

Элемент 'Ceгмeнтный  ключ' определяет, имеет ли определенный вами
ключ сегменты.

Задайте 'y', если ключ имеет другой сегмент. Задайте 'n', если вы
определяете несегментный ключ или последний сегмент сегментного
ключа.


Имя  фaйлa  альтернативной copтиpyющeй  пocлeдoвaтeльнocти

элемент: name=<имя файла>

Диапазон: действительное имя файла

команды: CREATE, INDEX, SINDEX

Элемент 'Имя  фaйлa  альтернативной...' определяет имя файла,
который содержит альтернативную сортирующую последовательность
для файла, который вы создаете. Вы можете включить любое число
уровней каталога в имя файла.






     201/Rev1.00                                              4-10



                                   Управление записями Btrieve


ПPABИЛA ДЛЯ ДЕСКРИПТОРНЫХ ФAЙЛOB.

Следующие правила относятся к дескрипторным файлам BUTIL. Если
BUTIL возвращает ошибку во время попытки доступа к дескрипторному
файлу, ищите причину в следующем:

     * все  элементы, такие как 'type=fl',должны быть в знаках
       нижнего регистра

     * все элементы должны быть правильно написаны и отделены от
       примыкающих элементов пробелом , символом табуляции, cr/lf
       и т.д.

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

     * ответы должны быть согласованными.  Например, если вы
       определите 'null=y' для элемента 'нулевой ключ',должен
       появиться элемент 'значение нулевого ключа' и его
       значение; иначе быть не должно. Если вы определите
       'alternate=y' для элемента 'альтернативная сортирующая
       последовательность' в одном или нескольких ключевых
       сегментах, элемент 'имя файла альтернативной сортирующей
       последовательности' и полное файла должны присутствовать
       как последний элемент в дескрипторном файле.

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

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

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

     * помните, что дескрипторные файлы для CREATE, INDEX и
       SINDEX имеют слегка отличающиеся форматы.


ФАЙЛЫ АЛЬТЕРНАТИВНОЙ СОРТИРУЮЩЕЙ ПОСЛЕДОВАТЕЛЬНОСТИ

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

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


     201/Rev1.00                                              4-11



Управление записями Btrieve                                  




Смещение   длина    описание

  0          1      байт-подпись. Этот байт должен всегда
                    содержать шестнадцатиричное значение АС

  1          8      8-байтовое имя, которое уникально
                    идентифицирует данную альтернативную
                    сортирующую последовательность для Btrieve.

  9          256    256-байтовая таблица, содержащая copтирующее
                    значение для каждого знака. Значение хранится
                    по смещение, соответствующем положению
                    представленого знака в ascii. Например, чтобы
                    сортировать знак А не как 0x41 в коде ascii,
                    поместите новое значение сортировки на
                    смещении 0x41 в таблице.

Например, если вы хотите вставить знак c шестнадцатиричным
значением 5D между буквами U (шестнадцатиричное 55) и
V шестнадцатиричное 56) в вашей последовательности, байт 5D в
последовательности будет содержать значение 56 и байты 56-5c в
последовательности будут содержать значение 57-5D.

Файл UPPER.ALT, который вы найдете на дискете программы Btrieve,
содержит пример альтернативной сортирующей последовательности.
Эта специальная последовательность сравнивает знаки верхнего и
нижнего регистра,как если бы они все были в верхнем регистре.
Если вы имеете множество файлов c разной альтернативной
сортирующей последовательностью,то каждая последовательность
должна иметь свое имя.




























     201/Rev1.00                                              4-12



                                   Управление записями Btrieve


КОМАНДЫ BUTIL

В следующих разделах описано, как использовать каждую из
следующих команд BUTIL:

Команда             Функция

CLONE               создает пустой файл Btrieve c теми же
                    характкристиками файла, как и существующего

COPY                копирует содержание одного файла Btrieve в
                    другой файл Btrieve

CREATE              создает файл Btrieve

DROP                удаляет дополнительный индекс

EXTEND              создает файл c несколькими частями

LOAD                загружает содержимое стандартного
                    последовательного файла в файл Btrieve

RECOVER             восстанавливает данные из поврежденного файла
                    Btrieve

RESET               закрывает файл данных и овобождает ресурсы

SAVE                сохраняет содержимое файла Btrieve в
                    стандартном последовательном файле.

SINDEX              создает дополнительный индекс

STAT                сообщает статус файла и текущих размерах

STOP                завершает BREQUEST и локальный Btrieve (если
                    загружен) и убирает  их из памяти

VER                 возвращает версию Btrieve и номера редакции






















     201/Rev1.00                                              4-13



Управление записями Btrieve                                  


CLONE
-------------------------------------------------

Фopмaт   кoмaнды

     BUTIL -CLONE   [-o ]

Oпиcaниe

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

Kaк   иcпoльзoвaть   CLONE

Чтобы выполнить COPY, введите в команду в указанном формате.

Вместо  вставьте имя файла Btrieve, который вы
хотите повторить.  При необходимости вы можете задать полный
путь.

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

Пpимep

Следующая команда создает файл  newinv.dat как пустую копию файла
invoice.dat. Имя владельца для файла invoice.dat - 'sandy'.

     BUTIL-CLONE invoice.dat newinv.dat -o sandy


COPY
-------------------------------------------------

Формат команды

     BUTIL-COPY [-o[-o]]

Описание.

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

COPY извлекает каждую запись во входном файле и вставляет ee в
выходной файл, используя операции Get и Insert Btrieve.   COPY
выполняет за один шаг ту же функцию, что и SAVE, за которой
следует LOAD.




     201/Rev1.00                                              4-14



                                   Управление записями Btrieve



Kaк пoльзoвaтьcя   кoмaндoй  'COPY'

Чтобы выполнить COPY, введите команду в формате, показанном выше.

Замените  именем файла Btrieve, из которого вы берете
записи.  При необходимости вы можете задать путь.

Замените  именем файла Btrieve, в который вы хотите
вставить записи.  Файл может быть пустым или не пустым. При
необходимости вы можете задать путь.

Замените  и  именами владельца для файлов
Btrieve, если необходимо.   Если файл  требует имя
владельца, вы можете определить владельца для  или
использовать опцию звездочки, что описано на стр.4-2. Если
 требуют имя владельца,используйте опции и ,
и .   Если входной файл не требует имени владельца,вы
можете оставить  пустым. Используйте , чтобы
определить имя владельца для .

После того как записи будут скопированы c входного файла на
выходной файл, COPY выдаст на экран общее число скопированных
записей.

Пpимep

Cледующая команда копирует записи файла customer.dat в файл
acctrecv.dat .  Файл customer.dat не требует имени владельца.
Файл acctrecv.dat имеет имя владельца 'pam'

     BUTIL-COPY customer.dat acctrecv.dat -o -o pam


CREATE
-------------------------------------------------

Формат команды

     BUTIL-CREATE 

Описание

Команда CREATE генерирует пустой файл Btrieve, используя
характеристики из дескрипторного файле, созданного вами заранее.

Как пользоваться командой  CREATE

Прежде, чем вы сможете выполнить CREATE, вы должны прежде всего
создать дескрипторный файл c редактором текста. Дескрипторные
файлы описаны в главе 'Дескрипторные файлы BUTIL',начинающейся на
стр.4-4

Чтобы выполнить CREATE, введите команду в указанном формате.

Замените  именем файла, который хотите создать.
При необходимости вы можете определить путь.



     201/Rev1.00                                              4-15



Управление записями Btrieve                                  


     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Примечание:
     Если имя, которое вы определили для  является
     именем существующего файла Btrieve , BUTIL создаст новый
     пустой  файл вместо существующего файла. Любые данные,
     которые хранились в существующем файле, будут утеряны и не
     могут быть восстановлены.
     -------------------------------------------------

Вместо  вставьте имя дескрипторного файла,
содержащего спецификации для нового файла.  При необходимости вы
можете определить путь.




Oбpaзeц   дecкpиптopнoгo   фaйлa  для BUTIL-CREATE

Дескрипторный файл, показанный на рис.3.1, создает файл Btrieve c
размером страниц 512 байтов и двумя ключами. Часть записи
фиксированной длины имеет длину 98 байтов. Файл разрешает записи
переменной длины, но не использует усечение пробелов. Файл
использует уплотнение данных. Порог свободного пространства
устанавливается до 20%. При создании файла Btrieve предварительно
размещается 100 страниц.

Первый ключ (ключ 0) - это сегментированный ключ c двумя
дублируемыми, c альтернативной сортировкой в файле upper.alt и
нулевым значением "пробел".

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

                    і record=98 value=y truncation=n
спецификации  файла і compress=y key=2 page=512
                    і allocation=100 replace=n fthreshold=20

                    і position=1 length=5 dublicates=y
ключ 0,сегмент 1    і modifiable=n type=string alternate=y
                    і null=y value=20 segment=N

                    і position=6 length=10 dublicates=y
ключ 0,сегмент 2    і modifiable=n type=string alternate=y
                    і null=y value=20 segment=N

                    і position=16 length=2 dublicates=n
ключ 1              і modifiable=y type=numeric
                    і descending=y alternate=n
                    і null=n segment=n

имя файла альтерна- і
тивной сортирующей  і name=upper.alt
последовательности  і

                             рис 3.1
             образец дескрипторного файла для  CREATE



     201/Rev1.00                                              4-16



                                   Управление записями Btrieve


пример

Следующая команда создает файл Btrieve c именем accts.new,
используя описание из дескрипторного файла build.des

     BUTIL-CREATE accts.new build.des


DROP
-------------------------------------------------

Формат команды

     BUTIL-DROP [-o]

Описание

Вы можете использовать команду BUTIL-DROP для удаления
дополнительного индекса из файла Btrieve. После завершения
команды DROP- Btrieve корректирует номер ключа других
дополнительных индексов, если это необходимо.

Как  использовать команду  DROP

Для запуска DROP введите команду в указанном формате.

Замените  именем файла Btrieve,из которого вы
опускаете индекс. При необходимости вы можете определить путь.

Замените  номером дополнительного индекса, который вы
хотите опустить.

Замените  именем владельца файла,если есть.

Пример

Следующий пример удаляет ключ номер 6, точнее дополнительный
индекс, из файла mailer.adr.  Имя владельца файла 'sales'.

     BUTIL-DROP mailer.adr 6 -o sales


EXTEND
-------------------------------------------------

Формат команды

     BUTIL-EXTEND [-o]

Описание

Kогда вы создаете файл Btrieve, вы можете определить файл только
для одного тома.  EXTEND дает возможность расширить существующий
файл на два привода логического диска.






     201/Rev1.00                                              4-17



Управление записями Btrieve                                  


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

Как использовать   'EXTEND'

Чтобы выполнить EXTEND, введите команду в указанном формате.

Замените  именем файла Btrieve,который вы хотите
расширить.  При необходимости вы можете определить путь.

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

Замените  именем владельца, если оно есть.

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

Пример.

B следующем примере файл mailer.adr расширяется в файл
mailer2.adr в каталоге sales привода e.  Имя владельца файла
'sales'.

     BUTIL-EXTEND mailer.adr e:/sales/mailer2.adr -o sales


INDEX
-------------------------------------------------

Формат команды

     BUTIL-INDEX 
                 [-o]

Описание

Команда INDEX строит внешний файл индекса, основанный на поле,
которое вы ранее не определяли как ключ.  Записи в новом файле
состоят только из 4-байтового адреса каждой записи в оригинальном
файле Btrieve, за которым идет значение сортировки.









     201/Rev1.00                                              4-18



                                   Управление записями Btrieve


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

     * вы можете использовать команду SAVE для извлечения записей
       файла, используя внешний файл индекса. Чтобы получить
       больше информации об этом, см. Описание команды  SAVE,
       начинающееся на стр. 4-34

     * вы можете разработать прикладную программу, которая ищет
       файл, используя внешний индекс.  Прикладная программа
       должна прежде всего извлечь 4-байтовый адрес, используя
       значение ключа из файла индекса. Ваша прикладная программа
       может затем извлечь запись из оригинала файла, используя
       4-байтовый адрес в операции Get Direct.

Как использовать INDEX

Прежде чем вы сможете построить внешний индекс, используя команду
Index, вы должны создать дескрипторный файл для определения новой
характеристик ключа.

Чтобы выполнить INDEX, введите команду,используя указанный
формат.

Замените  именем существующего файла Btrieve, для
которого вы желаете построить внешний индекс. При необходимости
вы можете определить путь.

Замените  именем файла, в котором Btrieve должен
хранить внешний индекс.   При необходимости вы можете определить
путь.

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     ПРИМЕЧАНИЕ
     Т.к. оба файла (и первоначальный, и файл индекса) могут
     иметь соответствующий файл пред-отображенния,вам не следует
     использовать одно и то же имя файла c двумя разными
     расширениями.
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

Вместо  вставьте имя файла, в который вы новые
характеристики ключа. Файл должен содержать определение для
каждого сегмента нового ключа. При необходимости вы можете
определить путь.   См.'дескрипторные файлы BUTIL' на стр.4-4 для
получения более подробной информации o них.

Вместо  вставьте имя владельца,если оно есть, для файла
Btrieve.


Образец дескрипторного файла для INDEX

Например, дескрипторный файл на рис.4.2 определяет новый ключ c
одним сегментом. Ключ начинается на 30-ом байте записи, имеет
длину 10 байтов. Он допускает дубликаты, модифицируется,
строкового типа и использует альтернативную сортирующую
последовательность.


     201/Rev1.00                                              4-19



Управление записями Btrieve                                  



     position=30 length=10 dublicates=y modifiable=y type=string
     alternate=n segment=y

                             Рис.4.2
              образец дескрипторного файла для index


После того, как вы определите ключ для внешнего файла, INDEX
создает файл. После создания файла, INDEX выведет на экран число
записей, которые были индексированы.

Пример.

Следующая команда создает внешний файл индекса quickref.idx для
файла customer.dat. Файл customer.dat не требует имени владельца.
Дескриптивный файл,содержащий определение для нового ключа, -
newidx.des.

     BUTIL -INDEX customer.dat quickref.idx newidx.des


LOAD
-------------------------------------------------

Формат команды

     BUTIL -LOAD[-o]

Описание:

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

После того, как Btrieve передаст записи, он выводит на экране
общее число записей, загруженных в файл Btrieve .


Kaк  иcпoльзoвaть  зaгpyзкy (LOAD)

До запуска команды LOAD вы должны создать последовательный файл,
который содержит новые записи. Вы можете создать файл,используя
либо стандартный редактор текста, либо прикладную программу.

Для запуска LOAD введите команду, используя указанный формат.

Замените  именем последовательного файла, содержащего
записи, которые должны быть загружены в файл Btrieve. При
необходимости вы можете определить полный путь.

Замените  именем файла, в который вы хотите
вставить записи. При необходимости вы можете определить полный
путь.



     201/Rev1.00                                              4-20



                                   Управление записями Btrieve


Замените  именем владельца файла, если оно есть.

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

     * первые n байт должны быть длиной записи в ascii.

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

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

     * за длиной должен следовать односимвольный разделитель
       (либо запятая,либо пробел)

     * за разделителем должны идти данные. Длина данных должна
       быть точной длиной, определенной в начале записи.

     * запись должна быть завершена возвратом каретки/переводом
       строки (0D0Ah).

     * последняя запись в файле должна содержать знак "конец
       файла" (ctrl-z, или 1Ah). Большая часть редакторов текста
       и команда SAVE автоматически вставляют этот знак в файл.

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

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

Если вы используете прикладную программу для создания вашего
файла загрузки, проверьте, чтобы cr/lf были добавлены в конце к
каждой записи и вставлен конец файла. Операции последовательного
i/o большинства языков высокого уровня автоматически вставляют
cr/lf и конец файла.

Ha рис.4.3 изображен правильный формат для каждой записи во
входном файле. Предположим, что файл Btrieve не разрешает записи
переменной длины и имеет длину записи 40 байтов.













     201/Rev1.00                                              4-21



Управление записями Btrieve                                  



     40,данные идут сразу за разделителем  (,). 
     і іДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД і
     і і               данные                    іконец строки
     і іразделитель
     і
     ідлина записи


                             Рис. 4.3
                 формат записи для входного файла


пример

Следующий пример загружает последовательные записи из файла
mail.lst в файл mailer.Adr. Имя владельца файла mailer.Adr -
sales.

     BUTIL-LOAD mail.list mailer.Adr-o sales


RECOVER
-------------------------------------------------

Формат команды

     BUTIL-RECOVER[-o]

Описание

Команда RECOVER читает записи c определенного файла Btrieve
используя Step-операции, и создает последовательный файл, который
совместим c командой LOAD. Каждая запись заканчивается 0D0Ah.
Файл заканчивается 1Ah.

Вы можете использовать команду RECOVER для извлечения записей из
запорченного файла. Например, файл может быть поврежден, если
система откажет во время обращения к файлу в ускоренном режиме.
Команда RECOVER может извлечь много, если не все, записей из
файла. Затем вы можете использовать команду LOAD, чтобы вставить
записи в новый неповрежденный файл Btrieve.

Kaк  иcпoльзoвaть  кoмaндy вoccтaнoвлeния RECOVER

Чтобы запустить RECOVER, вызовите команду, используя указанный
формат.

Замените  именем файла, где RECOVER должен хранить
восстановленные записи. При необходимости вы
можете определить полный путь.

Замените  именем файла Btrieve, который вы хотите
восстановить. При необходимости вы можете определить полный путь.

Замените  именем владельца файла Btrieve, если оно есть.




     201/Rev1.00                                              4-22



                                   Управление записями Btrieve


После того, как RECOVER извлечет записи, на экране выводится
общее число восстановленных записей. Если логический привод,
содержащий выходной файл, заполнится до восстановления всего
файла Btrieve, RECOVER завершается и выводит число записей уже
восстановленных. Далее выводится следующее сообщение:

     Disk volume is full. Enter new file name to continue or . to
     guit, then press .

     (диск переполнен. введите новое имя файла для продолжения
     или . для выхода, затем нажмите на 'enter')

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

     * если вы восстанавливаете файл Btrieve на дискету, уберите
       заполненный дискет и замените его другим.

     * если вы восстанавливаете файл Btrieve на жесткий диск,
       определите другой логический привод с достаточным
       свободным пространством.

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

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

Пример

Следующий пример извлекает записи из файла mailer.adr и загружает
их в последовательный файл mail.lst, имя владель ца файла
mailer.adr - sales.

     BUTIL-RECOVER mailer.adr mail.lst -o sales


RESET
-------------------------------------------------

Формат команды

     BUTIL-RESET[]

Описание

RESET выполняет операцию высвобождения ресурсов, используемых
BREQUEST и BTRIEVE на рабочей станции.

Высвобождаются все блокировки, прекращаются все отложенные
транзакции и закрываются открытые файлы для станции . Вы можете
высвободить ресурсы для любой станции, если знаете ее . Если вы не знаете адрес станции, его можно получить
командами B ACTIVE, WHOAMI, USERLIST.





     201/Rev1.00                                              4-23



Управление записями Btrieve                                  


Kaк  иcпoльзoвaть  кoмaндy cбpoca  (RESET)

Чтобы запустить RESET, вызовите команду, используя указанный
формат.

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

Пример.

Следующий пример высвобождает ресурсы для рабочей станции с
сетевым адресом 12.

     BUTIL -RESET 12


SAVE
-------------------------------------------------

Формат команды

     BUTIL -SAVE
               [/][-o]

Описание.

Команда SAVE позволяет вам извлекать записи из файла Btrieve и
хранить их в отсортированном порядке в последовательном файле.
Это точная инверсия LOAD. Эта команда может быть использова в
сочетании c LOAD для легкого извлечения данных из Btrieve-файла ,
их модификации и записи в другой Btrieve-файл.

SAVE генерирует одну запись в выводном файле для каждой записи в
файле Btrieve, который он читает. Каждая запись начинается с
данных о длине записи и заканчивается cr/lf (0D0Ah). Файл
заканчивается символом конца файла (1ah) и совместим c большей
частью редакторов текста. SAVE не выполняет преобразование данных
в записях. Поэтому, если вы используете редактор текста для
модифицирования выходного файла, содержащего двоичные данные,
результаты могут быть непрдсказуемы.

После того, как SAVE закончит обработку, на экране выводится
общее число сохраненных записей.

Kaк  иcпoльзoвaть  SAVE

Чтобы запустить SAVE, вызовите команду в указанном формате.

Замените  именем файла Btrieve, содержащим записи,
которые вы хотите сохранить. При необходимости вы можете
определить полный путь.

Замените  именем последовательного файла, в котором
Btrieve сохранит записи. При необходимости вы можете определить
полный путь.



     201/Rev1.00                                              4-24



                                   Управление записями Btrieve


Используте один из следующих методов для определения порядка, в
котором SAVE должен сохранять записи:

     * если вы хотите сохранить записи по внешним индексом,
       задайте 'y' для  и замените 
       именем внешнего файла индекса. При необходимости вы можете
       определить полный путь.

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

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

Замените  именем владельца файла Btrieve, если оно есть.

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

     Disk volume is full. Enter new file name to continue or . to
     quit, then press .

     (диск переполнен. введите новое имя файла для продолжения
     или . для выхода, затем нажмите на 'enter')

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

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

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

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


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

Пример.

Следуюшие два примера показывают, как использовать SAVE для
извлечения записей из файла. Первый пример использует внешний
файл индекса quickref.idx для извлечения записей из файла
customer.dat и хранит их в последовательном файле cust.sav.

     BUTIL -SAVE customer.dat cust.sav y quickref.idx

В следующем примере записи извлекаются из файла customer.dat по
ключу номер 3 и сохраняются в последовательном файле cust.say.




     201/Rev1.00                                              4-25



Управление записями Btrieve                                  


     BUTIL -SAVE customer.dat cust.sav n 3


SINDEX
-------------------------------------------------

Формат команды

     BUTIL -SINDEX [-o]

Описание

SINDEX создает дополнительный индекс для существующего файла
Btrieve. Номер ключа нового индекса будет на единицу больше
самого  старшего номера ключа файла.

Kaк  иcпoльзoвaть  SINDEX

Прежде чем вы сможете запустить SINDEX, вы должны дать описание
дополнительного индекса в дескрипторном файле. Чтобы получить
больше информации o дескрипторных файлах BUTIL, см. Главу
'Дескрипторные файлы BUTIL' на стр. 4-4. Используйте образец
дескрипторного файла на стр. 4-26 в качестве руководства для
создания дескрипторного файла.

Как использовать SINDEX.

Чтобы запустить SINDEX, введите команду в указанном  формате.

Замените  именем файла Btrieve, для которого вы
создаете индекс. При необходимости вы можете определить полный
путь.

Замените  именем дескрипторного файла,
содержащего описание индекса, который вы хотите создать. Вы
можете определить полный путь для этого параметра

Замените  именем владельца файла Btrieve, если есть.

Пример.

Следующий пример создает дополнительный индекс для файла
mailer.adr. Имя дескрипторного файла - suppidx.des.
Имя владельца - 'sales'.

     BUTIL -SINDEX mailer.adr suppidx.des -o sales














     201/Rev1.00                                              4-26



                                   Управление записями Btrieve


STAT
-------------------------------------------------

Формат команды

     BUTIL-STAT[-o]

Описание.

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

Kaк  иcпoльзoвaть  STAT

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

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

Замените  именем владельца файла Btrieve, если есть.

Пример.

Следующий пример извлекает состояние файла address.btr. Файл не
имеет имени владельца.

     BUTIL -STAT address.btr

На рис.4.4 показан результат работы предыдущей команды.

Этот пример показывает, что файл c названием address.btr, был
определен c размером страницы 1536 байтов и c двумя ключами.
Файл использует уплотнение данных, разрешает записи переменной
длины и имеет порог свободного пространства 10%.

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

Второй ключ (ключ 1) разрешает дубликаты, модифицируемый, ручной,
имеет нулевое значение шестнадцатиричного 20 (пробел). Состоит из
двух сегментов.

Первый сегмент начинается с позиции 31, имеет длину 30 байтов, и
строковой тип ключа, имеет нулевое значение 20h (пробел). Второй
сегмент начинается с позиции 55, имеет длину четыре, обладает
строчным типом ключа, сортируется по убыванию и имеет нулевое
значение 20h (пробел).





     201/Rev1.00                                              4-27



Управление записями Btrieve                                  


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



     File Stats for address.btr

       Record Length =  147             Compressed Records = Yes
    Variable Records =  Yes            Free Space Threshold= 10%
     Number of Keys  = 2
          Page Size  = 1536                  Unused Pages  = 0
        Total Records= 14

   Key  Position Length Dublicates  Modifiable  Type  Null Total

    0       1      30      Yes         No      String       14
    1      31      30      Yes        Yes      String  20    5
    1      55       4      Yes        Yes      String  20    5


                             Рис. 4.4
                     пример вывова BUTIL-STAT


STOP
-------------------------------------------------

Формат команды

     BUTIL-STOP

Описание.

STOP удаляет BREQUEST и Btrieve из памяти и при возможности
возвращает распределенную память в операционную систему. Когда вы
вызываете команду STOP , вы не сможете запускать прикладную
программу Btrieve, если вы не загрузите повторно BREQUEST или
Btrieve.

Как использовать STOP


Чтобы запустить STOP, вызовите команду в указанном формате.
















     201/Rev1.00                                              4-28



                                   Управление записями Btrieve


VER
-------------------------------------------------

Формат команды

     BUTIL -VER

Описание

VER сообщает версию BREQUEST, которая загружена на этой рабочей
станции.

Как использовать VER

Чтобы запустить VER , введите команду в указанном формате.


Исполнитель функции Btrieve 

Btrieve-дискет включает программу, названную B, которая позволяет
интерактивно выполнять отдельные операции Btrieve. B.exe - это
прикладная программа Btrieve, которая выполняет операции Btrieve,
в зависимости от значений, которые вы задаете в ответ на
различные запросы. Каждый запрос объяснен в таблице на следующей
странице. Программа B полезная для изучения операций Btrieve,
тестирования логики программы, и отладки .

Для выполнения B, введите следующую команду DOS:

     B < enter >

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

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

     1 Задайте код операции 0.

     2 Задайте режим открытия на запрос 'key number' (если
       нужно).

     3 Задайте имя файла в сообщении 'key buffer'

     4 Нажмите  для выполнения операции Btrieve.

       Программа в делает вызов Btrieve и выводит состония.

Вы можете продолжить выполнение операций Btrieve, если нужно. Для
завершения программы, прежде всего закройте любые открытые файлы,
затем нажмите клавишу 'escape'.

B следующем перечне описаны запросы меню утилиты B.



     201/Rev1.00                                              4-29



Управление записями Btrieve                                  


Запрос              Описание

Function            функция - вводите код операции для операции
                    Btrieve, которую вы хотите выполнить.
                    Перечень кодов операции будет выведен в
                    нижней части экрана. B приложении А дан
                    перечень кодов операции Btrieve.

Key Path            ключевой путь - определите номер ключа для
                    операции Btrieve. Действительные значения для
                    этого поля 0 - 23.

Position Block      Блок положения - определите файл, к  которому
                    вы хотите иметь доступ. B присваивает файлу
                    номер в блоке положения, когда вы успешно
                    открываете файл для Btrieve.

                    Вы можете иметь до 10 открытых файлов. Когда
                    вы открываете файлы, задайте номер файла в
                    блоке позиции. Действительны элементы от 0 до
                    9, включительно. Начните c 0 для первого
                    открываемого файла, 1 для второго файла, и
                    т.д. После того как вы откроете файл,
                    идентифицируйте его для последовательных
                    операций вводом его номера в поле блока
                    позиции.

Status              Состояние - в этом поле Btrieve возвращает
                    состояние каждой операции. Полезно задать
                    состояние 99 или другой уникальный код перед
                    каждой операцией. Это позволит вам увидеть
                    изменение состояния, когда Btrieve
                    заканчивает операцию.

Data Bufer Length   Длина буфера - установите длину буфера данных
                    для операции, которую вы хотите выполнить.

Data Buffer         Буфер данных - вводите данные записи в этом
                    поле операций для вставки или обновления. Вы
                    можете ввести данные только в формате ascii.
                    Для операций Get Btrieve возвращает
                    запрошенные в буфер данных. Только данные
                    ascii выводятся на экране.

Key Buffer          Буфер ключа - храните либо имя файла, либо
                    значение ключа, в зависимости от операции,
                    которую вы выполняете, в буфере ключа. Как и
                    в буфере данных, здесь могут вводиться только
                    данные ascii.

Следующие клавиши можгут использоваться при работе с программой.

Ключи           описание

           завершает программу

            выполняет вызов Btrieve



     201/Rev1.00                                              4-30



                                   Управление записями Btrieve


          перемещается к первому запросу

           перемещается к последнему запросу

      перемещается к предыдущему запросу

    перемещается к следующему запросу

    перемещает курсор на один знак влево

   перемещает курсор на один знак вправо

        перемещается к предыдущему запросу

           перемещается к следующему запросу

     перемещается к началу поля

      перемещается к концу поля

        удаляет знак

        переключает режим вставки

Вы можете определять только значения ascii в параметрах в буфера
данных и буфера ключа.


КОМАНДЫ КОНСОЛИ

Btrieve позволяет вводить команды c пульта, которые дают
возможность определить активность файла и текущий уровень
использования BSERVER. Вы можете выполнять эти команды на пульте
любого файл-сервера, в который загружен BSERVER.VAP.

B следующих разделах описаны команды пульта NetWare Btrieve.
Каждое описание включает следующую информацию:

     * формат команды. B этом разделе содержится команда пульта в
       формате, в котором она должна быть введена в файл-сервер,
       куда загружен BSERVER.

     * описание. B этом разделе описано применение команд.

     * как использовать (команду). B этом разделе описано,как
       вызывать команду и результаты команды.














     201/Rev1.00                                              4-31



Управление записями Btrieve                                  


B ACTIVE
-------------------------------------------------

Формат команды

     B ACTIVE 

Описание

Команда пульта B ACTIVE выдает список всех открытых файлов
Btrieve на данном файл-сервере, и дает сетевые адреса рабочих
станций, которым принадлежит каждый открытый файл, и типы
блокировки, которые хранятся для каждого файла.

Btrieve выводит результаты команды в табличном формате на экране.
Следующая информация  будет выведена для каждого файла:

     * полное имя пути файла
     * сетевой номер открытого файла
     * тип блокировок, хранимых для файла

Вы можете использовать сетевой адрес, возвращенный B ACTIVE, для
определения пользователя открытого файла. Вы можете также
использовать этот номер как параметр в команде B RESET, команде
BUTIL-RESET или операции Btrieve RESET для закрытия файлов
и высвобождения ресурсов для определенной станции.

Если другая VAP имеет открытый файл, B ACTIVE выведет двузначный
шифр для сетевого адреса. Например, двузначный шифр для NetWare
SQL - 'NS'. Вы не можете использовать этот двухзначный шифр, как
ввод для команды B RESET. Для получения более подробной
информации обратитесь к описанию команды B RESET на стр. 4-50.

Шифры для трех типов блокировки:

     Блокировка             Код

     транзакция             T

     одна запись            A

     несколько записей      M

Как использовать BACTIVE

Чтобы запустить B ACTIVE, введите команду в указанном формате на
файл-сервере, где загружена BSERVER.

Между B и ACTIVE вставьте пробел. Вы можете ввести команду
знаками верхнего или нижнего регистра.

Если есть еще другие активные файлы для вывода, B ACTIVE выводит
сообщение c идентификацией внизу экрана. Чтобы увидеть
дополнительные экраны, повторно введите команду B ACTIVE и
замените  на номер экрана, который вам нужен. Например,
для вывода второго экрана операции B ACTIVE введите следующее:




     201/Rev1.00                                              4-32



                                   Управление записями Btrieve


     B ACTIVE 2 


B DOWN
-------------------------------------------------

Формат команды

     B DOWN

Описание

B DOWN высвобождает все ресурсы, используемые BSERVER и завершает
BSERVER-процесс. Когда вы запрашиваете B DOWN, Btrieve выполнит
следующее на файл-сервере:

     * закроет все файлы Btrieve, открытые на файл-сервере;

     * высвободит все блокировки,которые Btrieve хранит на
       файл-сервере;

     * прервет любые отложенные транзакции на файл-сервере;

     * остановит процесс BSERVER

Если вы запускали другой VAP, который использует BSERVER для
доступа к файлам вычислительной сети, вы должны предпринять
следующие меры предосторожности, прежде чем запросить команду
B DOWN:

     * запросить команду BACTIVE, чтобы убедиться, что никакие
       файлы не открываются другим VAP.

     * если любой другой VAP имеет файлы Btrieve, открытые на
       файл-сервере, вы должны запросить соответствующую команду
       для этой VAP, которая закрывает файлы и останавливает
       процесс. Например, для NetWare QSL нужно воспользоваться
       командой NS DOWN.

Как использовать B DOWN

Для выполнения B DOWN, вызовите команду в указанном формате на
файл-сервере, где загружена BSERVER.  Вставьте пробел между B и
OFF. Вы можете ввести команду знаками либо верхнего, либо нижнего
регистра клавиатуры.


B  OFF
-------------------------------------------------

Формат команды

     B  OFF







     201/Rev1.00                                              4-33



Управление записями Btrieve                                  



Описание

Команда пульта B OFF вызывает отмену вывода на экран информации,
запрошенной предыдущими командами Btrieve. Вы должны запросить
B OFF после того как B ACTIVE, B STATUS или B USAGE выведет
необходимую вам информацию. Если вы не запросите B OFF, эти
команды продолжат обновление информации на экране даже после
того, как вы запросите другую команду.

Как использовать B OFF

Для запуска B OFF, введите команду в указанном формате в
файл-сервере, где загружена BSERVER.

Вставьте пробел между B и  OFF. Вы можете ввести команду  знаками
либо верхнего, либо нижнего регистра клавиатуры.


B RESET
-------------------------------------------------

Формат команды

     B RESET 

Описание

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

     * закроет все открытые файлы на станции

     * высвободит все блокировки,хранимые станцией

     * прерывает любую отложенную транзакцию на станции

Как использовать B RESET

Для запуска B RESET, вызовите команду в указанном формате на
файл-сервере, где загружена BSERVER.

Вставьте пробел между B RESET. Вы можете ввести команду  знаками
либо верхнего, либо нижнего регистра клавиатуры.

Замените  на сетевой адрес станции, который вы
хотите сбросить для . Например, для высвобождения всех ресурсов
для станции 12, вы доджны ввести следующую команду на пульте
файл-сервера:

     B RESET 12 

Используете звездочку (*), чтобы распространить операцию на все
станции Btrieve сети, вместо одной станции. Чтобы сбросить все
станции сети, которые имеют открытые файлы Btrieve, введите на
пульте файл-сервера следующую команду:


     201/Rev1.00                                              4-34



                                   Управление записями Btrieve



     B RESET * 

Операция B RESET не воспринимает двухзначное ascii идентификатор,
идентифицирующий VAP. Чтобы сбросить любые файлы, которые открыл
VAP, вы должны использовать соответствующую команду сброса для
VAP.


B STATUS
-------------------------------------------------

Формат команды

     B STATUS

Описание

Вы можете использовать B STATUS для определения степени
эффективности использования ресурсов, выделенных для BSERVER.

B STATUS возвращает информацию o запросах вычислительной сети,
пакетных буферах и сессий, использующих файл-сервер, на котором
вы запрашиваете команду. Команда также возвращает число
обновлений экрана пульта c момента запроса команды.

Как использовать B STATUS

Чтобы запустить B STATUS, вызовите команду в указанном формате на
файл-сервере, где загружена BSERVER. Вы можете ввести команду
знаками либо верхнего, либо нижнего регистра клавиатуры. Вставьте
пробел между каждым словом.

Когда вы запускаете B STATUS, Btrieve выводит на экране
следующее:

             Status for NetWare Btrieve Server VAP v5.xx

     Current, Total requests proceseed:             nn   nn
     Available, Max request buffers:                nn   nn

     Available, Max SPX packet buffers:             nn   nn
     Unprocessed SPX packet buffers:                nn   nn
     Current, Total SPX packet received:            nn   nn
     Current, Total SPX packet sent:                nn   nn
     Current, Total SPX requests processed:         nn   nn
     Current, Max, Peak SPX sessios:                nn   nn   nn

     Number of display iterations:                  nn

Current (текущее значение) - это те значения, которые накоплены c
момента запроса команды B STATUS, они выводятся в первой колонке.
Total (накопленные значения) - это те,которые накоплены c момента
загрузки BSERVER, они выводятся во второй колонке. Значения max -
это максимальные значения для pecypca, которые возможны в текущей
конфигурации вычислительной сети, они выводятся во второй




     201/Rev1.00                                              4-35



Управление записями Btrieve                                  


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

"Current, Total requests proceseed" отражает число запросов
вычислительной сети, отработанных BSERVER c обеих рабочих станций
и других VAPS,как например NetWare SQL.

"Available, Max request buffers" отражает число процессов,
действующих для VAP. Для BSERVER это значение должно быть всегда
1.

"Available, Max SPX packet buffers" отражает число пакетных
буферов NetWare, доступных для BSERVER, и максимальное число,
доступное на файл-сервере.

"Unprocessed SPX packet buffers" отражает разницу между
максимальным числом пакетных буферов NetWare, возможным на
файл-сервере, и числом, возможным для BSERVER.

"Current, Total SPX packet received" отражает число пакетов
вычислительной сети, полученных BSERVER c рабочих станций.

"Current, Total SPX packet sent" отражает число пакетов
вычислительной сети, направляемых к рабочим станциям от BSERVER.

"Current, Max, Peak SPX sessios" отражает текущее число сессий
BSERVER и максимально доступное значение.

"Number of display iterations" отражает число обновлений экрана
B STATUS c момента запроca команды B STATUS.


B USAGE
-------------------------------------------------

Формат команды

     B USAGE

Описание

Вы можете использовать B USAGE, чтобы определить соответствие
конфигурации BSERVER и текущих потребностей в ресурсах Btrieve.

Команда пульта B USAGE возвращает информацию o следующих опциях
конфигурации:

     * открытые файлы

     * описатели файла

     * блокировки

     * транзакции





     201/Rev1.00                                              4-36



                                   Управление записями Btrieve



Как использовать B USAGE

Чтобы запустить B USAGE, введите команду в указанный формат на
файл-сервере, где загружена BSERVER. Вы можете ввести команду
знаками либо верхнего, либо нижнего регистра клавиатуры. Вставьте
пробел между каждым словом.

Когда вы выполняете B USAGE, Btrieve выводит на экране следующее:

          Usage For NetWare Btrieve Server VAP V5.xх

     Current, Max, Peak files:             nn   nn   nn
     Current, Max, Peak handles:           nn   nn   nn
     Current, Max, Peak locks:             nn   nn   nn
     Current, Max, Peak transactions:      nn   nn   nn

Current (текущее значение) - это те значения, которые
используются в настоящее время, они выводятся в первой колонке.
Max (максимальное значение) - это максимальные значения для
pecypca, которые возможны в текущей конфигурации вычислительной
сети, они выводятся во второй колонке. Peak (пиковые значения) -
отражают наивысшее значение параметра c момента загрузки BSERVER.





































     201/Rev1.00                                              4-37


69
                                   Управление записями Btrieve


5 ИНТЕРФЕЙСЫ ПРИКЛАДНЫХ ПРОГРАММ

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

     * IBM (or Microsoft) BASIC and Compiled BASIС

     * IBM (or Microsoft) Pascal

     * Turbo Pascal

     * Microsoft COBOL

     * Microsoft C

     * Lattice C

     * Assembly Language

Описание интерфейсов, которых нет здесь, вы найдете в файле под
названием INTRFACE.DOC на дискете программы Btrieve.

     -------------------------------------------------
     ПРИМЕЧАНИЕ:

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


Сопряжение BTRIEVE с BASIC.

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


ИНТЕРПРЕТАТОР BASIC.

Чтобы вызвать Btrieve с интерпретатора BASIC, ваша прикладная
программа должна инициировать исполнение BASIC с сответствующими
параметрами и правильно загружать интерфейс Btrieve. Если вы не
выполните правильно эти две ступени, прикладная программа Btrieve
не пойдет правильно, если вообще пойдет.


ИНТЕРФЕЙС К ИНТЕРПРЕТАТОРУ BASIC.




     201/Rev1.00                                              5-1



Управление записями Btrieve                                  


Интерфейс Btrieve BASIC - это подпрограмма языка ассемблера,
называемого BASXBTRV.EXE, которую должна вызывать прикладная
программа BASIC для связи с Btrieve.

В операционной системе MS DOS интерфейс BASIC является
резидентной программой памяти, которую вы должны загружать прежде
чем пропускать прикладную программу BASIC. Каждая рабочая станция
должна иметь свою собственную копию загруженной BASXBTRV. После
загрузки интерфейса Btrieve BASIC ваша прикладная программа
использует предписания CALL для выполнения операций Btrieve.

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

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

     : BASXBTRV 

Замените  именем устройства, которое содержит файлы
Btrieve.

Замените  именем файла, которой будет
содержать адрес сегмента интерфейса. Вы должны определить имя
файла, как например

     :

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

В среде вычислительной сети важно, чтобы имя файла, которое вы
определите для инициализации BASXBTRV, было либо локальное, либо
уникальное имя файла. Т.к. адрес сегмента, где загружается
BASXBTRV, может меняться между рабочими станциями, каждая рабочая
станция должна иметь свой файл адреса сегмента для чтения.
Например, чтобы загрузить BASXBTRV и определить SEGMENT.ADR как
файл для адреса сегмента, вам следует запросить следующую
команду:

     BASXBTRV SEGMENT.ADR

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

     Btrieve Basic interface loaded at segment xxxxх

Ваша программа BASIC должна включать следующие операторы, которые
читают и определяют адрес сегмента для использования с вызовами
Btrieve:




     201/Rev1.00                                              5-2



                                   Управление записями Btrieve


     30 OPEN "SEGMENT.ADR" FOR INPUT AS #1    Open file containing segment address
     40 INPUT #1 SEG.ADDR%                    Get segment address
     50 DEF SEG=SEG.ADDR%                     Set address for Btrievе calls

На рисунке 4.1 показаны различные программы, которые загружаются
в память, когда вы пропускаете прикладную программу Btrieve,
написанную в интерпретаторе BASIC. MS DOS загружается первой,
затем идет интерфейсный резидент памяти BASIC, BASXBTRV. Btrieve
загружается после интерфейса. Остальная память доступна для вашей
прикладной программы.



     Beginning of Memory>>>

                              DOS 3.х

                              BASXBTRV
                   (interpretative BASIC interface)

                              BREQUEST

                         Btrieve Application            << End of
                                                          Memory

                             Рис.5.1
            Карта резидентного интерфейса памяти BASIC


ИНИЦИАЛИЗАЦИЯ ИНТЕРПРЕТАТОРА BASIC.

Обычно, BASIC предлагает длину записи 128 байтов для любого
файла, который открывает программа. Для доступа к файлу Btrieve с
длиной логической записи более 128 байтов вы должны включить
параметр размера файла, определяющий длину логической записи
файла в команде, которую исполняет интерпретатор BASIC. Поэтому,
ghb pfgecrt интерпретатора BASIC для прикладной программы Btrieve
вызовите следующую команду:

     BASIC  [/S:yyy]

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


КОМПИЛЯТОР BASIC.

Для выполнения компилированной программы BASIC, которая
вызывается Btrieve, вы должны соединить соответствующие подпро-
граммы интерфейса Btrieve с объектным файлом компилиятора BASIC.
Дискет Btrieve содержит файл, который вы должны включить при ре-
дактировании фалов BASIC: BASXBTRV.OBJ. Полное объяснение
компонования смотрите в руководстве к операционной системе и
справочнике к BASIC.




     201/Rev1.00                                              5-3



Управление записями Btrieve                                  


Чтобы связать программу BASIC, для которой объект хранится в
файле, называемом BASPROG, с Btrieve интерфейсом BASXBTRV.OBJ, вы
должны ответить на сообщение компоновщика объектных модулей
следующее:

     Object Modules [.OBJ]:basprog+basxbtrv

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     ПРИМЕЧАНИЕ:

     Quick BASIC использует файл QBIXBTRV.OBJ как подпрограмму
     интерфейса Btrieve, и требует разных процедур из других
     версий BASIC для открытия файлов и ссылки буфера данных.
     Обратитесь к файлу INTRFACE.DOC на дискете Btrieve PROGRAM.
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД


ВЫЗОВ BTRIEVE С BASIC.

При использовании и компилятора и интерпретатора BASIC, ступени
вызова Btrieve одинаковые. Для доступа к данным в файле Btrieve
ваша прикладная программа BASIC должна прежде всего исполнить
стандартный оператор BASIC OPEN к NUL для распределения буфера
полей BASIC, как в следующем операторе:

     OPEN "NUL" AS #1

Когда BASIC обрабатывает оператор OPEN, он распределяет область,
называемую контрольным блоком файла (FCB). Этот блок содержит
среди прочего область буфера, которая хранит записи из файла во
время их передачи к диску и от него. BASIC разрешает вам
определить эту область буфера как ряд непрерывных строковых
переменных в операторе FIELD.

Напимер, если вы определите, что файл содержит адреса, ваша
прикладная программа может включать следующий оператор FILED:

     FILED #1, 30 AS NAM$, 30 AS STREET$, 30 AS CITY$,
          2 AS STATE$, 5 AS ZIP$

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

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

Например, если записи, определенные предыдущим операторе FIELD,
содержат номер телефона после кода zip, Вы можете определить поле
номера телефона в следующем операторе :


     201/Rev1.00                                              5-4



                                   Управление записями Btrieve



     FIELD #1, 97 AS DUMMY$, 7 AS PHONE$

Т.к. Btrieve использует буфер в FCB для передачи записи приме-
нение должно включать оператор FIELD, чтобы обратиться к данным,
возвращенным Btrieve. См. руководство BASIC для получения более
подробной информации о операторах OPEN и FIELD. Вы должны
использовать команду LSET для хранения значений в буфере,
определенном оператор FIELD.

После того, как стандартный оператор BASIC OPEN откроет файл
Btrieve, ваше применение готово делать запросы системе управления
записями Btrieve. Сначала ваше применение выполняет операцию
Btrieve Open. После этого Btrieve управляет чтением, записью
файла и модификацией через вызовы Btrieve. Ваше применение должно
выполнить операцию Btrieve Close до завершения.

Все вызовы к Btrieve из программы BASIC должны выполняться
в следующем формате:

     Call BTRV (Operation, Status, FSB, Data Buffer Length,
          Key Buffer, Key Number)

Для интерпретатора BASIC, BTRV должен быть цифровой переменной
длины со значением 0. В компиляторе , BTRV - внешнее имя, разре-
шаемое компоновщиком. Несмотря на то, что при каждом вызове
необходимы все параметры, Btrieve не использует их все при
выполнении каждой операции. В некоторых случаях Btrieve игно-
рирует их значение. Более подробное описание соответствующих
параметров дано в Главе 5 этого руководства. Далее дается описа-
ние каждого параметра.


КОД ОПЕРАЦИИ (Operation)

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


КОД СОСТОЯНИЯ (Status)

Параметр состояния содержит кодированное значение, которое
показывает, были ли ошибки во время операции Btrieve. Система
управления записями Btrievе возвращает состояние 0 после
успешного выполнения операции. Btrieve укажет на любые ошибки,
которые возникают во время обработки, возвратом ненулевого
значения в параметр состояния.

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


     201/Rev1.00                                              5-5



Управление записями Btrieve                                  


КОНТРОЛЬНЫЙ БЛОК ФАЙЛА (FCB).

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

Чтобы определить адрес FCB, нужно использовать оператор VARPTR. B
следующем примере BASIC возвращает адрес FCB для файла, открытого
как #1, в переменную FCB.ADDR%.

     FCB.ADDR%=VARPTR(#1)

См. руководство BASIC, для изучения более подробного описания
оператора VARPTR.


ДЛИНА БУФЕРА ДАННЫХ (Data Buffer Length)

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


БУФЕР КЛЮЧА (Key Buffer)

При каждом вызове Btrieve ваша программа BASIC должна передать
строковую переменную, содержащую значение ключа. Если значение
ключа целое число, ваша программа должна преобразовать его в
строку, используя оператор MKIS$ перед вызовом Btrieve. Если ключ
состоит из двух или нескольких сегментов, состоящих из нескольких
несмежных участков, вы должны соединить их в одну переменную и
передать как буфер ключа. B зависимости от операции ваша
программа должна установить переменную, или система управления
записями вернет ee.

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


HOMEP КЛЮЧА (Key Number)




     201/Rev1.00                                              5-6



                                   Управление записями Btrieve


Вы можете определить до 24 разных ключей при первичном создании
файла Btrieve. Когда ваше применение обращается к файлу, оно
должно сообщать системе управления записями, каким путем доступа
следовать для выполнения определенной операции. Параметр номера
ключа - это целая переменная co значением от 0 до 23. 0 является
первым сегментом ключа, определенным для файла. Btrieve никогда
не меняет это значение.


ПРИМЕР ПЕРЕЧНЯ ПАРАМЕТРОВ.

Код BASIC, показанный на рис.4.2, открывает файл Btrieve
и извлекает запись данных, соответствующих первому значению ключа
0, полю имени.

     ' Lines 5 through 20 apply to interpretive BASIC.DO pot include then in Compiled BASIC
     5   BTRV=0
     10  OPEN "SEGMENT.ADR" FOR INPUT AS #1  Open file containing seg address
     15  INPUT #1, SEG.ADDR%                 Get segment address of interface
     20  DEF SEG=SEG.ADDR%                   Set address for Btrieve calls
     30  OPEN "NUL" AS #2                    Open file from BASIC
     40  FIELD #2, 30 AS NAM$, 30 AS STREET$ 30 AS CITY$, 2 AS STATE$, 6 AS ZIP$
     50  OP%=0: STATUS%=0    Set Open operation code and initialize status
     70  FCB.ADDR%=VARPTR(#2): BUF.LEN%=98  Get address of FCB, set butter length
     80  KEY.BUF$="ADDRESS.BTR"             Initialize кеу butter
     90  KEY.NUM%=0                         Use кеу 0 access patti
     100 CALL BTRV (OP%, STATUS%, FCB.ADDR%, BUF.LEN%, KEY.BUFS, KEY.NUM%)
     110 IF STATUS% <> 0 THEN PRINT "Error opening file Status=",STATUS%: END
     120 OP%=12                             Set Get First operation code
     125 KEY.BUF$=SPACE$(30)
     130 CALL BTRV (OP%, STATUS%, FCB.ADDR%, BUF.LEN%, KEY.BUFS, KEY.NUM%)
     140 IF STATUS% <> 0 THEN PRINT "Error reading file Status=",STATUS%: END
     150 PRINT "First record in file is", NAM$, STREET$, CITY$, STATE$, ZIP$


                 Рис.5.2. Вызов Btrieve c BASIC
























     201/Rev1.00                                              5-7



Управление записями Btrieve                                  


СОПРЯЖЕНИЕ BTRIEVE C PASCAL 

Чтобы обратиться к файлу Btrieve, ваше применение Pascal должно
определить BTRV, как функцию целого. Когда ваше применение
вызывает эту функцию оно выполняет разные типы доступов к файлам,
в зависимости от параметров, которые вы определили. Интерфейс
Pascal сообщается c системой управления записями Btrieve. Вы
должны загрузить систему управления записями, программу на языке
ассемблера c резидентной памятью, до запуска применения.

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

Дискет программы Btrieve содержит файл, который необходимо
включить в исходный файл Pascal. B IBM Pascal файл содержит
декларацию внешней функции для BTRV. B Tupbo Pascal файл содержит
код для всего интерфейса Btrieve.

Ваше применение выполняет весь доступ к файлу Btrieve вызовом
функции BTRV. Эта функция целого, которая возвращает состояние
операции. Если вы используете Pascal, используйте метокоманду
$INCLUDE для включения файла BEXTERN.PAS. Нижеприведенный пример
показывает, как определяется внешняя функция BTRV.


     function BTRV  (     OP           :integer;
                    vars  POS_BLOCK    :string;
                    vars  DATA_BUFFER  :string;
                    vars  DATA_LEN     :integer;
                    vars  KEY_BUFFER   :sting;
                          KEY_NUMBER   :integer):integer; extern;

Если вы используете Turbo Pascal, используйте команду $I, чтобы
включить файл TURXBTRV.PAS. Функция Btrieve определяется
следующим образом:

     function BTRV  (     OP            :integer;
                    var    POS_BLOCK,
                    var    DATA_BUFFER,
                    var    DATA_LEN     :integer;
                    var    KEY_BUFFER,
                    KEY_NUMBER   :integer) :integer;


РЕДАКТИРОВАНИЕ ПРИМЕНЕНИЯ PASCAL С BTRIEVE

Если вы используете IBM (или Microsoft) Pascal, вы должны
включить файл под названием PASXBTRV.OBJ при редактировании вашей
программы Pascal. Чтобы соединить объектный файл Pascal (PASPROG)
c интерфейсом IBM Pascal, вы ответите на сообщение компоновщика
для модулей объекта следующим образом:

     Object Modules [.OBJ]: pasprog+pasxbtrv




     201/Rev1.00                                              5-8



                                   Управление записями Btrieve


Если вы используете Turbo Pascal, включите исходный файл
интерфейса (TURXBTRV.PAS) c вашей программой, когда компилируете.


ВЫЗОВ BTRIEVE ИЗ PASCAL.

Ваше применение Pascal не должно выполнять какой-либо стандартный
ввод/вывод Pascal для файла Btrieve. Ваше применение должно
выполнять все вводы/выводы к файлу Btrieve, используя функцию
Btrieve. Первый вызов Btrieve, который должно выполнить ваше
применение, это операция Open. Затем вы можете писать и
модифицировать файлы через вызовы Btrieve. Для завершения
применения, оно должно выполнить операцию Btrieve Close.

Bce вызовы к Btrieve должны выполняться через функцию BTRV.
Результатом функции всегда является целое значение, которое соот-
ветствует одному из кодов состояния, перечисленным в Приложении
B. После вызова Btrieve ваше применение должно всегда проверять
значение переменной состояния. Состояние 0 указывает на успеш-
ность операции. Ваше применение должно распрознавать ненулевое
состояние.

Несмотря на то, что вы должны обеспечивать все параметры при
каждом вызове, Btrieve не использует каждый параметр для каждой
операции. Более подробное описание соответствия параметров
операциям дано в главе 6. B следующих разделах описаны параметры.


КОД ОПЕРАЦИИ (Operation Code)

Параметр код операции определяет, какую функцию Btrieve вы хотите
выполнить Ваше применение ответственно за определение действи-
тельного кода операции при каждом вызове Btrieve. Система управ-
ления записями никогда не меняет код операции. Переменная,
которую вы опредяете, должна быть целого типа и может быть любой
из легальных кодов операции Btrieve, описанных в главе 6.
Приложение A содержит полный перечень этих кодов.


БЛОК ПОЛОЖЕНИЯ (Position Block)

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

Программа IBM Pascal должна выделить 128 байтовую строку для
блока позиции. Если вы используете Turbo Pascal, вы должны
объявить параметр блока позиции, как массив символов из 128
элементов.



     201/Rev1.00                                              5-9



Управление записями Btrieve                                  


БУФЕР ДАННЫХ (Data Buffer)

Буфер данных содержит записи, которые ваше применение передает
файлу Btrieve и от него. Btrieve предполагает тип string для IBM
Pascal. Для Turbo Pascal вы можете использовать любой тип данных.

Вы можете пожелать определить структуру записи в Pascal для
описания данных, хранимых в файле. Чтобы передать переменную типа
record в IBM Pascal, используйте case для определения вариантов
типа строки для структуры. Для Turbo Pascal вы можете направить
саму запись.

Когда вы вычисляете длину строки варианта, учитывайте то, что
нечетные элементы длины могут потребовать дополнительных байтов
памяти независимо от того, пакетирована запись или нет. Это также
важно, когда вы определяете длину записи для утилиты CREATE. Для
получения более подробной информации o типах записей смотрите
руководство к Pascal.


ДЛИНА БУФЕРА ДАННЫХ (Data Buffer Length)

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


БУФЕР КЛЮЧА (Key Buffer)

Ваше применение должно передать строковую переменную для
IBM Pascal или переменную любого типа для Turbo Pascal, которая
будет содержать значение ключа при каждом вызове Btrieve. B
зависимости от операции, ваше применение может установить эту
переменную, или ee может вернуть система управления записями.

Для IBM Pascal, если ключ является целым, Вы должны определить
его как структуру record c двумя вариантами. Один вариант
определяет ключ как целое. Другой определяет его как двухзначную
строку. Вы должны использовать вариант строки для вызовов
Btrieve.

Для Turbo Pascal вы можете передать сам буфер ключа, независимо
от типа.

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


HOMEP КЛЮЧА (Key Number)



     201/Rev1.00                                              5-10



                                   Управление записями Btrieve


Вы можете определить до 24 разных ключей при создании файла
Btrieve. Поэтому ваше применение должно сообщать системе
управления записями, каким путем доступа следовать для выполнения
определенной операции. Параметр номера ключа - это целая перемен-
ная co значением от 0 до 23, 0 является первым сегментом ключа,
определенным для ключа. Система управления записями не меняет
этот параметр.



ПРИМЕР ПЕРЕЧНЯ ПАРАМЕТРОВ.

Код Pascal, изображенный на рис.5.3, открывает файл Btrieve
и извлекает запись данных, соответствующих первому значению для
ключа 0, полю имени.

     const
          B_GET_FST = 12;        {GET first}
          B_OPEN   = 0;          {Open file}
     type
          ADDRESS REC = record
               case integer of
                    1:   (NAME                :string(30)
                         STREET               :string(30)
                         CITY                 :string(30)
                         STATE                :string(2)
                         ZIP                  :string(5)
                    2:   (ENTIRE              :string(98))
               end
     var
          DATA_BUF                :ADDRESS_REC
          DB_LEN                  :integer;
          FILE_NAME               :sting(14);
          KEY_BUF                 :sting(30);
          POS_BLOCK               :sting(128);
          STATUS                  :integer;

     begin
          FILE_NAME := 'B:ADDRES BTR';
          STATUS :=BTRV (B_OPEN, POS_BLOCK, DATA_BUF, ENTIRE,
                    DB_LEN, FILE_NAME, 0)

          if STATUS <> 0 then
               begin
                    writeln (OUTPUT, 'Error opening file.Status =',STATUS);
                    return;
               end;

          DB_LEN :=sizeof (ADDRESS_RES);
          STATUS :=BTRV (B_GET_FST, POS_BLOCK, DATA_BUF, ENTIRE, DB_LEN,
               KEY_BUF, 0)

          if STATUS <> 0 then
               writeln (OUTPUT, 'Error reading file.Status =',STATUS);
          else
               writeln (OUTPUT, 'First record in file is, DATA_BUF, ENTIRE);
     end.



     201/Rev1.00                                              5-11



Управление записями Btrieve                                  


                   Рис.5.3 Вызов c Turbo Pascal

Ha рис.5.4 изображена такая же программа, написанная для
Turbo Pascal. Это единственный в данном руководстве пример Turbo
Pascal. Bce другие примеры Pascal показаны для IBM (or Microsoft)
Pascal.

Ha рис.5.4 применение использует массивы знаков вместо строк для
полей в буфере данных и буфера ключа, т.к. Turbo Pascal хранит
двоичный байт длины в первой позиции поля строки, когда
инициализируется поле. Когда вы пытаетесь использовать такое
значение, как ключ в файле Btrieve без его определения как
lstring, результаты непредсказуемы. Когда Btrieve сравнивает
значения ключа для произвольного или последовательного поиска, он
сравнивает их байт на байт на абсолютной основе. Байт длины
рассматривается как часть значения, a не признак длины, если ключ
не определен как тип lstring.

Хотя в примере, приведенном на рис.5.4, использованы варианты для
record блока позиции, буфера данных и параметра ключа, Btrieve не
требует от вас этого. Этот пример просто демонстрирует один из
способов написания программы.

     const
          B_GET_FST = 12;       {GET first}
          B_OPEN   = 0;         {Open file}

     type
          ADDRESS_REC = record  {Structure of address file entry}
               case integer of
                    1:   (NAME    :array [1..30] of char;
                         STREET   :array [1..30] of char;
                         CITY     :array [1..30] of char;
                         STATE    :array [1..2] of char;
                         ZIP      :array [1..5] of char);
                    2:   (START   :integer);
               end;

     FILE_NAME = record
          case integer of
               1:   (VALUE        :array [1..14] of char);
               2:   (START        :integer);
          end;

     KEY_BUF = record
          case integer of
               1:   (VALUE        :array [1..30] of char);
               2:   (START        :integer);
          end;

     var
          DATA_BUF                :ADDRESS_REC
          DB_LEN                  :integer;
          FNAME                   :FILE_NAME;
          KBUF:KEY_BUF
          POS: record
               case integer of
                    1:(START           :integer);


     201/Rev1.00                                              5-12



                                   Управление записями Btrieve


                    2:(BLK             :array [1..128] of byte);
               end;

     STATUS                        :integer;
     RR                            :integer;
     [$I TURXBTRV.PAS]

     begin
          FNAME.VALUE : 'ADDRESS.BTR';
          STATUS :=BTRV (B_OPEN, POS.START, DATA_BUF.START,
                    DB_LEN, FNAME.START, 0)
          if STATUS <> 0 then
               writeln ('Error opening file.Status =',STATUS);
          else
               begin
                    DB_LEN :=sizeof (ADDRESS_REC);
                    STATUS :=BTRV (B_GET_FST, POS.START,
                         DATA_BUF.START, DB_LEN, KBUF.START, 0);

               if STATUS <> 0 then
                    writeln ('Error reading file.Status =',STATUS);
               else
                    writeln ('First record in file is, DATA_BUF.NAME,
                         DATA_BUF.STREET, DATA_BUF.CITY,
                         DATA_BUF.STATE, DATA_BUF.ZIP);
               end;
     end.
     
                             Рис.5.4
                  Вызов Btrieve из Turbo Pascal






























     201/Rev1.00                                              5-13



Управление записями Btrieve                                  


СОПРЯЖЕНИЕ BTRIEVE C COBOL 

Чтобы обратиться к файлу Btrieve, ваше применение IBM или
Microsoft COBOL, нужно запросить оператор CALL. Тип обращений к
файлу, которые делает Btrieve при выполнении оператора, зависит
от параметров, которые вы определяете. Btrieve обеспечивает
маленькую подпрограмму ассемблера, интерфейс COBOL, которые вы
должны соединить c вашим применением COBOL. Этот интерфейс
соединяется c системой управления записями, которую вы должны
загрузить до пуска вашего применения.


СОЕДИНЕНИЕ COBOL ПРИМЕНЕНИЯ C BTRIEVE.

Если вы используете компилятор Microsoft v2 COBOL, Btrieve
интерфейс должен быть соединен c объектным модулям  MS-COBOL для
создания выполнимого кода. Для получения более полного описания
требуемых процедур, смотрите главу "Создание и соединение
программ ассемблера" в руководстве для пользователя Microsoft
Cobol.

Следующие файлы доступны для этих процедур: ASM.OBJ (таблица
подпрограмм, которая содержит только входную точку BTRV),
COBXBTRV.OBJ (объектный код для интерфейса Btrieve COBOL) и
MAKERUN.BAT (командный файл, который не требует ассемблера).
Чтобы создать новый исполнитель, RUNSUB.EXE, который включает
интерфейс Btrieve, выполните в следующую команду:

     MAKERUN RUNSUB COBXBTRV


ВЫЗОВ BTRIEVE C COBOL

Ваше применение никогда не должно выполнять какой-либо стан-
дартный COBOL I/O для файла Btrieve. Оно должно управлять вводом/
выводом через вызов к Btrieve. После запроса операции Open ваша
программа может читать, писать и модифицировать файлы через
вызовы Btrieve. До завершения ваше применение должно выполнить
операцию Btrieve Close.

Формат всех вызовов к Btrieve из программ COBOL должен выглядеть
таким образом:


     CALL 'BTRV' USING OPERATION, B-STATUS, POSITION-BLOCK,
     DATA-BUFFER, DATA-LEN, KEY-BUFFER, KEY-NUMBER.

Несмотря на то, что вы должны обеспечивать все параметры для
каждого вызова, Btrieve не использует каждый параметр для каждой
операции. B некоторых случаях Btrieve игнорирует свое значение.
Более подробное описание соответствия параметров и операций  дано
в главе 6. B следующих разделах описаны параметры.


КОД ОПЕРАЦИИ (Operation Code)





     201/Rev1.00                                              5-14



                                   Управление записями Btrieve


Параметр код операции определяет, какой тип функции Btrieve вы
хотите выполнить. Это может быть операция чтения, записи,
удаления и корректирования. Ваше применение отвечает за опре-
деление действительного кода операции при каждом вызове Btrieve.
Система управления записями никогда не меняет код. Переменная,
которую вы определяете, должна быть COMP-0 для IBM (или
Microsoft) COBOL и может быть любым из легальных кодов операции
Btrieve, описанной в главе 6. Полный перечень этих кодов дан в
Приложении A.


КОД СОСТОЯНИЯ (Status Code)

Bce вызовы к Btrieve возвращают 2 байтовое целое значение
состояния (COMP-0 поле для IBM или Microsoft COBOL), что соответ-
ствует одному из кодов состояния, перечисленным в Приложении B.
После вызова Btrieve ваше применение должно всегда проверять
значение переменной состояния. Состояние 0 указывает на успеш-
ность операции. Применение должно признать и разрешить ненулевое
состояние.


БЛОК ПОЗИЦИИ (Position Block)

Применение COBOL должно разместить 128 байтовую запись, которую
Btrieve использует для хранения структур ввода/вывода файла и
размещения информации, описанной в Главе 2. Ваше применение
должно разместить отдельный блок позиции для каждого файла
Btrieve, который он открывает. Btrieve инициализирует эту запись,
когда ваше применение выполняет операцию Open, использует и
корректирует данные в этой записи при всех операциях файла.
Поэтому, ваше применение должно передавать одинаковую запись при
всех последовательных операциях Btrieve для файла. Оно никогда не
должно менять значение блока позиции. Когда применение имеет
одновременно более одного открытого файла, Btrieve использует
блок позиции для определения, какой файл предназначен для особого
вызова.


БУФЕР ДАННЫХ (Data Buffer)

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


ДЛИНА БУФЕРА ДАННЫХ (Data Buffer Length)

Для каждой операции, которая требует буферы данных, ваша
программа должна передавать длину буфера данных как 2 байтовое
целое (COMP-0 поле для IBM или Microsoft COBOL). Для файла c
записями фиксированной длины этот параметр должен соответствовать
длине записи, определенной при первичном создании файла. Когда вы
вставляете записи или корректируете файл c записями переменной
длины, этот параметр должен быть равен длине записи, определенной
при первичном создании файла плюс число знаков, включенных кроме


     201/Rev1.00                                              5-15



Управление записями Btrieve                                  


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


БУФЕР КЛЮЧА (Key Buffer)

При каждом вызове Btrieve ваше применение должно передавать
переменную записи, содержащую значение ключа. Если ключ состоит
из двух или нескольких сегментов, перечислите их в правильном
порядке как индивидуальные поля под записью уровня 01. Затем вы
можете передавать всю запись к Btrieve как буфер ключа. B
зависимости от операции Ваше применение может установить эту
переменную или ee может вернуть система управления записями
Btrieve.

Btrieve не может определить длину буфера ключа, когда вы
вызываете его c IBM (или Microsoft) COBOL программы. Поэтому вы
должны гарантировать, что буфер, по крайней мере, такой же длины,
как и длина ключа, которую вы определили при создании файла. B
противном случае, запросы Btrieve могут разрушить элементы
данных, следующих за буфером ключа.


HOMEP КЛЮЧА (Key Number)

Вы можете определить до 24 разных ключей, когда вы создаете файл
Btrieve. Применение, обращающееся к файлу, должно сообщить сис-
теме управления записями, каким путем доступа следовать при
определенной операции. Параметр номера ключа - это 2 байтовое
целое (COMP-0 для IBM или Microsoft COBOL) co значение от 0 до
23. Btrieve никогда не меняет этот параметр.


ПРИМЕР ПЕРЕЧНЯ ПАРАМЕТРОВ.

Код для IBM (или Microsoft) COBOL применения на рис.4.5 открывает
файл Btrieve и извлекает запись данных, соответствующих первому
значению для ключа 0, поле имени.

     IDENTIFICATION DIVISION.
     PROGRAM ID EX1.
     ENVIRONMENT DIVISION.
     DATA DIVISION.
     WORKING-STORAGE SECTION.
     77  B-OPEN          PIC 99 COMP-0  VALUE 0.
     77  KEY-NUMBER      PIC 99 COMP-0 VALUE 0.
     77  B-STATUS        PIC 99 COMP-0.
     01  B-GET-FIRST     PIC 99999 COMP-0 VALUE 12.
     01  DSP-STATUS      PIC 99999
     01  DATA-BUFFER.
     02  NAME            PIC X(30).
     02  STREET          PIC X(30).
         02 CITY         PIC X(30).
         02 STATE        PIC XX
         02 ZIP          PIC 9(5).
     01  BUF-LEN         PIC 99 COMP-0 VALUE 97.
     01  FILE-NAME       PIC X(14) VALUE "ADDRESS.BTR".


     201/Rev1.00                                              5-16



                                   Управление записями Btrieve


     01  KEY-BUFFER      PIC(30).
     01  POSITION-BLOCK  PIC X(128) VALUE SPACES.

     PROCEDURE DIVISION.
          CALL 'BTRV' USING B-OPEN, B-STATUS, POSITION-BLOCK,
               DATA-BUFFER, BUF-LEN, FILE-NAME, KEY-NUMBER.
          IF B-STATUS NOT=0
               MOVE B-STATUS TO DSP-STATUS
               DISPLAY "Error opening file, Status = "DSP-STATUS
               STOP RUN.
          DISPLAY (1,1) ERASE
          CALL 'BTRV' USING B-GET-OPEN, B-STATUS, POSITION-BLOCK,
               DATA-BUFFER, BUF-LEN, KEY-BUFFER, KEY-NUMBER.
          IF B-STATUS NOT=0
               MOVE B-STATUS TO DSP-STATUS
               DISPLAY (5,1) "Error reading file, Status = "DSP-STATUS
          ELSE
               DISPLAY (5,1) "First record in file is" DATA-BUFFER.
          STOP RUN.

                            Рис.5.5
                   Вызов Btrieve из IBM COBOL.






































     201/Rev1.00                                              5-17



Управление записями Btrieve                                  


СОПРЯЖЕНИЕ BTRIEVE C "C"

Дискет c Btrieve содержит интерфейсы для Microsoft и Lattice C, a
также несколько других компиляторов C. Формат для вызова Btrieve
идентичен для каждого. Для сопряжения c любым другим компилятором
C обратитесь к Приложению F, в котором описано, как взаимо-
действовать c Btrieve из ассемблера.

Ваш дискет программ Btrieve содержит исходный текст для каждого
из этих интерфейсов. Bce интерфейсы C написаны в C.

Чтобы обратиться к файлу Btrieve, ваше применение должно вызвать
функцию целого BTRV. Btrieve обеспечивает небольшой программой
интерфейса, которая соединяет систему управления записями Btrieve
c вашим применением. До пуска применения вы должны загрузить
Btrieve.


СОЕДИНЕНИЕ "C" ПРИМЕНЕНИЯ C BTRIEVE.

После того, как вы успешно компилируете вашу C-программу,
соедините ee c интерфейсом C. Метод, используемый для соединения
интерфейса C, немного меняется в зависимости от того, какой C
компилятор вы используете. Полное объяснение процесса редакти-
рования дано в руководстве к операционной системе и справочнике к
компилятору.

Если вы используете компилятор Microsoft C, вы должны компи-
лировать интерфейс в файле MSCXBTRV.C, используя свой компилятор.
Если вы компилируете c large моделью, Вы должны отредактировать
исходный файл интерфейса и внести изменения, описанные в этом
документе. Соедините ваше применение, как показано в следующем
примере:

     Object Modules [.OBJ]: c+cprog+mscxbtrv


ВЫЗОВ BTRIEVE ИЗ "C".

Ваше применение никогда не должно выполнять какие-либо стан-
дартные "C" вводы/выводы для файла Btrieve. Оно должно управлять
вводом/выводом через вызов к Btrieve. После запроса операции Open
ваша программа может читать,писать и модифицировать файлы через
вызовы Btrieve. До завершения ваше применение должно выполнить
операцию Btrieve Close.

Ваше применение делает вызовы к Btrieve через функцию целого,
BTRV. Результатом функции всегда является целое значение, которое
соответствует одному из кодов состояния, перечисленным в Прило-
жении B. После вызова Btrieve ваше применение должно всегда
проверять значение переменной состояния. Состояние 0 указывает на
успешность операции. Ваше применение должно быть способным
признать и разрешить ненулевое состояние.

Функция BTRV преполагает параметры следующих типов:

     int BTRV (OP, POS_BLK, DATA_BUF, BUF_LEN, KEY_BUF, KEY_NUM9
     int OP;                 /*operation code*/


     201/Rev1.00                                              5-18



                                   Управление записями Btrieve


     char POS_BLK[];         /*position blоск*/
     char DATA_BUF[];        /*data buffer*/
     int  *BUF_LEN;          /*length of data buffer*/
     char KEY_BUF[];         /*кеу buffer*/
     int  KEY_NUM;           /*кеу number*/

Несмотря на то, что вы должны обеспечивать все параметры при
каждом вызове, Btrieve не использует каждый параметр для каждой
операции. B некоторых случаях Btrieve игнорирует их значение.
Более подробное описание соответствия параметров операциям дано
в главе 6. B следующих разделах описан каждый параметры.


ОПЕРАЦИЯ (Operation)

Параметр код операции определяет, какой тип операции Btrieve вы
хотите выполнить. Это может быть операция чтения, записи,
удаления и корректирования. Ваше применение определить действи-
тельный код операции при каждом каждом вызове Btrieve. Система
управления записями никогда не меняет код. Переменная, которую вы
опредяете, должна быть целого типа и может быть одним из легаль-
ных кодов операции Btrieve, описанных в главе 6. Смотрите также
полный перечень этих кодов в Приложении A.


БЛОК ПОЗИЦИИ (Position Block)

Применение "C" размещает 128 байтовый массив знаков, которые
Btrieve использует для хранения структур ввода/вывода файла и
информации расположения, описанной в Главе 2. Btrieve использует
этот массив, когда ваше применение выполняет операцию Open.
Btrieve соотносится и корректирует данные в этом массиве для всех
операций файла. Поэтому ваше применение должно передавать
одинаковый массив при всех последовательных операциях Btrieve.
для файла. Оно не должно менять значение, хранимое в этом массиве
в это время.

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


БУФЕР ДАННЫХ (Data Buffer)

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


ДЛИНА БУФЕРА ДАННЫХ (Data Buffer Length)





     201/Rev1.00                                              5-19



Управление записями Btrieve                                  


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


БУФЕР КЛЮЧА (Key Buffer)

Ваше применение должно передавать адрес переменной, содержащей
значение ключа при каждом вызове Btrieve. Если вы определили ключ
как двоичный при первичном создании файла, вы должны определить
переменную как int, long, или unsigned. Если вы первоначально
определили ключ как строку, вы должны определить переменную
буфера ключа, как структуру или массив. Если ключ состоит из двух
или нескольких сегментов, используйте переменную структуры,
которая содержит поля сегмента в правильном порядке. B зависи-
мости от операции ваше применение может установить эту переменную
или ee может вернуть Btrieve.

Btrieve не может определить длину буфера ключа при вызове из
программы "C". Поэтому вы должны гарантировать, что буфер, по
крайней мере, такой длины, как длина ключа, которую вы определили
при первичном создании файла. B противном случае запросы Btrieve
могут разрушить элементы данных, хранимые в памяти за буфером
ключа.


HOMEP КЛЮЧА (Key Number)

Вы можете определить до 24 разных ключей при  создании файла
Btrieve. Поэтому применение, обращающееся к файлу, должно
сообщать системе управления записями, каким путем доступа
следовать для выполнения определенной операции. Параметр номера
ключа - это целая переменная co значением от 0 до 23.
Администратор записи Btrieve никогда не меняет этот параметр.


ПРИМЕР ПЕРЕЧНЯ ПАРАМЕТРОВ

Код "C" на рис.4.6 открывает файл Btrieve и извлекает записи
данных, соответствующую первому значению ключа 0, поле имени.


     #define B_OPEN  0
     #define B_FIRST 12

     main (){
     struct ADDR_REC           /*Structure of address file record*/
          {
               char NAME[30];
               char STREET[30];


     201/Rev1.00                                              5-20



                                   Управление записями Btrieve


               char CITY[30];
               char STATE[2];
               char ZIP[5];
          };

     struct ADDR_REC ADDR_BUF;
     int    DB_LEN;
     char   KEY_BUF[30];
     char   POS_BLK[128];
     int    STATUS;

     STATUS = BTRV (B_OPEN, POS_BLK, &ADDR_BUF, &DB_LEN,"ADDRESS.BTR",0);
     if (STATUS = 0)
          {
               printf ("Error opening file Status=%d", STATUS);
               exit(0);
          }
     DB_LEN = sizeof (ADDR_BUF);
     STATUS = BTRV (B_FIRST, POS_BLK, &ADDR_BUF, &DB_LEN, KEY_BUF, 0);
     if (STATUS !=0)
          printf ("Error reading file Status=%d", STATUS);
     else
          printf ("First record in file is: %97s", &ADDR_BUF);
     }
     
                  Рис.5.6  Вызов Btrieve из "C"


































     201/Rev1.00                                              5-21



Управление записями Btrieve                                  


СОПРЯЖЕНИЕ BTRIEVE B АССЕМБЛЕРЕ 

Если вы используете язык ассемблера или язык программирования,
для которых нет интерфейса на дискете Btrieve, вы можете написать
интерфейс, используя язык ассемблера. Сопряжение Btrieve c
подпрограммой языка acсемблера требует выполнения трех основных
ступеней:

     * Хранение параметров Btrieve в памяти в формате,
       предполагаемом системой управления записями .

     * Проверка наличия загруженности системы управления записями
       в память.

     * Вызов системы управления записями через прерывание,
       которое передает контроль Btrieve.


ХРАНЕНИЕ ПАРАМЕТРОВ

B предыдущих разделах этой главы были описаны только семь
параметров Btrieve: состояние, код операции, блок позиции, буфер
данных, длина буфеpa данных, буфер ключа, номер ключа. (Интерфейс
BASIC объединяет блок позиции и буфера данных в один параметр,
FCB. Интерфейсы Pascal и C возвращают состояние как значение
функции).

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


Параметр     Смещение    Содержание

1            0           Смещение буфера данных
                         Сегмент буфера данных
2            4           Длина буфера данных
3            6           Смещение информации расположения
                         Сегмент информации расположения
4           10           Смещение FCВ
                         Сегмент FCB
5           14           Код операции
6           16           Смещение буфера ключа
                         Сегмент буфера ключа
7,8         20           Длина ключа  / номер ключа
9           22           Смещение состояния
                         Сегмент состояния
10          26           Интерфейс ID

                            Рис. 5.7
                   Структура параметров Btrieve





     201/Rev1.00                                              5-22



                                   Управление записями Btrieve


Прежде чем вызвать Btrieve, вы должны инициализировать область
данных, содержащую все десять параметров, перечисленных на рис.
5.1. Поместите смещение области данных в DX регистре. Btrieve
предполагает адрес блока параметров в DS:DX, когда передается
управление.


ОПИСАНИЕ ПАРАМЕТРОВ

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


БУФЕР ДАННЫХ (Data Buffer)

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


ДЛИНА БУФЕРА ДАННЫХ (Data Buffer Length)

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


ИНФОРМАЦИЯ РАСПОЛОЖЕНИЯ (Positioning Information)

Передавайте информацию расположения как двойное слово, содержащее
адрес сегмента и смещение 90-байтовой области данных, которую
Btrieve использует для хранения информации расположения o файлах.
Это один из параметров, извлекаеммый интерфейсом применения
Btrieve. B BASIC эта область идет из BASIC FCB. В других языках,
для этой цели используется часть параметра блока позиции. Вы
должны обеспечить адрес 90-байтовой области для системы
управления записями , чтобы использовать его при вызове Btrieve c
языка ассемблеpa. Такая же область данных должна быть передана к
Btrieve при всех вызовах для одного и того же файла.


FCВ

Передавайте FCB как двойное слово, содержащее адрес сегмента
и смещение 38 байтовой области данных, которую Btrieve использует
для хранения DOS FCB. Это один из параметров, извлекаемый
интерфейсами применения Btrieve. B BASIC эта область поступает из
BASIC FCB. В других языках, для этой цели используется часть
параметра блока позиции. Вы должны обеспечить адрес 38-байтовой
области для системы управления записями , чтобы использовать его



     201/Rev1.00                                              5-23



Управление записями Btrieve                                  


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


КОД ОПЕРАЦИИ (Operation Code)

Передавайте код операции как слово, содержащее код операции
Btrieve. Это должен быть один из кодов операции Btrieve,
перечисленных в Приложении A.


БУФЕР КЛЮЧА (Key Buffer)

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


ДЛИНА КЛЮЧА (Key Length)

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

Интерфейсы к Btrieve c COBOL и C не могут определить длину буфера
ключа, т.к. она не передаются c типом данных от компилятора. B
этих случаях Btrieve передает максимально допустимую длину ключа.
Система управления записями никогда не записывает на буфер данных
кроме определенной длины ключа. Btrieve вернет ошибку, если этот
параметр короче, чем определенная длина ключа.


HOMEP КЛЮЧА (Key Number)

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


КОД СОСТОЯНИЯ (Status Code)

Передавайте код состояния как двойное слово, содержащее адрес
сегмента и смещение параметра состояния. Это адрес, по которому
Btrieve хранит код состояния после завершения операции.


ID ИНТЕРФЕЙСА

Передавайте ID интерфейса как слово, инициализированное как
06176H. Если вы устанавливаете идентификатор на любое другое
значение, Btrieve не разрешит доступ к файлам c записями
переменной длины. Этот контроль разрешает Btrieve определить,
сделан ли вызов от применений, соединенных c предыдущими версиями
интерфейса, которые не понимают записи переменной длины.


ПРОВЕРКА ЗАГРУЖЕННОСТИ BTRIEVE



     201/Rev1.00                                              5-24



                                   Управление записями Btrieve


После инициализации параметров проверьте, загружена или нет
система управления записями. Когда Btrieve загружен, он
записывает точку входа для прерывания вектора 07BH. Проверьте,
что слово на векторе прерывания 07BH инициализировано как 033H
для определения того, что Btrieve загружен в память.


ВЫЗОВ BTRIEVE

После записи адреса параметров Btrieve в DX и проверки
загруженности системы управления записями, вы готовы вызвать
Btrieve. Выполните прерывание 07BH и система управления записями
обработает ваш запрос. Когда операция выполнена, управление
возвращается на инструкцию, следующую за вызовом прерывания.
Следующий пример показывает код, который проверяет загружена ли
система управления записями, потом выполняет прерывание.

     BTR_ERR     EQU 20
     BTR_VECTOR  EQU 07BH*4
          PUSH  DS
          SUB   BX,BX                          ;Clear BX
          MOV   DS,BX                          ;DS =>absolute 0
          CMP   WORD PTR BTR_VECTOR[BX],033H   ;Has Btrieve been  initialized?
          POP   DS
          JMP   DO_INT                         ;Yes - go perform  interrupt
          MOV   STAT,BTR_ERR                   ;No - set status 20
          JMP   OUT                            ;and peturn to caller
     DO_INT:
          INT   07BH                           ;Call the Record Manager































     201/Rev1.00                                              5-25



Управление записями Btrieve                                  


ИНТЕРФЕЙСЫ OS/2 

NetWare Btrieve включает два интерфейса для компилятора C для
OS/2 (C2XBTRV.C и C2FXBTRV.C), которые вы можете включать c
применениями, которые будут работать на рабочих станциях OS/2.
C2XBTRV.C интерфейс предназначен для использования c применениями
защищенного режима. C2FXBTRV.C интерфейс предназначен для
применения c программами OS/2 FAPI.

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


"C" ЯЗЫК

Если вы используете компилятор "C" , поставленный c OS/2, вы
имеете две режима:

     * Вы можете компилировать либо C2XBTRV.C, либо C2FXBTRV.C
       интерфейс отдельно от вашей программы. Либо включите
       результирующий объектный модуль при соединении ваших
       программ, либо поместите объектный модуль в библиотеку,
       который вы включаете вместе c вашим каналом связи.

     * Вы можете включить исходный текст интерфейса, содержащийся
       либо в C2XBTRV.C либо в C2FXBTRV.C, в исходный код вашего
       применения, когда вы компилируете свою программу.


ЯЗЫК АССЕМБЛЕРА

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

     * Передавайте все параметры через стек.

     * Используйте AX регистр для получения обратного кода от
       Btrieve.

     * Используйте форму selector:offset для всех адресов
       интерфейса.

     * Обращайтесь к подпрограмме динамической связи,
       используя FAR CALL.

     * He "вынимайте" (pop) возвращаемые параметры из стека.

     * Задавайте имя подпрограммы динамической связи в верхнем
       регистре.


РЕДАКТИРОВАНИЕ OS/2 ПРИМЕНЕНИЙ


     201/Rev1.00                                              5-26



                                   Управление записями Btrieve



Внешние ссылки на подпрограммы динамической связи разрешаются
одинаковым путем на языке "C" и ассемблера.

Вы должны указать библиотеку BTRCALLS.LIB компоновщику, когда вы
компонуете ваши объектные файлы. Эта библиотека содержит записи
определения динамической связи, которые обеспечивают соответствие
между вызванной подпрограммой и файлом BTRCALLS.DLL. Если
компоновщик не имеет доступа к BTRCALLS.LIB, он сообщает
неразрешенные ссылки для входных точек динамической связи.


     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     ПРИМЕЧАНИЕ:

     При создании семейства применей, вы должны использовать
     интерфейс C2FXBTRV.C, отредактируйте свое применение, затем
     заустите утилиту OS/2 BIND. Программа BUTIL.EXE - пример
     применения FAPI.
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД


СОПРЯЖЕНИЕ C BROUTER

Если вы пишете VAP, который использует файлы Btrieve, вы должны
включить интерфейс к BROUTER в ваш код. Следуйте методике,
описанной в Главе "Сопряжение c Btrieve в ассемблере",
начинающейся на стр. 5-26 co следующими дополнениями:

     * Запросите вызов функции NetWare "Get Interrupt Vector" для
       определения загруженности BROUTER. Если вектор для 7B
       прерывания равен нулю, BROUTER не загружен.

     * Помещайте уникальный номер ID клиента в AX регистре до
       выполнения 7B прерывания.

     * Идентифицируйте каждую рабочую станцию, которая обращается
       к VAP, уникальным 2-байтовым номером ID клиента. Вы должны
       обеспечить этот номер для BROUTER для обработки соперни-
       чества и транзакций. Удобный метод для генерирования
       номера ID клиента - использование сетевого адреса рабочей
       станции в первом байте, a уникального двоичного значения
       во втором байте.

     * Идентифицируйте ваш VAP для BROUTER, используя уникальный
       2-значный ASCII идентификатор в BX регистре. Этот
       идентификатор различает ваш VAP от любого другого VAP,
       который обращается к BROUTER. Для получения идентификатора
       для вашей VAP обратитесь в Novell Development Products
       Division. Его адрес

                 Novell Development Products Division
                       6034 West Courtyard
                            Suite 220
                        Austin, TX 78730

B общем ваш интерфейс к BROUTER выполняь все следующие шаги:



     201/Rev1.00                                              5-27



Управление записями Btrieve                                  


     * Проверить, загружен ли BROUTER путем выполнения вызова
       функции NetWare "Get Interrupt Vector".

     * Записать блок параметров Btrieve в памяти в формате,
       предполагаемом системой управления записями .

     * Записать адрес блока параметров Btrieve в DX регистре.

     * Записать номер ID клиента, который уникален для каждой
       рабочей станции, в AX регистре.

     * Записать уникальный 2-значный ASCII идентификатор для VAP
       в регистре BX.

     * Выполнить 7B прерывание, которое передает контроль от
       вашего VAP к BROUTER.












































     201/Rev1.00                                              5-28


6
                                   Управление записями Btrieve
-------------------------------------------------ДД

6. Btrieve операции с записями
-------------------------------------------------

Здесь описаны команды  из 36 операций,  которая поддерживаются
Btrieve. Для каждой операции приводится следующая информация:

     * Назначение операции

     * Таблица, содержащая значения параметров, которые
       передаются и возвращаются Btrieve вашей программе

     * Описание, что делает операция

     * Требования к Вашей программе, для успешного выполнения
       операций

     * Требуемая процедура транзакции параметров операции

     * Результат выполнения успешного и неуспешного окончания
       операций

     * Влияние выполнения операции на текущую позицию в файле

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

Состояния нет в таблице при использовании Btrieve. Вашей
программе нет необходимости инициализировать поле статуса.
Btrieve всегда возвращает состояние Вашей программе.

В приложениях C, D, E и F приведены примеры, иллюстрирующие
каждую операцию для Pascal, Cobol, C.


ABORT TRANSACTION (21)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Эта команда уничтожае все операции вызванные активной транзакцией
и оканчивает транзакцию.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Ваша программа может использовать эту команду для отмены
танзакции. Команда прекращает все операции вызванные после
команды "Начать транзакцию" и оканчивает текущую транзакцию.

ТРЕБОВАНИЯ:

До того как Вы все вызовете операцию "отменить транзакцию" должны
быть выполнены следующие требования:



     201/Rev1.00                                              6-1



Управление записями Btrieve
-------------------------------------------------ДД

     * Вы должны специфицировать управляющий файл транзакций
       (используя опцию /T:) при загрузке Btrieve.

     * Перед использованием операции "отменить транзакцию" Вы
       должны успешно выполненную операцию "начать транзакцию".

ПРОЦЕДУРА:

Для выполнения данной операции установите код операции 21 перед
выполнение вызова Btrieve. Btrieve игнорирует другие параметры
при вызове "отменить транзакцию".

РЕЗУЛЬТАТ:

Если результат выполнения операции успешен, Btrieve возвращает
код состояния 0. Все операции "Вставить (2)", "Изменить (3)", и
"Удалить (4)"б выполняемые при операции "начать  транзакцию"
будут завершены.

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

     * 36 Транзакции не используются

     * 39 Транзакция не начата

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция на текущую позицию не влияет.


BEGIN TRANSACTION (19)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Эта операция решает выполнение набора логических операций
Btrieve.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Данная операция определяет начало транзакции. Операциями Btrieve
удобно пользоваться для тех случаев, когда Вам необходимо
выполнить множество операций Btrieve для записи единичного
события и когда Ваша база данных несовместима и все операции над
ней не завершимы. Транзакция может включать любое число операций
Btrieve при работе с неболее, чем 12 различными файлами.
Используя множество операций между операциями "начать транзакцию"
и "закончить транзакцию", Вы должны убедиться
в том, что Btrieve не начинает операций не закончив другие.

ТРЕБОВАНИЯ:

До начала выполнения операции должны быть выполнены  следующие
условия:


     201/Rev1.00                                              6-2



                                   Управление записями Btrieve
-------------------------------------------------ДД


     * При конфигурации BSERVER Вы должны определить файл
       управления транзакцией.

     * До начала выполнения операции предыдущие транзакции должны
       быть завершены.

ПРОЦЕДУРА:

Для выполнения операции установите код операции 19. Btrievе будет
игнорировать все другие параметры.

РЕЗУЛЬТАТ:

В случае успешного выполнения операции Btrieve возвратный  код
состояния нулевой.

Если операция окончится неудачно, то Btrieve возвратит ненулевой
код. Самыми распространенными кодами являются следующие:

     * 36 Не конфигурирован для транзакции

     * 37 Транзакция активна

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция не влияет на позиционирование.


CLEAR OWNER (30)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Данная операция удаляет имя "хозяина", ассоциированное
с файлом Btrieve.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Данная операция удаляет имя, которое назначено файлу операцией
"назначить хозяина". Если данные были зашифрованы, Btrievе
дешифрует данные во время операции "Clear Owner".

ТРЕБОВАНИЯ:

До того как Ваша программа использует данную операцию,  должны
быть выполнены следующие требования:

     * Файл Btrieve должен быть открыт

     * Имя должно быть назначено данному файлу

     * Транзакции не должны быть активны

ПРОЦЕДУРА:



     201/Rev1.00                                              6-3



Управление записями Btrieve
-------------------------------------------------ДД

Для выполнения операции установите следующие параметры:

     * Установите код операции 30

     * Передайте блок позиций, который идентифицирует файл

РЕЗУЛЬТАТ:

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

Ненулевые коды возврата следующие:

     * 3 файл не открыт

     * 41 операция недопустима

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция не влияет на текущую позицию.


CLOSE (1)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Данная операция закрывает файл Btrieve.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

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

ТРЕБОВАНИЯ:

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

     * Файл должен быть открыт

     * Все транзакции должны быть закончены

ПРОЦЕДУРА:

Для выполнения операции установите следующие параметры:

     * Установить код операции 1



     201/Rev1.00                                              6-4



                                   Управление записями Btrieve
-------------------------------------------------ДД

     * Передайте блок позиций файла, который Вы желаете закрыть

РЕЗУЛЬТАТ:

При успешном выполнении операции "закрыть":

     * Блок позиций закрытого файла не будет больше
       действительным. Ваша программа может использовать его для
       другого файла или использовать область данных для других
       целей.

     * Каждый "зеркальный" файл, ассоциированный с закрытым
       файлом данных будет удален, если файл Btrieve не открыт
       другими рабочими станциями.

Если операция выполнилась неудачно, файл останется открытым.
Ненулевой код состояния для данной операции - (файл не откерыт).

ТЕКУЩАЯ ПОЗИЦИЯ:

Любая информация о позиционировании теряется.


CREATE (14)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция создает файл Btrieve со специфицированным набором
характеристик.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Операция позволяет Вам создавать файл Btrieve из Вашей программы.
Возможно также выполнение утилиты CREATE, описанной в главе 3.
Смотри главу 1 и 2 этого руководства для получения полной
информации о файле и характеристиках, которые необходимо
специфицировать при создании файла.

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

     * Спецификацию файла

     * Характеристики ключа

     * Альтернативную последовательность

     * Длину буфера данных

Буфер данных должен быть формата, приведенного в таблице 6.1.

     Описание Длина
     --------------------------------


     201/Rev1.00                                              6-5



Управление записями Btrieve
-------------------------------------------------ДД

     : длина записи             : 2 :
     : размер страницы          : 2 :
     : число индексов           : 2 :  Спецификация
     : не используется          : 4 :      файла
     : флаги файла              : 2 :
     : зарезервированной слово  : 2 :
     : распределенное           : 3 :
     --------------------------------

     Описание                  Длина
     --------------------------------
     : позиция ключа            : 2 :
     : длина ключа              : 2 :
     : флаги ключа              : 2 :  Спецификация
     : не используется          : 4 :      ключа
     : тип расширения ключа     : 1 :
     : пустое значение          : 1 :
     : зарезервировано          : 4 :
     --------------------------------

     Табл.6.1. Структура буфера данных для операции Creatе

СПЕЦИФИКАЦИЯ ФАЙЛА:

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

Вы должны распределить "неиспользуемые" и "резервированные" поля
в буфере данных, хотя они неиспользуются. Инициализируйте нулем
зарезервированные поля для совместимости с дальнейшим развитием
Btrieve.

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

Нумерация битов в слове флагов файла - от5 до 15, при этом 0
означает младший бит. Установите биты в соответствии со следующим
описанием:

     * Если bit0 = 1, файлы могут содержать записи переменной
       длины.

     * Если bit1 = 1, пробелы в конце записей переменой длины
       будут усечены.

     * Если bit2 = 1, Btrieve предварительно распределит число
       страниц, которого Вы специфицируете в слове распределения.

     * Если bit3 = 1, Btrieve сожмет данные в файле.

     * Если bit4 = 1, Btrieve создает файл с доступом по ключу.


     201/Rev1.00                                              6-6



                                   Управление записями Btrieve
-------------------------------------------------ДД


     * Если bit6 = 1, Btrieve будет поддерживать формат с 10%
       свободным пространством при работе со страницами
       переменной длины.

     * Если bit7 = 1, то же самое, что и bit6, на 20%.

     * Если bit7 = bit6 = 1, то же самое, на 30%.

Следующая таблица представляет значения флагов файла в двоичном и
десятичном представлении:

     Значение                      Двоичный   Десятичный

     Переменная длина              00000001       1
     Усечение пробелов             00000010       2
     Предварительное распределение 00000100       4
     Сжатие данных                 00001000       8
     Только по ключу               00010000      16
     10% свободно                  01000000      64
     20% свободно                  10000000     128
     30% свободно                  11000000     192

Если Вам нужно определить комбинацию атрибутов файла,  сложите
соответствующие атрибуты. Напимер, для того, чтобы  определить
файл который  позволяет записи  переменной длины  и использует
усечение  пробелов,  инициализация  флага  файла должен быть
= 3(2+1). Если флаг переменной длины установлен в ноль,  Btrievе
игнорирует усечение пробелов  и предельные границы  свободного
пространства.

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

ХАРАКТЕРИСТИКИ КЛЮЧА:

Расположите характеристики ключа непосредственно за блоком
спецификации файла. Для каждого ключевого сегмента файла
распределите 16 байтовый ключевой блок спецификации. Код
расширенного ключа и "null" символ должен быть по 1 байту длиной.

Записывайте информацию о позиции ключа и длину ключа в виде
целого ключа.

Установите флаги ключа в соответствие со следующим описанием: .
Если bit0 = 1, допускается дуплексирование ключей.

     * Если bit1 = 1, ключ модифицируемый.

     * Если bit2 = 0 и bit8 = 0, ключ-строка.

     * Если bit2 = 1 и bit8 = 0, ключ двоичный.

     * Если bit3 = 1, ключ имеет нулевое значение.

     * Если bit4 = 1, ключ имеет другой сегмент.


     201/Rev1.00                                              6-7



Управление записями Btrieve
-------------------------------------------------ДД


     * Если bit5 = 0, ключ отсортированный с помощью
       альтернативной последовательности.

     * Если bit6 = 1, ключ отсортирован по нисходящей.

     * Если bit7 = 1, игнорируется операцией "создать".

     * Если bit8 = 0, ключ стандартного типа.

     * Если bit8 = 1, ключ расширенного типа.

     * Если bit9 = 1, ключ "ручной".

Хотя Btrieve игнорирует bit7 при выполнении операции "создать",
Вы должны его обнулить при создании файла. При выполнении
операции "статус" (15) Btrieve установит бит7 в 1, если ключ
поддерживает индекс и возвращает ключи флага в буфере данных.

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

     Атрибут            Двоичный Шестнадцатиричный Десятичный

     Дублируемый         00000001         01              1
     Модифицируемый      00000010         02              2
     Двоичный            00000100         04              4
     Пустой              00001000         08              8
     Сегментированный    00010000         10             16
     Отсортирован
     альтернативно
     последней           00100000         20             32
     Отсортирован
     по нисходящей       01000000         40             64
     Расширенный тип   1 00000000         80            128
     "ручной"         10 00000000        100            256

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

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

     * В первом блоке ключа установите бит4 флагов ключа в 1. Это
       показывает, что следует следующее определение другого
       сегмента другого ключа.

     * Для второго блока ключа установите бит4 флагов ключа в
       ноль. Это означает, что этот блок определяет последний
       сегмент для первого ключа.

     * В третьем блоке ключа установите бит4 флагов в ноль, что
       означает, что второй ключ имеет только один сегмент.




     201/Rev1.00                                              6-8



                                   Управление записями Btrieve
-------------------------------------------------ДД

В 10 байте специфицируйте расширенный тип ключа как двоичное.
Значения расширенных типов ключей:

     ТИП                  ЗНАЧЕНИЕ

     Строка                   0
     Целое                    1
     С плавающей запятой      2
     Дата                     3
     Время                    4
     Десятичное               5
     Money                    6
     Логическое               7
     Цифровое                 8
     Bfloat                   9
     Lstring                 10
     string                  11
     Двоичное без знака      14
     Автоинкремент           15

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

(336 десятичное) в слово флаговю


     -------------------------------------------------

     ПРИМЕЧАНИЕ:

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

     -------------------------------------------------

ИЗМЕНЕНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ СОРТИРОВКИ:

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

Вы можете создать альтернативную последовательность для типов
ключа - listing, zstring и string. Поместив определение
последовательности непосредственно после последнего блока
спецификаций ключа, Вы устанавливаете флаг альтернативной
последовательности для любого ключа либо для ключевого сегмента в
файле.






     201/Rev1.00                                              6-9



Управление записями Btrieve
-------------------------------------------------ДД

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

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ПРИМЕЧАНИЕ:

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

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

ДЛИНА БУФЕРА ДАННЫХ.

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

Например, при создании файла, который имеет два ключа в каждом
сегменте и последовательность "alternate collating" буфер данных
должен быть длиной 313 байт как показано ниже.

     File   Key1   Key2   Alt
     Spec + Spec + Spec + Col
     ------------------------
     16  +  16  +  16  + 256 = 313

КЛЮЧЕВОЕ СЛОВО.

Вы можете использовать этот пример, если Вы желаете, чтобы
Btrieve предупреждал Вас, что файл с данным именем уже
существует. Задавайте значение ключевого числа следующим образом:

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

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

ТРЕБОВАНИЯ:

Если Вы создаете пустой файл Btrieve на месте существующего файла
Btrieve, убедитесь, что файл закрыт. Затем выполняйте операцию
"создать".

ПРОЦЕДУРА:

Для выполнения операции "создать" установите параметры Btrieve в
следующем порядке:


     201/Rev1.00                                              6-10



                                   Управление записями Btrieve
-------------------------------------------------ДД


     * Код операции - 14.

     * Задайте спецификации файла, характеристики ключа и
       "alternate collating" последовательность в буфере данных.
       Значения спецификаций файла и характеристик ключа в буфере
       данных должны быть в двоичном формате.

     * Задайте длину буфера данных.

     * Установите параметр "ключевое слово" в - 1, если желаете,
       чтобы Btrieve предупреждал Вас о существующем файле с
       данным именем. Иначе установите параметр в 0.

     * Задайте в буфере ключа имя файла. В имени файла Вы можете
       указать имя устройства и путь и задать несколько уровней
       директорий.

РЕЗУЛЬТАТ:

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

Если операция закончилась успешно, Btrieve возвращает нулевой код
состояния. Возможны следующие коды:

     * 2 Ошибка ввода/вывода файла

     * 22 Буфер данных недостаточной длины

     * 24 Ошибка размера страницы

     * 25 Ошибка ввода/вывода при создании

     * 26 Ошибочное число ключей

     * 27 Неправильная позиция ключа

     * 28 Неверная длина записи

     * 29 Неверная длина ключа

     * 48 Неверное определение альтернативной последовательности

     * 49 Ошибка типа ключа

     * 59 Файл уже существует

Подробное обеспечение кодов состояний в приложении В.

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция не имеет информации о позиционировании.




     201/Rev1.00                                              6-11



Управление записями Btrieve
-------------------------------------------------ДД

CREATE SUPPLEMENTAL INDEX (31)
-------------------------------------------------
(создать дополнительный индекс)

НАЗНАЧЕНИЕ:

Операция "Create Supplemental Index" дает дополнительный индекс
существующему файлу Btrieve.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Как только файл создан, используйте "Create Supplemental Index"
операцию, чтобы добавить индекс.

ТРЕБОВАНИЯ:

Перед началом данной операции необходимо выполнить следующие
условия:

     * Файл Btrieve должен быть открыт.

     * Число ключевых сегментов в файле не должно превышать
       формулу.

       24 - (#добавляемые сегменты)

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

     * Транзакция должна быть выключена.

ПРОЦЕДУРА:

Чтобы создать дополнительный индекс, задайте параметры Btrieve,
как указано ниже:

     * Установите код операции в 31.

     * Передайте позиционный блок Btrieve на файл, к которому Вы
       хотите добавить индекс.

     * Сохраните ключевые спецификации нового индекса в буфере
       данных. Буфер данных состоит из 16-байтового блока
       спецификаций ключа для каждого сегмента дополнительного
       индекса, который Вы создаете. Используйте ту же структуру
       спецификаций ключа, что и в операции "Create" (14).

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

       16* (# сегментов)+265

РЕЗУЛЬТАТ:


     201/Rev1.00                                              6-12



                                   Управление записями Btrieve
-------------------------------------------------ДД


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

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

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

ЧАСТО ВСТРЕЧАЮЩИЕСЯ ОЩИБКИ:

     * 22 Буфер данных слишком короток.

     * 27 Неверная позиция ключа.

     * 41 Операция не разрешена.

     * 45 Противоречивость (несовместимость) флагов ключа.

     * 49 Ошибка типа ключа.

     * 56 Неполный индекс.

Если во время создания дополнительного индекса происходит
нарушение в подаче питания или сброс системы в исходное состояние
Вы можете получить доступ к данным в файле с помощью других
индексов файла. Однако Btrieve возвратит ненулевое состояние,
если Вы попытаетесь получить доступ к данным с помощью неполного
индекса. В этом случае удвлите неполный индекс с помощью операции
"Drop Supplimental Index" (32) и используйте операцию "Create
Sopplimental Index" вновь.

ТЕКУЩАЯ ПОЗИЦИЯ:

Данная операция не влиятет на позиционирование.


DELETE (4)
-------------------------------------------------
(удалить)

НАЗНАЧЕНИЕ:

Удаление существующий записи из файла Btrieve.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:



     201/Rev1.00                                              6-13



Управление записями Btrieve
-------------------------------------------------ДД

С помощью этой операции Вы можете удалить существующую запись из
файла. После удаления записи освободившаяся память помещается в
список свободной памяти.

ТРЕБОВАНИЯ:

До начала выполнения операции следующие условия должны быть
выполнены:

     * Файл должен быть открытым.

     * Вы не можете обращаться к файлу, в котором содержится
       удаляемая запись во время поисками этой записи и ее
       удалением.

ПРОЦЕДУРА:

Чтобы выполнить данную операцию установите параметры Btrieve как
показано ниже:

     * Код операции 4.

     * Передайте позиционный блок файла из которого удаляется
       записть.

     * Инициализируйте параметр длины буфера данных в
       соответствии с длиной удаляемой записи.

     * Заполните номер ключа для поиска...

РЕЗУЛЬТАТ:

В случае успеха Btrieve:

     * Полностью удалите запись из файла.

     * Скорректируйте все ключевые индексы.

     * Установите длину буфера данных в соответствии с длиной
       удаленной записи.

В случае неуспеха Btrieve возвратит код ненулевого состояния.
Часто встречаемые ошибочные коды:

     * 7 Отличный номер ключа.

     * 8 Неверное позиционирование.

ТЕКУЩАЯ ПОЗИЦИЯ:

После удаления Btrieve стирает любую существующую информацию о
позиционировании и устанавливает позицию в файле, как показано
ниже:

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


     201/Rev1.00                                              6-14



                                   Управление записями Btrieve
-------------------------------------------------ДД


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


DROP SUPPLEMENTAL INDEX (32)
-------------------------------------------------
(удаление дополнительного индекса)

НАЗНАЧЕНИЕ:

Эта операция удаляет дополнительный индекс из существующего файла
Btrieve.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Используйте эту операцию для удаления дополнительного индекса из
файла.

ТРЕБОВАНИЯ:

До начала выполнения операции должны быть выполнены следующие
условия:

     * Файл должен быть открыт.

     * Дополнительный индекс должен существовать в файле.

     * Транзакция должна быть выключена.

ПРОЦЕДУРА:

Для удаления индекса должны быть заданы следующие параметры:

     * Код операции 23.

     * Передать блок позиций файла Btrieve.

     * Запомнить номер ключа для дополнительного индекса, который
       Вы хотите удалить, в параметре номера ключа.

РЕЗУЛЬТАТ:

В случае успеха Btrieve:

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

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

В случае неуспеха Btrieve возвратит ненулевое состояние. Часто
встречаемые ненулевые коды состояния:


     201/Rev1.00                                              6-15



Управление записями Btrieve
-------------------------------------------------ДД


     * 6 Неверное число ключей.

     * 41 Операция не разрешена.

Если в процессе выполнения происходит прерывание Вы можете
получить доступ к данным с помощью других индексов файла. Если Вы
попытаетесь обратиться к файлу с с помощью неполного индекса
Btrieve возвратит код состояния 56 (неполный индекс). В этом
случае вновь используйте операцию "Drop Suppemental Index.

ТЕКУЩАЯ ПОЗИЦИЯ:

Данная операция не влияет на позиционирование.


END TRANSACTION (20)
-------------------------------------------------
(закончить транзакцию)

НАЗНАЧЕНИЕ:

Данная операция завершает транзакцию и производит соответствующие
изменения в файлах.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

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

ТРЕБОВАНИЯ:

Перед началом операции Вы должны успешно выполнить операцию
"начать транзакцию" (19).

ПРОЦЕДУРА:

Чтобы выполнить операцию установите код операции 20. При вызове
операции, Btrieve игнорирует любые другие параметры.

РЕЗУЛЬТАТ:

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

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

ТЕКУЩАЯ ПОЗИЦИЯ:

Не влияет на позиционирование.



     201/Rev1.00                                              6-16



                                   Управление записями Btrieve
-------------------------------------------------ДД

EXTEND (16)
-------------------------------------------------
(расширить)

НАЗНАЧЕНИЕ:

Операция разделяет файл Btrieve на два логических диска.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Данная операция позволяет Вашей программе отдельный файл Btrieve
на второй логический диск.

ТРЕБОВАНИЯ:

До выполнения операции должны быть выполнены следующие условия:

     * Расширяемый файл должен быть открыт.

     * Btrieve должен иметь доступ к тому, на который расширяется
       файл.

     * Транзакция не должна быть активной.

ПРОЦЕДУРА:

Чтобы выполнить операцию, задайте следующие параметры Btrieve:

     * Код операции 16

     * Передайте блок для расширяемого файла

     * Заполните имя расширяемого файла в ключевом буфере.
       Задайте имя устройства и полный путь для файла. Заключите
       имя расширяемого файла в пробелы или двоичные нули.

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

РЕЗУЛЬТАТ:

В случае успеха Btrieve расширит файл на два логических канала.
Для доступа к файлу расширения используйте следующее:

     * Сразу после расширения файла Ваша программа должна закрыть
       файл и открыть его вновь до обращения к расширению.

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



     201/Rev1.00                                              6-17



Управление записями Btrieve
-------------------------------------------------ДД

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

Если операция закончилась неуспешно, Btrieve возвращает ненулевое
состояние. Чаще всего встречаются следующие:

     * 31 Файл уже разрешен.

     * 32 Ошибка ввода\вывода при расширении.

     * 34 Неверное имя расширения.

ТЕКУЩАЯ ПОЗИЦИЯ:

Не влияет на позиционирование.


GET DIRECT (23)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция производит поиск записи данных, расположенной по
заданному физическому адресу в файле Btrieve.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

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

     * По физическому адресу Вы можете найти запись быстрее, чем
       по ключу.

     * С помощью операции "получить позицию" Вы можете определить
       4-байтовую позицию записи с точностью до 4-х байт,
       запомнить позицию, и затем вернуться в эту позицию с
       помощью операции "Get Direct".

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

     * Вы можете изменить текущий путь доступа. Операция
       "получить позицию", следующая за операцией "Get Direct" с
       различным числом ключей устанавливает позиционирование в
       другом индексном дереве. Следующая за ним операция "Get
       Next" возвратит следующую запись в файле с новым путем
       доступа.

ТРЕБОВАНИЯ:



     201/Rev1.00                                              6-18



                                   Управление записями Btrieve
-------------------------------------------------ДД

До начала выполнения операции должны быть выполнены следующие
условия:

     * Файл должен быть открыт.

     * Ваша программа с помощью операции "получить позицию"
       должна получить 4-байтовую позицию записи.

ПРОЦЕДУРА:

Для выполнения операции задайте следующие параметры:

     * Код операции 12.

     * Запишите 4-байтовую позицию нужной записи в первых 4-х
       байтах буфера данных.

     * Задайте полную длину буфера данных, так чтобы Btrieve мог
       определить соответствует ли запись к Вашему буферу.

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

РЕЗУЛЬТАТ:

В случае успеха Btrieve:

     * Поместит полученную запись в буфер данныз, перезапишет
       4-байтовое смещение в первых 4-х байтах.

     * Поместит действительную длину записи в параметр длины
       буфера данных.

     * Поместит значение ключа для определения пути доступа в
       буфер ключа.

Если Btrieve не возвращает полученную запись, он возвратит
ненулевое состояние. Чаще всего встречаются следующие коды:

     * 22 Буфер данных слишком короток.

     * 43 Неверные адрес записи данных.

ТЕКУЩАЯ ПОЗИЦИЯ:

После операции "Get Direct", Btrieve стирает текущую информацию о
позиционировании и устанавливает текущую позицию в соответствии с
определенным числом ключей.

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

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


     201/Rev1.00                                              6-19



Управление записями Btrieve
-------------------------------------------------ДД

GET DIRECTORY (18)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция возвращает текущую директорию.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Операция возвращает текущую директорию для определенного
логического накопителя.

ТРЕБОВАНИЯ:

Сразу после загрузки "Record Manager" Ваша программа может
использовать операцию "Get Directory".

ПРОЦЕДУРА:

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

     * Код операции 18.

     * Перед вызовом Btrieve необходимо записать номер
       логического накопителя в пораметре числа ключей. Задайте 1
       для А, 2 для В и т.д. Задайте 0 при использовании
       накопителя по умолчанию.

РЕЗУЛЬТАТ:

Btrieve вернет текущую директорию в буфере ключа, ограничив ее
двоичным нулем.

ТЕКУЩАЯ ПОЗИЦИЯ:

Не влияет.


GET EQUAL (5)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция ищет запись по значению ключа.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

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

ТРЕБОВАНИЯ:

Необходимо выполнение следующих условий:


     201/Rev1.00                                              6-20



                                   Управление записями Btrieve
-------------------------------------------------ДД


     * Файл должен быть открыт.

     * Файл должен быть только типа файла данных без индексов.

ПРОЦЕДУРА:

Необходимо задать следующие параметры:

     * Код операции 5.

     * Передать блок позиции.

     * Задать значение ключа в буфере ключа.

     * Установите номер ключа в соответствии с путем доступа.

     * Установите длину буфера данных в соответствии со значением
       равным длине искомой записи.

РЕЗУЛЬТАТ:

В случае успеха Btrieve:

     * Возвратит требуемую запись в буфер данных.

     * Возвратит длину записи в байтах в параметре длины буфера
       данных.

В случае неуспеха Btrieve возвратит ненулевое состояние, которое
указывает причину. Чаще всего встречаются следующие коды:

     * 3 файл не открыт.

     * 4 не найдено значение ключа.

     * 22 буфер данных слишком мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

После операции Btrieve стирает любую существующую информацию о
позиционировании и в индексе устанавливает позицию:

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

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


GET FIRST (12)
-------------------------------------------------



     201/Rev1.00                                              6-21



Управление записями Btrieve
-------------------------------------------------ДД

НАЗНАЧЕНИЕ:

Эта операция ищет запись, соответствующую значению первого ключа
для определенного пути доступа.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

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

ТРЕБОВАНИЯ:

Должны быть выполнены следующие условия:

     * Файл должен быть открыт.

     * Файл не может быть типа данных с индексами.

ПРОЦЕДУРА:

Необходимо задать следующие параметры:

     * Код операции 12.

     * Передать блок позиций.

     * Указать номер ключа для пути доступа.

     * Определить длину буфера данных

РЕЗУЛЬТАТ:

В случае успеха Btrieve:

     * Возвратит требуемую запись в буфер данных.

     * Запишет соответствующее значение ключа в буфер ключа.

     * Возвратит длину записи в параметре длины буфера данных.

В случае неуспеха, Btrieve возвратит ненулевое состояние, которое
указывает причину. Чаще всего встречаются следующие коды:

     * 3 файл не открыт.

     * 6 неверный номер ключа.

     * 22 Буфер данных слишком мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

После операции Btrieve сотрет любую существующую информацию о
позиционировании и установит позицию в индексе:

     * Предыдущая запись помечается как "перед началом файла".



     201/Rev1.00                                              6-22



                                   Управление записями Btrieve
-------------------------------------------------ДД

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


GET GREATER (8)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Эта операция ищет запись по ключу, значение которого больше, чем
специфицированное значение.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

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

ТРЕБОВАНИЯ:

Следующие требования должны быть выполнены:

     * Файл должен быть открыт.

     * Файл не может быть файлом "только данные".

ПРОЦЕДУРА:

Установите следующие параметры:

     * Код операции 8.

     * Передайте блок позиционирования.

     * Поместите значение ключа в параметр буфер ключа.

     * Установите параметр номер ключа в соответствии с путем
       доступа.

     * Установите длину буфера данных.

РЕЗУЛЬТАТ:

Если операция окончилась успешно:

     * Возвращает запись в буфере данных.

     * Возвращает длину записи в параметре длины буфера данных.

Если операция неуспешна, Btrieve возвращает ненулевое состояние.
Чаще других встречаются следующие:

     * 3 Файл не открыт.



     201/Rev1.00                                              6-23



Управление записями Btrieve
-------------------------------------------------ДД

     * 6 Неверный номер ключа.

     * 22 Буфер данных очень мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

После выполнения операции, Btrieve уничтожает всю информацию о
позиционировании и устанавливает позицию в индексе следующим
образом:

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

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


GET GREATER OR EQUAL (9)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Данная операция ищет запись со значеним ключа больше, чем равной
специфицированному значению.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

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

ТРЕБОВАНИЯ:

Следующие условия должны быть выполнены:

     * Файл должен быть открыт.

     * Файл не может быть файлом типа "только данные".

ПРОЦЕДУРА:

Установить параметры следующим образом:

     * Код операции 9.

     * Передайте блок позиций для файла.

     * Поместите заданное значение ключа в параметр буфера ключа.




     201/Rev1.00                                              6-24



                                   Управление записями Btrieve
-------------------------------------------------ДД

     * Установите параметр номера ключа в соответствии с путем
       доступа.

     * Специфицируйте длину буфера данных.

РЕЗУЛЬТАТ:

Если Btrieve найдет запись, удовлетворяющую данную операцию, то:

     * Запись поместится в буфер данных.

     * Возвратит длину записи в параметре длина буфера.

Если Btrieve не возвратит запись, она возвратит ненулевое
состояние. Чаще всего бывают следующие коды:

     * 3 Файл не открыт.

     * 6 Неверный номер ключа.

     * 22 Буфер данных мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

После выполнения операции Btrieve удаляет всю существующую
информацию о позиционировании и устанавливает текущую позицию
следующим образом:

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

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

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


GET KEY (+50)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Данная операция позволяет Вам выполнить операцию GЕТбез поиска
записи данных. Вы можете использовать операцию для определения
есть или нет значение в файле. Эта операция выполняется быстрее,
чем соответствующая ей операция, "Get". Операция "Get Key" может
использоваться совместно со следующими GET операциями:

     * GET EQUAL (5)

     * GET NEXT (6)

     * GET PREVIOUS (7)



     201/Rev1.00                                              6-25



Управление записями Btrieve
-------------------------------------------------ДД

     * GET GREATER (8)

     * GET GREATER OR EQAL (9)

     * GET LESS THAN (10)

     * GET LESS THAN OR EQUAL (11)

     * GET FIRST (12)

     * GET LAST (13)

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

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

ТРЕБОВАНИЯ:

Требования теже самые, что и для операции "GET".

ПРОЦЕДУРА:

Для выполнения операции "GET KEY", установить параметры также,
как в операции GET. Вам нет необходимости инициализировать длину
буфера данных.

Вы должны добавить 50 к коду соответствующей GET операции,
которую необходимо выполнить. Например, для выполнения операции
GET KEY (код 50) вместе с операцией GET EQUAL (код операции 5)
используйте код операции 55.

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

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция "GET KEY" устанавливает текущее позиционирование в
соответствии с GET операцией, только Get Next Key и Get Previous
Key не возвращают дубликатов.


GET LAST (13)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция осуществляет поиск последнего значения ключа по
специфицируемому пути доступа.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:





     201/Rev1.00                                              6-26



                                   Управление записями Btrieve
-------------------------------------------------ДД

Используя операцию "GET LAST" Ваша программа может осуществлять
поиск записи соответствующему последнему значению ключа для
выбранного номера ключа. Если есть дубликат для последненго
значения ключа, возвратится последний дубликат.

ТРЕБОВАНИЯ:

Следующие требования должны быть выполнены:

     * Файл должен быть открыт.

     * Файл не должен быть типа "только данные" без индексов.

ПРОЦЕДУРА:

Установить параметры Btrieve следующим образом:

     * Код операции 13.

     * Передайте блок позиций.

     * Задайте длину буфера данных.

     * Задайте номер ключа для пути доступа.

РЕЗУЛЬТАТ:

Если операция закончена успешно то Btrieve:

     * Вернет требуемую запись в буфере данных.

     * Поместит значение ключа в буфер ключа.

     * Вернет длину записи в параметре длины буфера.

Если Btrieve не может вернуть запись, он вернет ненулевое
состояние. Чаще всего встречаются следующие коды:

     * 3 Файл не открыт.

     * 6 Неверный код ключа.

     * 22 Буфер данных мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

После операции Btrieve разрушают существующую информацию
позиционирования и устанавливает позицию в индексе следующим
образом:

     * Следующая запись помечается как за концом файла.

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




     201/Rev1.00                                              6-27



Управление записями Btrieve
-------------------------------------------------ДД

GET LESS THAN (10)
-------------------------------------------------

НАЗНАЧЕНИЕ:

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

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

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

ТРЕБОВАНИЯ:

Следующие требования должны быть выполнены:

     * Файл должен быть открыт.

     * Файл не может быть типа "только данные" и без индексов.

ПРОЦЕДУРА:

Для выполнения операции установите параметры следующим образом:

     * Код операции 10.

     * Передать блок позиций.

     * Запишите нужное значение ключа в параметр буфера ключа.

     * Установите параметр номера ключа на желаемый путь доступа.

     * Определите длину буфера данных.

РЕЗУЛЬТАТ:

Если операция закончена успешно то Btrieve:

     * Вернет требуемую запись в буфере данных.

     * Поместит значение ключа в буфер ключа.

     * Вернет длину записи в параметре длины буфера.

Если Btrieve не может вернуть запись, он вернет ненулевое
состояние. Чаще всего встречаются следующие коды:

     * 3 Файл не открыт.

     * 6 Неверный код ключа.



     201/Rev1.00                                              6-28



                                   Управление записями Btrieve
-------------------------------------------------ДД

     * 22 Буфер данных мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

После операции "GET LESS THAN" Btrieve стирает любую текущую
информацию о позиционировании и устанавливает позиции в индексе:

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

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


GET LESS THAN OR EQUAL (11)
-------------------------------------------------

НАЗНАЧЕНИЕ:

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

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

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

ТРЕБОВАНИЯ:

Следующие требования должны быть выполнены:

     * Файл должен быть открыт.

     * Файл не может быть типа "только данные" и без индексов.

ПРОЦЕДУРА:

Для выполнения данной операции установите следующие параметры
Btrieve:

     * Код операции 11.

     * Передайте блок позиции.

     * Запишите желаемое значение ключа в параметр буфера ключа.


     201/Rev1.00                                              6-29



Управление записями Btrieve
-------------------------------------------------ДД


     * Задайте параметр номера ключа желаемому пути доступа.

     * Определите длину буфера данных.

РЕЗУЛЬТАТ:

Если операция закончена успешно то Btrieve:

     * Вернет требуемую запись в буфере данных.

     * Поместит значение ключа в буфер ключа.

     * Вернет длину записи в параметре длины буфера.

Если Btrieve не может вернуть запись, он вернет ненулевое
состояние. Чаще всего встречаются следующие коды:

     * 3 Файл не открыт.

     * 6 Неверный код ключа.

     * 22 Буфер данных мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

После выполения операции Btrieve стирает любую информацию о
позиционировании и устанавливает текущую позицию:

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

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


GET NEXT (6)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция ищет запись из файла Btrieve, которая следует за текущей
записью на пути ключа.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

С помощью операции Ваша программа может найти записи в порядке,
существующем заданному пути доступа. Только операции "Get First",
"Get Next", "Get Previous" и "Get Last" позволят программе найти
запись для двойных значений ключа.



     201/Rev1.00                                              6-30



                                   Управление записями Btrieve
-------------------------------------------------ДД

ТРЕБОВАНИЯ:

Следующие требования должны быть выполнены:

     * Файл должен быть открыт.

     * Файл не может быть типа "только данные" и без индексов.

     * Непосредственно перед выполнением операции "Get Next" на
       вызов Btrieve Ваша программа должна установить позицию в
       индексе.

ПРОЦЕДУРА:

Чтобы выполнить операцию "Get Next", необходимо задать следующие
параметры:

     * Код операции 6.

     * Передать код операции.

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

     * Задать параметр номера ключа в соответствии с путем
       доступа, использованным в предыдущем вызове. Пользуясь
       операцией Get Next, Вы не можете менять пути доступа.

РЕЗУЛЬТАТ:

Если операция закончена успешно то Btrieve:

     * Вернет требуемую запись в буфере данных.

     * Поместит значение ключа в буфер ключа.

     * Вернет длину записи в параметре длины буфера.

Если Btrieve не может вернуть запись, он вернет ненулевое
состояние. Чаще всего встречаются следующие коды:

     * 3 Файл не открыт.

     * 6 Неверный код ключа.

     * 7 Другой номер ключа.

     * 9 Конец файла.

     * 22 Буфер данных мал.

     * 82 Потерянная позиция.

ТЕКУЩАЯ ПОЗИЦИЯ:



     201/Rev1.00                                              6-31



Управление записями Btrieve
-------------------------------------------------ДД

Для выполнения операции "Get Next" Btrieve использует
позиционирование, установленное предыдущим вызовом, корректируя
позиционирование следующим образом:

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

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


GET POSITION (22)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Данная операция возвращает физическую позицию текущей записи.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

С помощью данной операции Ваша программа может получить 4-
байтовую позицию текущей записи в файле Btrieve. Для установления
текущей записи Ваша программа может выполнить любую другую
операцию типа "GET" ("IInsert" или "Update"). Чтобы найти затем
адрес записи, Ваша программа узнает адрес записи, она может
использовать операцию "Get Direct" для поиска записи по ее
физическому положению в файле.

Для обработки требования "Get Position" Btrieve не выполняет
операции ввода/вывода.

ТРЕБОВАНИЯ:

Следующие требования должны быть выполнены:

     * Файл должен быть открыт.

     * Если Btrieve вызывает файл непосредственно перед вызовом
       операции "Get Position", запись должна быть найдена. В
       перерыве между поиском записи и вызовом операции "Get
       Position" Вы не можете выполнить вызов, используя тотже
       самый блок позиции.

ПРОЦЕДУРА:

Необходимо задать следующие параметры:

     * Код операции 22.

     * Передать блок позиции.



     201/Rev1.00                                              6-32



                                   Управление записями Btrieve
-------------------------------------------------ДД

     * Указать буфер данных, длина которого достаточна для записи
       4-байтовой позиции.

     * Установить длину буфера данных по меньшей мере на четыре
       байта.

РЕЗУЛЬТАТ:

Если операция закончена успешно то Btrieve:

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

     * Установит длину буфера данных в 4 байтах.

Если Btrieve не может вернуть запись, он вернет ненулевое
состояние. Чаще всего встречается ненулевое состояние, которое
Btrieve возвращает как код состояния 8 (неверное
позиционирование).

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция не влияет на позиционирование.


GET PREVIOUS (7)
-------------------------------------------------

НАЗНАЧЕНИЕ:

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

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Используя данную операцию, Ваша программа может отыскивать зписи
в последовательности, соответствующей данному пути доступа.
Только операции Get First, Get Next, Get Previous, Get Last
позволяют программе отыскивать записи для двоичных значений
ключа.

ТРЕБОВАНИЯ:

Следующие требования должны быть выполнены:

     * Файл должен быть открыт.

     * Если Btrieve обращается к файлу непосредственно перед
       операцией Get Previous, то запись должна быть найдена. Во
       время между поисками записи и вызовом операции Get
       Previous Dы не можете обращаться к Btrieve с помощью
       одного и того же юлока позиций.

ПРОЦЕДУРА:



     201/Rev1.00                                              6-33



Управление записями Btrieve
-------------------------------------------------ДД

Необходимо задать следующие параметры:

     * Код операции 7.

     * Передать блок позиций.

     * Определить правильный номер ключа.

     * Определить длину буфера данных.

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

РЕЗУЛЬТАТ:

Если операция закончена успешно то Btrieve:

     * Изменит буфер ключа в соответствии со значением ключа
       новой записи.

     * Возвратит предыдущую запись в буфере данных.

     * Вернет длину записи в параметре длины буфера данных.

Если Btrieve не может вернуть запись, он вернет ненулевое
состояние. Чаще всего встречаются следующие коды:

     * 3 Файл не открыт.

     * 9 Конец файла.

     * 22 Буфер данных мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

Для выполнения данной операции Btrieve использует
позиционирование, установленное предыдущим вызовом:

     * Запись, которая была текущей записью при вызове операции,
       становится следующей.

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


INSERT (2)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция вставляет запись в файл.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:



     201/Rev1.00                                              6-34



                                   Управление записями Btrieve
-------------------------------------------------ДД

ОПИСАНИЕ ПАРАМЕТРОВ:

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

ТРЕБОВАНИЯ:

Следующие требования должны быть выполнены:

     * Файл должен быть открыт.

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

ПРОЦЕДУРА:

Необходимо создать следующие параметры:

     * Код операции 2.

     * Подготовить новую запись данных в буфере данных.

     * Определить длину буфера данных. Длина должна по меньшей
       мере совпадать с фиксированной длиной части записи.

     * Определить номер ключа, по которому Btrieve будет
       поддерживать позицию.

РЕЗУЛЬТАТ:

Если операция закончена успешно то Btrieve:

     * Помести новую запись в файл.

     * Возвратит значение ключа для текущего пути доступа.

     * Вернет значение ключа для текущего пути доступа.

В случае неуспеха Btrieve вернет ненулевое состояние. Чаще всего
встречаются следующие коды:

     * 2 Ошибка ввода/вывода.

     * 3 Файл не открыт.

     * 5 Ошибка дубликатов.

     * 14 Ошибка открытия "Pre-Image".

     * 15 Ошибка ввода/вывода "Pre-Image".

     * 18 Диск заполнен.

     * 21 Буфер ключа мал.

     * 22 Буфер данных мал.


     201/Rev1.00                                              6-35



Управление записями Btrieve
-------------------------------------------------ДД


ТЕКУЩАЯ ПОЗИЦИЯ:

Операция стирает информацию о текущем позиционировании. На основе
заданного номера ключа Btrieve устанавливает позицию в индексе
следующим образом:

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

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


LOCKS
-------------------------------------------------

НАЗНАЧЕНИЕ:

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

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

За исключением кода операции параметры для операции блокировки
совпадают с параметрами для соответствующих операций.

ОПИСАНИЕ:

В Btrieve размечаются для вида блокировки: единичные блокировки и
множественные блокировки. Для любого типа Вы модете определить
дополнительный тип "Wait" или "Nowait".

Вы можете определить блокировку с любой операции "Get, Step,
Open" или "Begin Transactoin". Для того чтобы определить тип
транзакции (Wait или Nowait) Вы добавляете к операции "начать
транзакцию" смещение LOCK. Это не побуждает Btrievе использовать
блокировку записей во время транзакций.

ЕДИНИЧНАЯ БЛОКИРОВКА:

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

МНОЖЕСТВЕННАЯ БЛОКИРОВКА:

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



     201/Rev1.00                                              6-36



                                   Управление записями Btrieve
-------------------------------------------------ДД

заблокированную запись или используете другую операцию GET. С
помощью операции Unlock Ваша программа может освободить одну
запись или все их множество.

БЛОКИРОВКА ТИПА WAIT:

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

БЛОКИРОВКА ТИП "NOWAIT":

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

ТРЕБОВАНИЯ:

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

ПРОЦЕДУРА:

Для определения блокировки Ваша программа добавляет значение
(называемое смещением блокировки) к коду любой операции Get,
Step, Open или Begin Transaction. В таблице приведены значения
смещений блокировки.

     Значение Тип блокировки

     +100 Единичная блокировка типа Wait
     +200 Единичная блокировка типа Nowait
     +300 Множественная блокировка типа Wait
     +400 Множественная блокировка типа Nowait

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

     * Определить единичную блокировку 100 (Wait) или 200
       (Nowait) к коду операции.

     * Определить множественную блокировку 300 (Wait) или 400
       (Nowait) к коду операции.

Например, используя операцию GET EQUAL с единичной блокировкой
типа Wait код операции будет (100+5) или 105. Для выполнения той
же операции с множественной блокировкой типа Wait код операции
будет (300+5) или 305. При выполнении операции GEТ LAST с
единичной блокировкой типа Nowait код операции будет (13+200) или
213. При той же самой операции с множественной блокировкой типа
Nowait код операции будет (13+400) или 413.

Для определения транзакции типа Wait задайте код операции 119 или
319. В этом случае код блокировки означает, что Вы хотите, чтобы
Btrieve подождал, если появится файл или запись, которые были


     201/Rev1.00                                              6-37



Управление записями Btrieve
-------------------------------------------------ДД

заблокированы другой рабочей станцией. Задание кода 319 для
операции Begin Trans эквивалентно кодам 19 и 119. Для более
детальной информации см. описание управления транзакцией глава 2.

Также Вы можете использовать запрос "Begin Trans" типа "Nowait" с
операционным кодом 219 или 419. В этом случае, если Ваша
программа попытается получить доступ к заблокированной или файлу
во время транзакции, Btrieve возвратит состояние 84 или 85.
Подробнее смотрите главу 2.

ОТКРЫТИЕ БЛОКИРОВАННЫХ ЗАПИСЕЙ:

Когда рабочая станция пытается открыть заблокированный файл
Btrieve обычно ждет появления файла и затем приступает к
выполнению операции OPEN. Это эквивалентно блокировке типа
"Wait".

С помощью кодов 200 или 400 в качестве кодов операций для
операции OPEN (0+200 или 0+400) Вы можете определить вызов OPEN
типа "Wait". Есдли файл, который Вы пытаетесь открыть,
заблокирован Btrieve возвратит код состояния 85 (файл в
использовании). Вы можете повторять операцию до тех пор, пока
файл доступен.

ОСВОБОЖДЕНИЕ БЛОКИРОВКИ МНОЖЕСТВА ЗАПИСЕЙ:

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

     * Снимите блокировку с помощью операции UNLOCK (27).

     * Удалите запись.

     * Используете операцию RESET (28).

     * Закрыть файл.

     * Обратиться к файлу во время транзакции.

РЕЗУЛЬТАТ:

Вы можете использовать как единичную, так и множественную
блокировку в одном и том же файле для одной рабочей станции. Если
включена единичная блокировка (+100+200) и выдается запрос на
множественную блокировку (+300+400) Btrievе возвратит ошибку о
несовместимости блокировок. Обратная ситуация вызовет ту же
ошибку. В любом случае Btrieve не заблокирует запись. Но это не
означает, что рабочая станция ограничена одним типом блокировки в
конкретном файле. В тех случаях, когда рабочая станция пытается
блокировать другой тип Btrieve возвратит ошибку, если включен
один из типов блокировки.

Когда Ваша программа пытается заблокировать больше записей, чем
Вы определили при конфигурации BSERVER, Btrieve возвратит
состояние ошибки блокировки. Подробнее смотрите главу 3. Чаще
всего встречаются следующие ненулевые коды состояния:


     201/Rev1.00                                              6-38



                                   Управление записями Btrieve
-------------------------------------------------ДД


     * 81 Ошибка блокировки.

     * 84 Запись используется.

     * 85 Файл используется.

     * 93 Несовместимый тип блокировки.

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция не влияет на позицию Btrieve в индексе.


OPEN (0)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция разрешает доступ к файлу.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Ваша программа не может получить доступ к файлу Btrieve до тех
пор пока не будет выполнена операция OPEN. Пока Вы не определите
полное имя пути, файла не будет в текущей директории.

ТРЕБОВАНИЯ:

Следующие требования должны быть выполнены:

     * Предназначенный для открытия файл должен находиться на
       доступном накопителе. Если у файла есть расширения, то оба
       накопителя должны быть доступны.

     * "File Handle" должен быть доступен для файла.

ПРОЦЕДУРА:

Необходимо задать следующие параметры:

     * Код операции 0.

     * Поместить имя открываемого файла в параметре буфера ключа.

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

     * Если у файла есть "владелец", задайте имя "владельца",
       ограничив его двоичными нулями в буфере данных.

     * Задайте имя "владельца", включая двоичный ноль в параметре
       длины буфера данных.




     201/Rev1.00                                              6-39



Управление записями Btrieve
-------------------------------------------------ДД

     * Определите один из следующих режимов спецификаций в
       параметре номера ключа:

Режим Описание

-1    Ускоренный

     В ускоренном режиме Ваша программа может запретить Btrieve
     автоматически восстанавливать данные для ускорения
     выполнения операцй модификации. Для подробного описания
     см.стр.2-25. В ускоренном режиме Btrieve блокирует буфер в
     кэш-памяти для    каждого открытого файла. Количество
     файлов, которые Вы можете открыть одновременно в ускоренном
     режиме зависит от памяти и опции размера страниц, которые Вы
     определяете при загрузке Btrieve.

-2 Только чтение

     Данный режим позволяет программе открыть поврежденный файл,
     который Btrieve не может воссановить автоматически. При
     открытии файла в режиме "только чтение" программа может
     только читать файл, но не изменять его. Если повреждены
     индексы, файла в данном режиме открывая файл и используя
     операцию Step Next можно найти записи.

-3 Verifу

     Режим Verify применяется только для файлов, которые
     расположены на локальных дисках DOS. Если Ваша программа
     открывает файл в режиме Verify Btrievе разрешает
     использовать опцию Verify DOS во время каждой операции.
     После каждой записи на диске операционная система вновь
     прочитывает данные для того, чтобы убедиться в правильности
     записи. Хотя ошибки записи встречаются очень редко Btrieve
     снабжен данной функцией для случаев работы с особо ценными
     данными.

-4 Exclusivе

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

Для доступа к Btrieve из BASIC необходимо выполнить два шага.
Сначала Ваша программа должна выполнить операцию OPEN в BASIС для
устройства NUL, такой чтобы можно было использовать оператор
FIELD для буфера данных файла (см.стр.5-5 подробной информации).
Во вторых программа должна выполнить операцию Btrieve OPEN.
Другие языки не требуют первой ступени.







     201/Rev1.00                                              6-40



                                   Управление записями Btrieve
-------------------------------------------------ДД

Btrieve позволяет открыть до 256 файлов для программ, написанных
на языках: компилятор BASIC, PASCAL, COBOL или C. В случае, когда
одновременно открывается несколько файлов Btrieve использует блок
текущей позиции, чтобы определить к которому файлу обратиться по
вызову.

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ПРИМЕЧАНИЕ:

     Хотя Btrieve позволяет программе открывать до 256 файлов,
     интерпритатор BASIC и некоторые компиляторы BASIC позволяют
     открыть максимум до 15 файлов. Для работы с числом
     файловбольше трех при инициализации интерпритптора BASIC,
     требуется определить параметр файлов. Если из BASIC Вы
     открываете несколько файлов, Btrieve использует FCB для
     определения файла, к которому обращаются по данному вызову.
     Подробнее смотри документацию по интерпритатору BASIC.

     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

РЕЗУЛЬТАТ:

Если операция закончена успешно то Btrieve:

     * Назначает "File Handle" для файла.

     * Сохраняет блок позиций, переданный для вновь открытого
       файла по вызову OPEN.

     * Разрешает доступ к файлу.

В случае неуспеха Btrieve вернет код ненулевого состояния. Чаще
всего встречаются следующие коды:

     * 2 Ошибка ввода/вывода.

     * 46 Доступ к запрещенному файлу.

     * 85 Файл используется.

     * 86 Таблица файла заполнена.

     * 87 Таблица "File Handle" заполнена.

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция OPEN не устанавливает никакой информации о
позиционировании.


RESET (28)
-------------------------------------------------

НАЗНАЧЕНИЕ:





     201/Rev1.00                                              6-41



Управление записями Btrieve
-------------------------------------------------ДД

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

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

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

ТРЕБОВАНИЯ:

Ваша программа может использовать операцию RESET в любое время
после загрузки "Record Manager".

ПРОЦЕДУРА:

Необходимо задать следующие параметры:

     * Код операции 28.

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

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

РЕЗУЛЬТАТ:

Если операция закончена успешно:

     * Закрываются все файлы данной рабочей станции.

     * Освобождаются все блокировки данной рабочей станции.

     * Заканчиваются все активные транзакции данной рабочей
       станции.

В случае неуспеха Btrieve возврати ненулевой код возврата.

ТЕКУЩАЯ ПОЗИЦИЯ:

Эта операция уничтожает всю информацию о позиционировании, т.к.
закрывает все открытые файлы.


SET DIRECTORY (17)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Данная операция устанавливает текущую директорию в соответствии
со специфицированным значением.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:


     201/Rev1.00                                              6-42



                                   Управление записями Btrieve
-------------------------------------------------ДД


ОПИСАНИЕ ПАРАМЕТРОВ:

Данная оперция меняет текущую директорию на директорию,
определенную в параметре буфера ключа.

ТРЕБОВАНИЯ:

Директория и накопители должны быть доступны.

ПРОЦЕДУРА:

Должны быть заданы следующие параметры:

     * Код операции 17.

     * Записать требуемый накопитель и путь директории,
       ограниченные двоичным нулем в буфере ключа. Если Вы
       пропустите имя накопителя, Btrieve использует накопитель
       по умолчанию. Если Вы не определяете полный путь для
       директории Btrieve добавляет путь директории, определенный
       для директории в буфере ключа.

РЕЗУЛЬТАТ:

В случае успеха Btrieve назначит директорию, определенную в
буфере ключа текущей.

В случае неуспеха Btrieve не изменит текщую директорию и вернет
ненулевое состояние.

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция не влияет на позиционирование.


SET OWNER (29)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция назначает имя владельца файла.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

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







     201/Rev1.00                                              6-43



Управление записями Btrieve
-------------------------------------------------ДД

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

ТРЕБОВАНИЯ:

Следующие требования должны быть выполнены:

     * Файл должен быть открыт.

     * Не должно быть активных транзакций.

     * Имя хозяина не должно быть уже назначенным.

ПРОЦЕДУРА:

Следующие параметры должны быть установлены:

     * Код операции 29.

     * Передать блок позиций файла, который определяет файл.

     * Поместить имя владельца в буфер данных и буфер ключа и
       передать длину буфера данных, Btrieve требует имена в
       обоих буферах для исключения ошибки при спецификации
       имени. Имя владельца должно быть дополнено до 8 символов и
       оканчиваться двоичным нулем.

     * Установите параметр номера ключа как целое. Это значение
       специфицирует тип доступа, определяемый для файла, и
       должны ли быть зашифрованы данные. Ниже приведены
       допустимые значения номера ключа.

Режим Описание

0    Требуется имя владельца для любого типа доступа (данные не
     шифровать).

1    Допускается доступ "только чтение" без имени владельца
     (данные не шифровать).

2    Требуется имя владельца при любом типе доступа (данные
     шифровать).

3    Допускается доступ "только чтение" без имени владельца
     (данные шифровать).

РЕЗУЛЬТАТ:

в случаи успеха Btrieve:

     * Без определения имени владельца не разрешит доступ к
       файлу.





     201/Rev1.00                                              6-44



                                   Управление записями Btrieve
-------------------------------------------------ДД

     * Зашифрует данные в файле, если шифрование определено. Как
       только программа задала имя владельца, имя сохраняется до
       тех пор, пока программа выполняет операцию Clear Owner.

В случае неуспеха Btrieve вернет ненулевое состояние. Чаще всего
встречаются следующие коды:

     * 41 Операция не разрешена.

     * 50 Имя владельца уже присвоено.

     * 51 Неверное имя владельца.

ТЕКУЩАЯ ПОЗИЦИЯ:

Не влияет на позиционирование.


STAT (15)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция ведет поиск характеристик для определенного файла.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

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

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

Флаги файла устанавливаются как показано ниже:

     * Если bit0 = 1, допускается переменная длина записи в
       файле.

     * Если bit1 = 1, Btrieve усекает пробелы в конце записей
       переменной длины.

     * Если bit2 = 1, Вtriеvепредварительно распределяет страницы
       для файла.

     * Если bit3 = 1, Btrieve сжимает данные в файле. . Если bit4
       = 1, Btrieve создает файл как файл "только с ключом".



     201/Rev1.00                                              6-45



Управление записями Btrieve
-------------------------------------------------ДД

     * Если bit6 = 1, Btrieve поддерживает свободное пространство
       в 10% от всего.

     * Если bit7 = 1, Btrieve поддерживает свободное пространство
       в 20% от всего.

     * Если bit6 = 1 и bit7 = 1, Btrieve поддерживает свободное
       пространство в 30% от всего.

Спецификации ключа следуют непосредственно за спецификациями
файла и повторяются для каждого ключевого сегмента в файле.
Btrieve устанавливает флаги ключа следующим образом:

     * Если bit0 = 1, допускается дубликат ключа.

     * Если bit1 = 1, ключ модифицируемый.

     * Если bit2 = 0 и bit8 = 0, ключ-строка.

     * Если bit2 = 1 и bit8 = 0, ключ двоичный.

     * Если bit3 = 1, ключ имеет нулевое значение.

     * Если bit4 = 1, ключ имеет другой сегмент.

     * Если bit5 = 0, ключ отсортированный с помощью
       альтернативной последовательности.

     * Если bit6 = 1, ключ отсортирован по нисходящей.

     * Если bit7 = 1, ключ является дополнительным индексом.

     * Если bit8 = 1, ключ расширенного типа.

     * Если bit9 = 1, ключ "ручной".

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

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

     Описание                   Длина
     --------------------------------
     : длина записи             : 2 :
     : размер страницы          : 2 :
     : число индексов           : 2 :  Спецификация
     : число записей            : 4 :      файла
     : флаги файла              : 2 :
     : зарезервированное слово  : 2 :
     : неиспользованные страницы: 2 :
     --------------------------------

     Описание                  Длина
     --------------------------------


     201/Rev1.00                                              6-46



                                   Управление записями Btrieve
-------------------------------------------------ДД

     : позиция ключа            : 2 :
     : длина ключа              : 2 :
     : флаги ключа              : 2 :  Спецификация
     : число ключей             : 4 :      ключа
     : ключ расширения типа     : 1 :
     : пустое значение          : 1 :
     : зарезервировано          : 4 :
     --------------------------------

     Табл.6.3. Структура буфера данных для Stat Operation

ТРЕБОВАНИЯ:

Перед выполнением операции Ваша программа должна открыть файл.

ПРОЦЕДУРА:

Установить параметры следующим образом:

     * Код операции 15.

     * Передайте блок позиций.

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

     * Специфицируйте длину буфера данных.

     * Пометьте буфер ключа, меньше 64 символов.

РЕЗУЛЬТАТ:

В случае успеха:

     * Характеристика файла и ключей возвратится в буфере данных.

     * Поместит имя файла расширения, ограниченные двоичным нулем
       в буфер ключа, если файл расширен. Другими словами Btrieve
       инициализирует буфер ключа в ноль.

В случае неуспеха Btrieve вернет ненулевой код состояния:

     * 3 Файл не открыт.

     * 22 Буфер данных мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция не влияет на позиционирование.


STEP FIRST (33)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция ищет запись с физическим первым положением в файле.


     201/Rev1.00                                              6-47



Управление записями Btrieve
-------------------------------------------------ДД


ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

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

ТРЕБОВАНИЯ:

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

ПРОЦЕДУРА:

Для выполнения операции установите параметры следующим образом:

     * Код операции 33.

     * Передайте блок позиций.

     * Поместите буфер данных, в котором будет возвращена запись.

     * Установите параметр длины буфера данных в соответствии с
       длиной буфера.

РЕЗУЛЬТАТ:

В случае успеха, Btrieve:

     * Вернет первую физическую запись в буфере данных Вашей
       программы.

     * Установит параметр длины буфера в соответствии с числом
       байтов, возвращенных в буфере данных.

В случае неуспеха Btrieve вернет ненулевое состояние:

     * 3 Файл не открыт.

     * 9 Конец файла.

     * 22 Буфер данных мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

Данная операция не устанавливает позиционирование в индексе.


STEP LAST (34)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция производит поиск записи физически последней в файле.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:



     201/Rev1.00                                              6-48



                                   Управление записями Btrieve
-------------------------------------------------ДД

ОПИСАНИЕ ПАРАМЕТРОВ:

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

ТРЕБОВАНИЯ:

Перед тем как Ваша прикладная программа может выполнить операцию
Step Last, файл должен быть открыт.

ПРОЦЕДУРА:

Установите параметры следующим образом:

     * Код операции 34.

     * Передайте блок позиций.

     * Пометьте буфер данных, в который поместится возвращаемая
       запись.

     * Установите параметр длины буфера в соответствии с длиной
       буфера данных.

РЕЗУЛЬТАТ:

Если операция закончена успешно то Btrieve:

     * Вернет искомую запись в буфере данных Вашей программы.

     * Установит параметр длины буфера данных в соответствии с
       числом возвращенных данных в буфере данных.

В случае неуспеха, Btrieve вернет ненулевой код состояния:

     * 3 Файл не открыт.

     * 9 Конец файла.

     * 22 Буфер данных мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция не устанавливает позиционирование в индексе.


STEP LAST (34)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция производит поиск записи физически последней в файле.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:



     201/Rev1.00                                              6-49



Управление записями Btrieve
-------------------------------------------------ДД

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

ТРЕБОВАНИЯ:

Перед тем как Ваша прикладная программа может выполнить операцию
Step Last, файл должен быть открыт.

ПРОЦЕДУРА:

Установите параметры следующим образом:

     * Код операции 34.

     * Передайте блок позиций.

     * Пометьте буфер данных, в который поместится возвращаемая
       запись.

     * Установите параметр длины буфера в соответствии с длиной
       буфера данных.

РЕЗУЛЬТАТ:

Если операция закончена успешно то Btrieve:

     * Вернет искомую запись в буфере данных Вашей программы.

     * Установит параметр длины буфера данных в соответствии с
       числом возвращенных данных в буфере данных.

В случае неуспеха, Btrieve вернет ненулевой код состояния:

     * 3 Файл не открыт.

     * 9 Конец файла.

     * 22 Буфер данных мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция не устанавливает позиционирование в индексе.


STEP NEXT (24)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Данная операция осуществляет запись физически следующей за
текущей записью.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:




     201/Rev1.00                                              6-50



                                   Управление записями Btrieve
-------------------------------------------------ДД

Операция позволяет программе осуществлять поиск записи в порядке
физического расположения. Btrieve не использует индексный путь
для поиска записи для опериции Step Next. Операция используется
непосредственно после операции Open и возвращает первую запись в
файле. Операция также используется непосредственно после Get или
Step операций и ищет запись, физически следующей за записью
найденной предыдущей операцией.

Ваша программа не сможет определить порядок, в котором записи
будут возвращаться операцией Step Next.

ТРЕБОВАНИЯ:

Файл должен быть открыт.

ПРОЦЕДУРА:

Установите параметры следующим образом:

     * Код операции 24.

     * Передайте блок позиций.

     * Пометьте буфер данных куда поместится возвращенная
       позиция.

     * Назначте длину буфера данных.

РЕЗУЛЬТАТ:

В случае успеха Btrieve:

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

     * Установит параметр длины буфера данных в соответствии с
       числом байтов возвращенных в буфере.

В случае неуспеха Btrieve вернет ненулевой статус. Чаще всего
встречаются следующие коды:

     * 3 Файл не открыт.

     * 9 Конец файла.

     * 22 Буфер данных мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

Данная операция не устанавливает позицию в индексе.


STEP PREVIOUS (35)
-------------------------------------------------

НАЗНАЧЕНИЕ:




     201/Rev1.00                                              6-51



Управление записями Btrieve
-------------------------------------------------ДД

Данная запись ищет запись физически предшествующую текущей
записи.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Операйия позволяет Авшей программе осуществлять поиск записи в
физицеском порядке. Btrieve не использует индекс пути для
выполнения операции. Данная операция, выполненная непосредственно
после Get или Step операции, возвращает запись, физически
предшествующую записи определенной в предыдущей операции.

ТРЕБОВАНИЯ:

Следующие требования должны быть выполнены:

     * Файл должен быть открыт.

     * Предыдущей операцией должна быть успешно выполненная
       операция Get или Step.

ПРОЦЕДУРА:

Установите параметры следующим образом:

     * Код операции 35.

     * Передайте блок позиций.

     * Пометьте буфер данных, куда поместить возвращенную запись.

     * Задайте длину буфера данных.

РЕЗУЛЬТАТ:

В случае успеха, Btrieve:

     * Вернет последнюю физическую запись в файле Вашей
       программы.

     * Установит параметр длины буфера данных в соответствии с
       числом возвращенных байт.

В случае неуспеха, Btrieve вернет ненулевое состояние. Чаще всего
встречаются следующие коды:

     * 3 Файл не открыт.

     * 9 Конец файла.

     * 22 Буфер данных мал.

ТЕКУЩАЯ ПОЗИЦИЯ:

Данная операция не устанавливает позиционирования в индексе.




     201/Rev1.00                                              6-52



                                   Управление записями Btrieve
-------------------------------------------------ДД

STOP (25)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Данная операция заканчивает программу BREQUEST и удаляет ее из
памяти рабочей станции.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Операция удаляет Btrieve requestor program (BREQUEST) из памяти
рабочей станции. Программы не смогут выполнить любые операции
Btrieve до рестарта BREQUEST.

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

ТРЕБОВАНИЯ:

BREQUEST должен быть загружен перед тем, как Ваша команда
выполнит операцию STEP.

ПРОЦЕДУРА:

Для выполнения операции Stop задайте код операции 25.

РЕЗУЛЬТАТ:

В случае успеха Btrieve:

     * Удалит BREQUEST из памяти станции.

     * Закроет все файлы, открытые на станции.

     * Пректатит все активные транзакции.

     * Сбросит все библиотеки.

В случае неуспеха Btrieve вернет ненулевое состояние. Наиболее
частый код 20 (BREQUEST не загружен).

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция не устанавливает позиционирование.


UNLOCK (27)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция разблокирует одну либо несколько записей, которые
предварительно блокированы.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:


     201/Rev1.00                                              6-53



Управление записями Btrieve
-------------------------------------------------ДД


Операция освобождает одну или более блокированные записи в файле,
заданным блоком позиций.

ТРЕБОВАНИЯ:

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

ПРОЦЕДУРА:

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

     * Код операции 27.

     * Передайте блок позиций.

     * Присвойте номеру ключа неотрицательное значение.

Для разблокировки множественного типа, сначала определите
4-байтовую позицию записи, которые Вы желаете разблокировать. Для
этого используйте операцию GET POSITION (22) для этой записи.
Затем используйте операцию UNLOCK, устанавливая параметры Btrieve
как показано:

     * Код операции 27.

     * Передайте блок позиций.

     * Поместите (в буфере данных) 4-байтовую позицию, которую
       вернет Btrieve.

     * Длину буфера данных установите в 4.

     * Инициализируйте параметр номера ключа -1.

Для разблокировки множественного типа установите параметры
следующим образом:

     * Код операции 27.

     * Передайте блок позиций.

     * Инициализируйте параметр номера ключа -2.

РЕЗУЛЬТАТ:

В случаи успеха Btrieve освободит все специфицированные
блокировки. в случае неуспеха Btrieve вернет ненулевое состояние.
Чаще всего встречается код 81 (ошибка блокировки).

ТЕКУЩАЯ ПОЗИЦИЯ:

Не влияет на позиционирование.


UPDATE (3)


     201/Rev1.00                                              6-54



                                   Управление записями Btrieve
-------------------------------------------------ДД

-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция изменяет существующие записи в файле Btrieve.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Операция изменяет информацию в существующей записи.

ТРЕБОВАНИЯ:

Следующие требования должны быть выполнены:

     * Файл должен быть открыт.

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

ПРОЦЕДУРА:

Установите параметры следующим образом:

     * Код операции 3.

     * Передайте блок позиций.

     * Поместите изменяемую запись в буфер данных.

     * Установите длину буфера данных в соответствии с длиной
       применяемой записи.

     * Поместите номер ключа для поиска в параметре номера ключа.

РЕЗУЛЬТАТ:

В случаи успеха Btrieve:

     * Измененная запись поместится в файл.

     * Индексы ключа изменятся в соответствии с изменениями в
       значении ключа.

     * Изменится параметр буфера ключа, если есть необходимость.

В случае неуспеха Btrieve вернет ненулевой код состояния. Чаще
всего встречаются следующие коды:

     * 5 Ошибка дубля ключа.

     * 7 Различные номера ключа ключа.

     * 8 Неверное позиционирование.



     201/Rev1.00                                              6-55



Управление записями Btrieve
-------------------------------------------------ДД

     * 10 Ошибка при модификации ключа.

     * 14 Ошибка открытия файла.

     * 15 Ошибка ввода/вывода.

     * 22 Буфер данных мал.

     * 80 Конфликт параметров.

ТЕКУЩАЯ ПОЗИЦИЯ:

Данная операция изменяет информацию о позиционировании только в
случае изменения значения ключа. Btrieve устанавливает позицию в
индексе в зависимости от специфицированного Вами номера ключа
следующим образом:

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

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


VERSION (26)
-------------------------------------------------

НАЗНАЧЕНИЕ:

Операция возвращает версию Btrieve и номер ревизии.

ИСПОЛЬЗОВАНИЕ ПАРАМЕТРОВ:

ОПИСАНИЕ ПАРАМЕТРОВ:

Эта операция возвращает версию Btrieve и номер ревизии.

ТРЕБОВАНИЯ:

Перед использованием данной операции должен быть загружен Btrieve
Record Manager.

ПРОЦЕДУРА:

Для выполнения операции установите параметры Btrieve следующим
образом:

     * Код операции 26.

     * Пометьте буфер данных, который не менее 5 байт.

     * Установите длину буфера данных 5.

РЕЗУЛЬТАТ:

В случае успеха Btrieve возвратит данные в буфере данных в
следующем формате:



     201/Rev1.00                                              6-56



                                   Управление записями Btrieve
-------------------------------------------------ДД

Режим Описание

2     Целое, содержит номер версии.
2     Целое, содержит номер ревизии.
1     Символьное, содержит "N" в случае Btrieve NetWare.

В случае неуспеха Btrieve вернет ненулевое состояние.

ТЕКУЩАЯ ПОЗИЦИЯ:

Операция не влияет на текущее позиционирование.

















































     201/Rev1.00                                              6-57


69
                                   Коды операций Btrieve
-------------------------------------------------ДД

Приложение А :
Коды команд BTRIEVE
-------------------------------------------------

     Код                 Команда

     0                   Open
     1                   Close
     2                   Insert
     3                   Update
     4                   Delete
     5                   Get Equal
     6                   Get Next
     7                   Get Previous
     8                   Get Greater
     9                   Get Greater or Equal
     10                  Get Less Than
     11                  Get Less Than or Equal
     12                  Get First
     13                  Get Last
     14                  Create
     15                  Stat
     16                  Extend
     17                  Set Directory
     18                  Get Directory
     19                  Begin Transaction
     20                  End Transaction
     21                  Abort Transaction
     22                  Get Position
     23                  Get Direct
     24                  Step Direct
     25                  Stop
     26                  Version
     27                  Unlock
     28                  Reset
     29                  Set Owner
     30                  Clear Owner
     31                  Create Supplemental Index
     32                  Drop Supplemental Index
     33                  Step First
     34                  Step Last
     35                  Step Previous


















     201/Rev1.00                                              C-1


69
                                   Коды состояний и сообщения
-------------------------------------------------ДД

Приложение В :
Коды возврата и сообщения.
-------------------------------------------------

Коды возврата Btrieve.

Btrieve Record Manager возвращает значение кода возврата после
каждой команды прикладной программы. Значение 0 указывает, что
команда завершена успешно. Возможны ненулевые коды возврата, они
описаны ниже.


01 INVALID OPERATION        (неправильная команда)

При вызове Btrieve задан неправильный параметр команды.


02 I/O ERROR                (ошибка ввода-вывода )

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


03 FILE NOT OPEN            (файл не открыт)

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


04 KEY VALUE NOT FOUND      (значение ключа не найдено)

Btrieve не находит требуемое значение ключа в заданном пути.


05 DUPLICATE KEY VALUE      (дубликат ключа)

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


06 INVALID KEY NUMBER        (неправильный номер ключа)

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









     201/Rev1.00                                              B-1



Управление записями Btrieve
-------------------------------------------------ДД

07 DIFFERENT KEY NUMBER     (измененный номер ключа)

Номер ключа изменен перед выполнением команд Get Next, Get
Previous, Update или  Delete. Данные команды требуют того же
самого ключа, что и предыдущие команды, так как Record Manager
использует информацию о позиционировании относительно предыдущего
номера ключа.

Если необходимо изменить номер ключа между командами Get Next и
Get Previous, сначала используйте  команду Get Direct для нового
позиционирования с помощью другого пути доступа.


08 INVALID POSITIONING     (неправильное позиционирование)

Делается попытка обновить или удалить запись  без
предварительного выполнения команды Get или Step для установления
текущей позиции. Этот код может встретиться, если прикладная
программа  записывает блок, расположенный вне файла.


09 END OF FILE              (конец файла)

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


10 MODIFIABLE KEY VALUE ERROR  (ошибка модификации ключа)

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


11 INVALID FILE NAME        (неправильное имя файла)

Имя файла не соответствует соглашению об именах файлов.


12 FILE NOT FOUND           (файл не найден)

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


13 EXTENDED FILE ERROR       (ошибка расширения файла)

Btrieve не может найти  расширение для разделенного файла,
который вы пытаетесь открыть. Расширение файла должно быть
загружено на заданный диск  во время создания  по команде EXTEND.
Чтобы иметь доступ к разделенному файлу, и первичный файл, и его
расширение должны быть загружены в разделенный файл.



     201/Rev1.00                                              B-2



                                   Коды состояний и сообщения
-------------------------------------------------ДД

14 PRE-IMAGE OPEN ERROR     (ошибка открытия файла сохраненного
образа)

Файл сохраненного образа не может быть создан или открыт.
Возможны 3 причины ошибки :

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

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

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


15 PRE-IMAGE I\O ERROR      (ошибка ввода-вывода файла
сохраненного образа )


Ошибка ввода-вывода во время работы с файлом сохраненного образа.
Либо переполнен диск, либо запорчен файл сохраненного образа.

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

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


16 EXPANSION ERROR          (ошибка расширения)

Переполнена директория и не может быть создано расширение для
разделенного файла. Либо Record Manager не может закрыть файл,
либо к файлу была добавлена новая страница и Record Manager не
может закрыть и вновь открыть файл для обновления директории.
Проверьте, не запорчен ли диск. Этот код может также возникнуть,
если прикладная программа пишет  блок вне файла.









     201/Rev1.00                                              B-3



Управление записями Btrieve
-------------------------------------------------ДД

17 CLOSE ERROR              (ошибка закрытия)

Структура директории не может быть сформирована для
Btrieve-файла. Либо Record Manager не может закрыть файл,
либо к файлу была добавлена новая страница и Record Manager не
может закрыть и вновь открыть файл для обновления директории.
Проверьте, не запорчен ли диск. Этот код может также возникнуть,
если прикладная программа пишет  блок вне файла.


18 DISK FULL               (переполнение диска)

Диск перполнен и добавление в файл не может быть выполнено. Либо
удалите ненужные файлы, либо выполните команду Extend, чтобы
получить дополнительную дисковую память.


19 UNRECOVERABLE ERROR   (неисправимая ошибка)

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


20 RECORD MANAGER INACTIVE   (Record Manager не активен)

Запрос был выдан перед тем, как стартовал Brequest или Record
Manager.


21 DATA BUFFER TOO SHORT     (буфер данных слишком мал)

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























     201/Rev1.00                                              B-4



                                   Коды состояний и сообщения
-------------------------------------------------ДД

22 DATA BUFFER LENGTH      (длина буфера данных)

Параметр буфера данных недостаточен, чтобы вместить длину записи
данных, заданную при создании файла. Проверьте, что длина буфера
данных не меньше, чем длина записи заданного файла.

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

     - Для команды Insert Brtrieve не включает запись, если буфер
       данных короче, чем порция записи фиксированной длины

     - Для команды Update, если буфер не вмещает запись, то
       обновление записи не происходит.

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


23 POSITION BLOCK LENGTH    (размер позиции блока )

Параметр позиции блока не может превышать 128 байтов.


24 PAGE SIZE ERROR          (ошибка размера страницы)

Размер страницы должен быть кратен 512 быйтам и не должен
превыщать 4096 байтов. При выполнении команды Create  Btrieve
прежде всего проверяет размер страницы и код 24 свидетельствует о
неправильном буфере данных.


25 CREATE I\O ERROR        (ошибка ввода-вывода при создании)

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

в транзакции.


26 NUMBER OF KEYS          (число ключей)

Для стандартного Btrieve файла с размером страницы 512 байт число
ключевых сегментов для всех заданных ключевых полей должно быть
от 1 до 8.Для  страниц с большим размером число ключевых
сегментов для всех заданных ключевых полей может быть от 1 до 24.
Вы должны определить по крайней мере 1 ненулевой ключ.




     201/Rev1.00                                              B-5



Управление записями Btrieve
-------------------------------------------------ДД

27 INVALID KEY POSITION    (неправильная позиция ключа)

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


28 INVALID RECORD LENGTH   (неправильная длина записи )

Заданная длина записи ( плюс накладные расходы на дубликаты
) больше, чем размер страницы минус 6 или длина меньше, чем
4 байта.


29 INVALID KEY LENGTH      (неправильная длина ключа  )

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


30 NOT A BTRIEVE FILE      (не Btrieve-файл)

Заданный файл не является файлом данных Btrieve. Либо файл был
создан не с помощью Btrieve, либо  был создан более ранними
версиями Btrieve. Используйте программу CONVERT4. EXE на
дистрибутивной дискете Btrieve, чтобы преобразовать файлы
расширения, созданные Btrieve v3. x  к настоящему формату.
Возможно также, что первая страница файла, которая содержит
управляющую запись файла, запорчена.


31 FILE ALREADY EXTENDED     (файл уже был расширен)

Заданный файл уже был расширен. Файл может быть расширен только
один раз.


32 EXTEND I/O ERROR          (ошибка ввода-вывода расширения)

Файл не может быть расширен. Возможно  переполнена директория
диска, переполнен диск или у диска есть защита от запись.


34 INVALID EXTENSION NAME   (неправильное имя расширения)

Неправильно задано имя разделенного файла для выполнения
расширения.






     201/Rev1.00                                              B-6



                                   Коды состояний и сообщения
-------------------------------------------------ДД

35 DIRECTORY ERROR          (ошибка директории)

Ошибка случилась при переходе от текущей директории к директоии,
содержащей Btrieve-файл.


36 TRANSACTION ERROR       (ошибка транзакции)

Команда Begin Transaction не может быть выполнена, так как
возможность использования  транзакций не была задана при
инициализации Bserver. vap.


37 TRANSACTION IS ACTIVE    (транзакция активна)

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


38 TRANSACTION CONTROL FILE I/O ERROR (ошибка ввода-вывода
управляющего файла транзакции)

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


39 END/ABORT TRANSACTION ERROR  (ошибка транзакций END/ABORT)

Команда END или ABORT TRANSACTION выданы без соответствующей
команды BEGIN TRANSACTION.


40 TRANSACTION MAX FULES     (максимум файлов в транзакции)

Была сделана попытка обновить большее количество файлов, чем
допустимо в 1 транзакции. Максимальное число различных файлов,
которые могут обновляться в течении логической транзакции, равно
12.


41 OPERATION NOT ALLOWED     (недопустимая команда)

Некоторые команды не могут быть использованы для определенных
целей. Например, Btrieve возвращает этот код, если вы пытаетесь
выполнить команды STEP, UPDATE или DELETE для файлов, имеющих
только ключевые поля, или пытаетесь выполнить команду GET для
файлов, имеющих только поля данных (не имеющих ключевых полей).
Кроме того, некоторые команды запрещены во время выполнения
транзакции, так как они оказывают большое влияние на файл
сохранения образа или на выполнение Btrieve. К таким командам
относятся Close, Set or Clear Owner, Extend, Create Supplemental
Index и Drop Supplemental Index. Добавим также, что во время
транзакции можно открывать файлы только по чтению.




     201/Rev1.00                                              B-7



Управление записями Btrieve
-------------------------------------------------ДД

42 INCOMPLETE ACCELERATED ACCESS   (не завершен ускоренный
доступ)

Делается попытка открыть файл, который пред этим был доступен в
режиме ускорения и не был успешно закрыт. Целостность файла не
обеспечивается. Либо используйте команду RECOVER для создания
нового файла, либо напишите свою собственную программу, которая
открывает файл в режиме восстановления и используйте команду Step
Direct для восстановления записи данных.


43 INVALID RECORD ADDRESS    (неправильный адрес записи )

В команде  Get Direct  неправильно задан адрес записи. Либо адрес
выходит за пределы файла, либо это не страница даннных.
Четырехбайтный адрес, который вы задаете в команде Get Direct,
должен быть одним из тех, которые  получаются по команде Get
Position.


44 NULL KEY PATH             (пустой ключевой путь)

Попытка использовать команду Get Direct, чтобы установить путь
для ключа, имеющего пустое значение. Btrieve не может производить
установку на пустое значение ключа.


45 INCONSISTENT KEY FLAGS    (несовместимые атрибуты ключа)

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


46 ACCESS TO FILE DENIED     (задание доступа к файлу )

Ваша прикладная программа открывает файл только по чтению и
пытается выполнить команды Update, Delete или Insert для этого
файла. Файла, которые открыты в режиме восстановления, можно
читать, но нельзя обновлять. Вы можете создать новый файл,
используя утилиту Recover или команду Step Direct. Другой
причиной кода может стать некорректно заданное имя владельца,
запрашивающего обновление, во время открытия файла из прикладной
программы.


47 MAXIMUM OPEN FILES        ( максимум открытых файлов)

Когда файл открыт в режиме ускорения, Record Manager резервирует
для файла один кэш-буфер. Число файлов, открытых в режиме
ускорения, не может превышать число буферов, выделенных Btrieve
для кэш-буферов. Btrieve выделяет также 5 пустых буферов для
работы с индексами. Чтобы разместить большее количество буферов,
измените конфигурацию Record Manager: задайте меньший параметр
размера страницы.




     201/Rev1.00                                              B-8



                                   Коды состояний и сообщения
-------------------------------------------------ДД

48 INVALID ALTERNATE SEQUENCE DEFENITION
(неправильное задание альтернативной последовательности)

Btrieve возвращает этот код, если первый заданный байт
альтернативной последовательности не содержит шестнадцатиричного
значения АС


49 KEY TYPE ERROR           (ошибка типа ключа)

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


50 OWNER ALREADY SET         (набор имеет владельца)

Делается попытка выполнить команду Set Owner для файла, который
уже имеет владельца. Используйте команду Clear Owner, чтобы
освободиться от статуса предыдущего владельца перед тем, как
установить нового.


51 INVALID OWNER              (неправильный владелец)

Существуют две причины для данного кода:

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

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


52 ERROR WRITING CACHE        (ошибка кэш-записи)

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









     201/Rev1.00                                              B-9



Управление записями Btrieve
-------------------------------------------------ДД

53 INVALID INTERFACE          (неправильный интерфейс)

Прикладная программа делает попытку доступа к файлу, содержащему
записи переменной длины, с помощью интерфейса Btrieve версии 3.15
и ниже. Чтобы сделать доступными файлы с записями переменной
длины, вы должны использовать интерфейс версии 4.хх.


54 VARIABLE PAGE ERROR       (Ошибка страниц)

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


55 AUTOINCREMENT ERROR       (Ошибка самовозрастания)

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


56 INCOMPLETE INDEX          (неполный индекс)

Дополнительный индекс запорчен. Это могло случиться, если команды
Create Supplemental Index или Drop Supplemental Index была
прервана не завершившись полностью. Выполните команду Drop
Supplemental Index, чтобы полностью удалить индекс из файла.


58 COMPRESSION BUFFER TOO SHORT  (слишком короткий буфер сжатия)

Прикладная программа делает попытку читать или писать запись,
которая больше, чем заданные размеры буфера сжатия. Измените
конфигурацию Bserver, задав большее значение для опции "Maximum
Compressed Record Size" и перестартуйте  сеть.


59 FILE ALREADY EXISTS       (файл уже существует)

Btrieve возвращает этот  код  для команды Create, если вы задали
-1 в параметре номера ключа и имя существующего файла в параметре
буфера ключа.


80 CONFLICT                  (конфликт)

Команды Update и Delete не могут быть выполнены, так как записи
были изменены другой станцией после того, как эта станция
прочитала их. Выполните повторно команду чтения.







     201/Rev1.00                                              B-10



                                   Коды состояний и сообщения
-------------------------------------------------ДД

81 LOCK ERROR                (ошибка блокировки)

Эта ошибка результат одного из трех условий :

     - переполнена таблица блокировки Btrieve. Задайте большее
       значение для параметра блокировки в Bserver.

     - сбой вызова функции блокировки операционной системой

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


82 LOST POSITION             (потеря позиции)

Когда выполняется команда Get Next или Get Previous для ключа с
дубликатами, делается попытка восстановить запись, которая была
удалена или значение ключа которой было модифицировано другой
станцией. Для выполнения нового позиционирования используйте
команды Get Equal или Get Direct.


83 READ OUTSIDE TRANSACTION  (чтение вне транзакции)

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


84 RECORD IN USE            (запись занята)

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


85 FILE IN USE             (файл занят)

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


86 FILE TABLE FULL         ( переполнена таблица файла)

Переполнена таблица файла Bserver. Задайте больше значение для
параметра файлов в Bserver.






     201/Rev1.00                                              B-11



Управление записями Btrieve
-------------------------------------------------ДД

87 HANDLE TABLE FULL       (переполнена управляющая таблица)

Управляющая таблица Bserver переполнена. Задайте большее значение
для пареметра управляющей таблицы Bserver. Возможно также, что
NetWare не может назначить управляющую таблицу файлу.


88 INCOMPATIBLE MODE ERROR  (ошибка несовместимости режимов)

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


90 REDIRECTED DEVICE TABLE FULL   (переполнена таблица
переадресации устройств)

Переполнена либо таблица переадресации, либо таблица
маршрутизации сервера. Эта ошибка может случиться, если вы
присоединились к дополнительным серверам или установили связь с с
большим количеством приводов (drives) после того, как вы
загрузили Brequest. Загрузите еще раз Brequest, задав большие
значения для опций /R или /S.

Эта ошибка может также случиться, если вы присоединились к 8
серверам, затем отсоединились от части серверов и присоединились
к другим серверам. Рабочая станция присоединена к серверу, а
Brequest не заменил его имя в таблице серверов.


91 SERVER ERROR              (ошибка сервера)

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


92 TRANSACTION TABLE ERROR   (переполнена таблица транзакций)

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


93 INCOMPATIBLE LOCK TYPE    (несовместимость типов блокировки)

Прикладная программа пытается смешать блокировку единичной записи
(+100/+200) и блокировку множественной записи (+300/+400) в одном
и том же файле в одно и то же время. Вся блокировка одного типа
должна быть освобождена перед тем, как будет выполняться
блокировка другого типа.






     201/Rev1.00                                              B-12



                                   Коды состояний и сообщения
-------------------------------------------------ДД

94 PERMISSION ERROR          (ошибка доступа)

Пользователь пытается открыть или создать файл в директории, в
которой он не имеет права это делать. Btrieve не перекрывает
привелегий сети, назначеннных пользователю.


95 SESSION NO LONGER VALID   (сессия не может больше
продолжаться)

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


96 COMMUNICASTION ENVIRONMENT ERROR (ошибка оборудования связи)

Переполнена таблица связи SPX. Перезагрузите SPX, задав большее
значение для таблицы связи. Для получения большей информации
обратитесь к руководству NetWare Supervisir Reference.


97 DATA MESSAGE TOO SMALL   (сообщения данных очень малы)

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

     - для команд Update, Insert или Create прикладная программа
       может получить этот код, если длина буфера данных,
       назначенная для записи, превышает длину, заданную в опции
       /D для Brequest или параметр длины записи в Bserver.

     - для команд Get, Step или Stat прикладная программа может
       получить этот код возврата, если значение, заданное для
       параметра сообщения данных короче, чем длина данных,
       получаемых из Btrieve, несмотря на длину буфера данных,
       заданную в программе.


98 INTRNAL TRANSACTION ERROR  (внутренняя ошибка транзакции)

Ошибка случилась во время выполнения команды из транзакции. Все
команды Insert, Update и Delete, выданные со времени последней
команды Begin Transaction откатываются назад. Вы должны быть
уверены, что команда Abort Transacton (21) полностью завершила
откат и вышла из транзакции.


Коды возврата Brequest( OS/2)

BREQUEST. DDL может  возвращать следующие коды возврата во время
работы на станции OS/2.




     201/Rev1.00                                              B-13



Управление записями Btrieve
-------------------------------------------------ДД

2001 INSUFFICIENT MEMORY     (недостаточно памяти)

Brequest не может выделить достаточно памяти для параметров
заданных в Reqparms. Либо уменьшите размер опции /D, либо
уменьшите размер других программ с резидентной памятью,
загруженных до загрузки Brequest.


2002 PARAMETER INVALID OR OUT OF RANGE  (параметр неправильный
или вне допутимых пределов)

Один из параметров, заданных с помощью Reqparms, либо
неправильный ( например, /P вместо /D),либо значение, заданное
для параметра, находится вне допустимых пределов. Проверьте
Set Reqparms, чтобы быть уверенным в их правильности.


2003 NO LOCAL ACCESS ALLOWED   (не разрешен логический доступ)

Прикладная программа пытается осуществить доступ к файлу,
загруженному на логический  привод. Версия Btrcall. dll,
установленная для рабочей станции, не разрешает доступ
к логическим файлам.





































     201/Rev1.00                                              B-14



                                   Коды состояний и сообщения
-------------------------------------------------ДД

Сообщения об ошибках BREQUEST (DOS)

Если Brequest. exe загружен на рабочую станцию DOS, он может
выдавать следующие коды возврата:


BSERVER NOT LOADED           (Bserver не загружен)

Программа Bserver должна быть активна для сервера перед тем, как
Brequest будет осуществлять доступ к файлам этой машины.


TOO MANY FILE SERVERS ATTACHED   (присоединено слишком много
файл-серверов )

Mаксимальное число файл-серверов, которое может присоединить
рабочая станция, равно 8.


INCORRECT NETWARE VERSION     (неправильная версия NetWare)

На рабочей станции должен быть установлен  Advanced NetWare v2.
1x или выше.


INCORRET PARAMETER            ( неправильный параметр)

Задан непредусмотренный параметр. Обратитесь к разделам по
запуску Brequest и просмотрите список параметров.


INSUFFICIENT MEMORY           (недостаточно памяти)

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


MUST HAVE DOS 2.00 OR GREATER ( должна быть версия 2.00 или выше)

Brequest требует, чтобы на рабочей станции была загружена версия
DOS 2.0 или выше.


PROGRAM ALREADY LOADED        ( программа уже загружена)

Brequest уже загруден в память.


REDIRECTION LIST NOT LARGE ENOUGH   (список перадресации
недостаточен)

Brequest не может поместить  все требуемые устройства  в список
переадресации. Увеличьте значение для параметра /R.






     201/Rev1.00                                              B-15



Управление записями Btrieve
-------------------------------------------------ДД

SERVER ROUTING LIST IS NOT LARGE ENOUGH (список маршрутизации
сервера недостаточен )

К рабочей станции присоединено больше сервиров, чем это
определено в опции /S. Перегрузите Brequest, задав большее число
для опции /S.


SPX IS NOT LOADED            (SPX не загружена)

Матобеспечение связи NetWare SPX должно загружаться до обращеня
прикладной программы к Brequest.
















































     201/Rev1.00                                              B-16



                                   Коды состояний и сообщения
-------------------------------------------------ДД

Сообщения об ошибках BSERVER и BROUTER

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


INSUFFICIENT MEMORY FOR PARAMETERS SPECIFIED (недостаточно памяти
для заданных параметров)

Bserver не может разместить минимальное число требуемых буферов.
Уменьшите опцию размера страниц.

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


UNABLE ACCESS FILE FOR TRANSACTION RECOVERY (файл недоступен для
транзакции восстановления)

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

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


UNABLE TO ALLOCATE BROUTER BUFFER MEMORY (невозможно разместить в
памяти буфер Brouter )

Btrieve не может выделить количество памяти, заданное в опции
'длина сообщения данных'. Используйте Bsetup, чтобы изменить
конфигурацию и установите заново Btrieve VAP, задав меньшее
значение для длины сообщения данных.



















     201/Rev1.00                                              B-17



Управление записями Btrieve
-------------------------------------------------ДД

Сообщения об ошибках BUTIL

Утилита Butil. exe возвращает текст сообщения в случае
возникновения ошибки. Сообщения об ошибках печатается с помощью
STDOUT. Чтобы направить сообщения на другое устройство,
воспользуйтесь в DOS символом '>'.

Большинство сообщений об ошибках Butil являются самообъяснимыми.
Ниже представлены те сообщения, которые могут потребовать
дополнительных объяснений.


ERROR ACCESSING ALTERNATE SEQUENCE FILE (ошибка доступа к файлу
альтернативной последовательности)

Butil получает ошибку во время чтения файла альтернативной
сортирующей последовательности, который вы задали с помощью
ключевого слова "name=". Эта ошибка обычно свидетельствует
о неожиданном конце файла.


ERROR ACCESSING DESCRIOTION FILE.
EXPECTED KEYWORD keyword IN KEY DESCRIOTOR n
(ошибка доступа к дескрипторному файлу. ожидаемое ключевое слово.
. . . . . . в ключе дескриптора n )

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


ERROR ACCESSING SEQUENTIAL FILE (ошибка доступа к
последовательному файлу)

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


INPROPER COMMAND LINE    (неправильная командная строка)

Вы ввели неправильный ключевой параметр (например, P вместо O)
или команда имеет слишком много параметров.


INVALID KEY TYPE          (неправильный тип ключа )

Вы задали неправильный тип ключа в дескрипторном файле.









     201/Rev1.00                                              B-18



                                   Коды состояний и сообщения
-------------------------------------------------ДД

INVALID LOAD FILE FORMAT. END OF RECORD MARKER NOT FOUND
(неправильный формат файла загрузки. Не найден маркер конца
записи)

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


SIZE FOR keytype TYPE IS INVALID (неправильный размер для данного
типа ключа)

Обычно типы ключей имеют ограничения на их длину.

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


UNABLE TO CREATE/OPEN SEQUENTIAL FILE ( невозможно
создать/открыть последовательный файл)

Btrieve не может открыть последовательный файл, который вы задали
в команде Load. Получение этой ошибки во время выполнения команд
Save или Recover означает, что Btrieve не может создать заданный
вами последовательный файл.


UNABLE TO OPEN ALTERNATE SEQUENCE FILE ( невозможно открыть файл
альтернативной последовательности)

Butil не может открыть файл, который вы задали для альтернативной
сортирующей последовательности в команде Create. Уточните
правильность заданного вами имени файла.


UNABLE TO OPEN DESCRIPTION FILE (невозможно открыть дескрипторный
файл)

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


















     201/Rev1.00                                              B-19


6
                                   Пример программ для Pascal
-------------------------------------------------ДД

ПРИЛОЖЕНИЕ С:
ПРИМЕРЫ НА ЯЗЫКЕ PASCAL
-------------------------------------------------

Следующие примеры показывают ,как вызывать BTRIEVE из прикладных
програм,написанных на языке PASCAL.


ABORT TRANSACTION в языке PASCAL

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


type
     ORDER_HDR = record
       case integer of
           1: (HDR_ORD_NUM   : integer;
               HDR_CUST      : integer;
               HDR_DATE      : string(6));

           2: (ENTIRE        : string(0));
       end;


     ORDER_DET = record
       case integer of
           1: (DET_ORD_NUM   : integer;
               DET_PART      : integer;
               DET_QUAN      : integer);
           2  (ENTIRE        : string(6));
       end;
   var
      DET_BUF    :ORDER_DET;
      DET_KEY    :string(2);
      DET_LEN    :integer;
      DET_POS    :string(128);
      DUMY_BUF   :string(128);
      DUMY_LEN   :integer;
      HDR_BUF    :ORDER_HDR;
      HDR_KEY    :string(2);
      HDR_LEN    :integer;
      HDR_POS    :string(128);
      STATUS     :integer;
   begin
   { Начало транзакции }
   STATUS:=BTRV(B_BEGIN,DUMY_BUF,DUMY_BUF,DUMY_LEN,DUMY_BUF,0);
    if STATUS <> 0 then
     begin
          writeln(OUTPUT,'Ошибка начала транзакции.Код=',STATUS);
          return;
     end;




     201/Rev1.00                                              C-1



Управление записями Btrieve
-------------------------------------------------ДД

   {Включение записи в основной файл  }
  with HDR_BUF do
   begin
        HDR_ORD_NUM:=236;                        {Номер 236  }
        HDR_CUST:=201;                           {Покупатель 201}
        HDR_DATE:='061583';                      {Дата покупки}
   end;
  HDR_LEN:=sizeof(HDR_BUF);

  STATUS:=BTRV(B_INSERT,HDR_POS,HDR_BUF.ENTIRE,HDR_LEN,HDR_KEY,0);
  if STATUS<>0 then
    begin
     writeln(OUTPUT,'Ошибка включения записи в
                 основной файл. Код=',STATUS);

     STATUS:=BTRV(B_ABORT,DUMY_BUF,DUMY_BUF,DUMY_LEN,DUMY_BUF,0);
          return;
    end;
   {Включение 2 записей в файл деталей }
  with DET_BUF do                       {Включение 1 записи}
   begin
        DET_ORD_NUM:=236;              {Номер 236  }
        DET_PART:=1002;                {Дискеты партии 1002}
        DET_QUAN:=1;                   {Куплена 1 коробка}
   end;
  DET_LEN:=sizeof(DET_BUF);

STATUS:=BTRV(B_INSERT,DET_POS,DET_BUF.ENTIRE,DET_LEN,DET_KEY,0);
  if STATUS<>0 then
    begin

     writeln(OUTPUT,'Ошибка включения записи в
                 файл деталей. Код=',STATUS);

     STATUS:=BTRV(B_ABORT,DUMY_BUF,DUMY_BUF,DUMY_LEN,DUMY_BUF,0);
          return;
    end;

  with DET_BUF do                       {Включение 2 записи}
   begin

        DET_PART:=1024;                {Ленты партии 1002}
        DET_QUAN:=1;                   {Куплена 1 лента}
   end;
  DET_LEN:=sizeof(DET_BUF);

  STATUS:=BTRV(B_INSERT,DET_POS,DET_BUF.ENTIRE,DET_LEN,DET_KEY,0);
  if STATUS<>0 then
    begin
     writeln(OUTPUT,'Ошибка включения записи в
                 файл деталей. Код=',STATUS);

     STATUS:=BTRV(B_ABORT,DUMY_BUF,DUMY_BUF,DUMY_LEN,DUMY_BUF,0);
          return;
    end;
{  Конец транзакции }




     201/Rev1.00                                              C-2



                                   Пример программ для Pascal
-------------------------------------------------ДД

  STATUS:=BTRV(B_END,DUMY_BUF,DUMY_BUF,DUMY_LEN,DUMY_BUF,0);
  if STATUS<>0 then
    begin
     writeln(OUTPUT,'Ошибка конца транзакции.Код=',STATUS);
     return;
    end;


BEGIN TRANSACTION в языке PASCAL

Смотри ABORT TRANSACTION и END TRANSACTION

CLOSE в языке PASCAL

Следующий пример показывает ,как закрыть файл BTRIEVE из языка
PASCAL.

var
    BUF_LEN    :integer;
    DATA_BUF   :string(80);
    KEY_BUF    :string(30);
    POS_BLOCK  :string(128);
    STATUS     :integer;
     begin
      STATUS:=BTRV(B_CLOSE,POS_BLOCK,DATA_BUF,BUF_LEN,KEY_BUF,0);
      if STATUS<>0 then
        writeln(OUTPUT,'Код возврата = ',STATUS);
     end.


CREATE в языке PASCAL

В следующем примере прикладная программа создает файл BTRIEVE c
двумя ключами.Ключ 0 - целое 2-байтное число.Ключ 1 допускает
дубликаты,может быть модифицирован,состоит из двух сегментов.
Первый сегмент - 2-байтовая строка - отсортирован в порядке
убывания,второй сегмент - заканчивающаяся нулями 30-байтовая
строка .Записи фиксированной длины,размерностью 80.

const
     B_CREATE  = 14;
     DUPLICATES= 1;
     MODIFIABLE= 2;
     SEGMENTED =16;
     DESCENDING=64;
     EXTTIPE   =265;
     BINTEGER  =1;
     BSTRING   =11;
  type
     byte_type=0..255;
     KEY_SPEC=record
       KEY_POS     : integer;
       KEY_LEN     : integer;
       KEY_FLAGS   : integer;
       NOT_USED    : string(4);
       KEY_RSV     : array[1..6] of byte_type; {выравнивание слова}
       end;



     201/Rev1.00                                              C-3



Управление записями Btrieve
-------------------------------------------------ДД

    FILE_SPEC=record
     case integer of
     1:  (REC_LEN     : integer;
         PAGE_SIZE    : integer;
         NDX_CNT      : integer;
         NOT_USED     : string(4);
         VARIABLE     : integer;
         RESERVED     : string(2);
         PRE_ALLOC    : integer;
         KEY_BUF      : array[1..2] of KEY_SPEC);
     2:  (SPEC_BUF   : integer);
     end;
   var
      BUF_LEN     : integer;
      FILE_BUF    : FILE_SPEC;
      FILE_NAME   : string(17);
      POS_BLK     : string(128);
      STATUS      : integer;
    begin
    with FILE_BUF do
       begin
        REC_LEN:=80;
        PAGE_SIZE:=1024;
        VARIABLE:=0;
        PRE_ALLOC:=0;
        NDX_CNT:=2;
        KEY_BUF[0].KEY_POS:=1;
        KEY_BUF[0].KEY_LEN:=2;
        KEY_BUF[0].KEY_FLAGS:=EXTTYPE;
        KEY_BUF[0].KEY_RSV[1]:=BINTEGER;
        KEY_BUF[1].KEY_POS:=3;
        KEY_BUF[1].KEY_LEN:=2;
        KEY_BUF[1].KEY_FLAGS:=
           DUPLICATES+MODIFIABLE+SEGMENTED+EXTTYPE+DESCENDING;
        KEY_BUF[1].KEY_RSV[1]:=BSTRING;
        KEY_BUF[2].KEY_POS:=5;
        KEY_BUF[2].KEY_LEN:=30;
        KEY_BUF[2].KEY_FLAGS:=
           DUPLICATES+MODIFIABLE+EXTTYPE;
        KEY_BUF[2].KEY_RSV[1]:=BSTRING;
    end;
   FILE_NAME:='\DATA\CREATE.TST';
   BUF_LEN:=sizeof(FILE+BUF);
   STATUS:=BTRV(B_CREATE,POS_BLK,FILE_BUF,SPEC_BUF,BUF_LEN,FILE_NAME,0);
    if STATUS<>0
    then
       writeln(OUTPUT,'Ошибка создания файла.Код = ',STATUS) ;
    else
       writeln(OUTPUT,'Файл успешно создан') ;











     201/Rev1.00                                              C-4



                                   Пример программ для Pascal
-------------------------------------------------ДД

CREATE SUPPLEMENTAL INDEX в языке PASCAL

В следующем примере прикладная программа добавляет индекс в файл
BTRIEVE.Первый сегмент ключа - 10-байтовая сторка.Он может быть
модифицирован и допускает дубликаты.Второй сегмент 2-байтовое
целое число.

const
     B_CREIDX  = 31;
     DUPLICATES= 1;
     MODIFIABLE= 2;
     SEGMENTED =16;
     EXTTIPE   =265;
     BINTEGER  =1;
     BSTRING   =0;
  type
     byte_type=0..255;
     KEY_SPEC=record
       KEY_POS     : integer;
       KEY_LEN     : integer;
       KEY_FLAGS   : integer;
       NOT_USED    : string(4);
       KEY_RSV     : array[1..6] of byte_type; {выравнивание слова}
       end;
     ALL_SPEC=record
     case integer of
     1:  KEY_BUF     : array[1..2] of KEY_SPEC);
     2:  (SPEC_BUF   : string(32);
     end;
   var
      BUF_LEN     : integer;
      AKEY_BUF    : ALL_SPEC;
      FILE_NAME   : string(17);
      POS_BLK     : string(128);
      DUMY        : string(80);
      STATUS      : integer;
    begin
   FILE_NAME:='\DATA\CREATE.TST';
   BUF_LEN:=0;
    STATUS:=BTRV(B_OPEN,POS_BLK,DUMY_BUF,BUF_LEN,FILE_NAME,0);
    if STATUS<>0 then
    writeln(OUTPUT,'Ошибка открытия файла.Код = ',STATUS) ;
    begin
     with FILE_BUF do
      begin
        PRE_ALLOC:=0;
        VARIABLE:=0;
        NDX_CNT:=2;
        KEY_BUF[0].KEY_POS:=40;
        KEY_BUF[0].KEY_LEN:=10;
        KEY_BUF[0].KEY_FLAGS:=DUPLICATES+MODIFIABLE+SEGMENTED+EXTTYPE;
        KEY_BUF[0].KEY_TYPE:=BSTRING;
        KEY_BUF[1].KEY_POS:=50;
        KEY_BUF[1].KEY_LEN:=10;
        KEY_BUF[1].KEY_FLAGS:=
           DUPLICATES+MODIFIABLE+EXTTYPE;
        KEY_BUF[1].KEY_TYPE:=BINTEGER;
    end;


     201/Rev1.00                                              C-5



Управление записями Btrieve
-------------------------------------------------ДД

   BUF_LEN:=sizeof(AKEY_BUF);
   STATUS:=BTRV(B_CREIDX,POS_BLK,AKEY_BUF,SPEC_BUF,BUF_LEN,DUMY,0);
    if STATUS<>0
    then
       writeln(OUTPUT,'Ошибка во время добавления дополнительного  индекса в файл.Код = ',STATUS) ;
    else
       writeln(OUTPUT,'Успешное добавлениие дополнительного
        индекса в файл') ;


DELETE в языке PASCAL

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

type
     RESERVATION = record
        case integer of
        1:(FLIGHT_NO : string(3);
          PASSENGER  : string(15);
          AMOUNT_PAUD: string(6);
          ISSUE_DATE : string(6));
        2:(ENTIRE    : string(32));
       end;
   var
      BUF_LEN     : integer;
      DATA_BUF    : RESERVETION;
      KEY_BUF     : string(15);
      POS_BLOCK   : string(128);
      STATUS      : integer;
    begin
   BUF_LEN:=sizeof(DATA_BUF);
   KEY_BUF:='Martin,Dave H';
    STATUS:=BTRV(B_GET_EQ,POS_BLOCK,DATA_BUF.ENTIRE,BUF_LEN,KEY_BUF,0);
    if STATUS<>0 then
    begin
       writeln(OUTPUT,'Код BTRIEVE = ',STATUS) ;
       return;
    end;
    STATUS:=BTRV(B_DELETE,POS_BLOCK,DATA_BUF.ENTIRE,BUF_LEN,KEY_BUF,0);
    if STATUS<>0 then
       writeln(OUTPUT,'Код BTRIEVE = ',STATUS) ;

















     201/Rev1.00                                              C-6



                                   Пример программ для Pascal
-------------------------------------------------ДД

После выполнения DELETE текущее положение в файле BTRIEVE будет
следующее:

-------------------------------------------
I 326 I Grawley,Joe J.  I 179.85 I 061582 I
-------------------------------------------
I 711 I Howell,Susan    I 259.40 I 052382 I   <--- предыдущая
-------------------------------------------        запись
I 326 I Petersy,John H. I 445.80 I 061782 I   <--- следующая
-------------------------------------------        запись
I 840 I White,Rosemary  I 397.00 I 060282 I
-------------------------------------------
                 ^
                 I
                 I
              путь доступа


DROP SUPPLEMENT INDEX в языке PASCAL

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

const
    B_DROP  = 32;
    INV_KNUM= 6;
  var
     BUF_LEN     : integer;
     POS_BLK     : string(128);
     DUMYDB      : string(1);
     STATUS      : integer;
   begin
  BUF_LEN:=1;
  STATUS:=BTRV(B_DROP,POS_BLK,DUMYDB,BUF_LEN,DUMYDB,3);
   if STATUS=INV_KNUM
   then
     writeln(OUTPUT,'Номер ключа на уничтожение не является доролнительным индексом.')
   else
   if STATUS<>0
   then
      writeln(OUTPUT,'Ошибка уничтоженияе дополнительного индекса.Код=',STATUS) ;


END TRANSACTION в языке PASCAL

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

type
     LEDGER_KEY = record
       case integer of
         1: (KEY_VAL :integer);
         2: (KEY_STR : string(2));
       end;



     201/Rev1.00                                              C-7



Управление записями Btrieve
-------------------------------------------------ДД

     LEDGER_REC = record
     case integer of
     1:  (ACCT_ID    : integer;
         DESC        : string(40);
         BALANCE     : real);
     2:  (ENTIRE     : string(46));
     end;
   var
      BUF_LEN     : integer;
      DATA_BUF    : LEDGER_REC;
      DUMY_BUF    : string(128);
      DUMY_LEN    : integer;
      KEY_BUF     : LEDGER_KEY;
      POS_BLK     : string(128);
      STATUS      : integer;
    begin
  { Начало транзакции }
    STATUS:=BTRV(B_BEGIN,DUMY_BUF,DUMY_BUF,DUMY_LEN,DUMY_BUF,0);
    if STATUS<>0
    then
    begin
       writeln(OUTPUT,'Ошибка начала транзакции.Код = ',STATUS) ;
       return;
    end;
 { Нахождение и обновление записи денежных счетов  }
        KEY_BUF.KEY_VAL:=101;             {  счет 101 }
        BUF_LEN=sizeof(DATA_BUF);
        STATUS:=BTRV(B_GET_EQ,POS_BLK,DATA_BUF.ENTIRE,BUF_LEN,
             KEY_BUF.KEY_STR,0);
    if STATUS<>0 then
    begin
       writeln(OUTPUT,'Ошибка получения записи.Код = ',STATUS);
       STATUS:=BTRV(B_ABORT,DUMY_BUF,DUMY_BUF,DUMY_LEN,DUMY_BUF,0);
       return;
    end;
    DATA_BUF.BALANCE:=DATA_BUF.BALANCE-250;
    STATUS:=BTRV(B_UPDATE,POS_BLK,DATA_BUF.ENTIRE,BUF_LEN,
             KEY_BUF.KEY_STR,0);
    if STATUS<>0 then
    begin
       writeln(OUTPUT,'Ошибка обновления записи.Код = ',STATUS);
       STATUS:=BTRV(B_ABORT,DUMY_BUF,DUMY_BUF,DUMY_LEN,DUMY_BUF,0);
       return;
    end;
 { Нахождение и обновление записи  счетов затрат}
        KEY_BUF.KEY_VAL:=511;             {Cчет затрат     511 }
        STATUS:=BTRV(B_GET_EQ,POS_BLK,DATA_BUF.ENTIRE,BUF_LEN,KEY_BUF.KEY_STR,0);
    if STATUS<>0 then
    begin
       writeln(OUTPUT,'Ошибка получения записи.Код = ',STATUS);
       STATUS:=BTRV(B_ABORT,DUMY_BUF,DUMY_BUF,DUMY_LEN,DUMY_BUF,0);
       return;
    end;
    DATA_BUF.BALANCE:=DATA_BUF.BALANCE+250;
       STATUS:=BTRV(B_UPDATE,POS_BLK,DATA_BUF.ENTIRE,BUF_LEN,
             KEY_BUF.KEY_STR,0);




     201/Rev1.00                                              C-8



                                   Пример программ для Pascal
-------------------------------------------------ДД

    if STATUS<>0 then
    begin
       writeln(OUTPUT,'Ошибка обновления записи.Код = ',STATUS);
       STATUS:=BTRV(B_ABORT,DUMY_BUF,DUMY_BUF,DUMY_LEN,DUMY_BUF,0);
       return;
    end;
{ Конец транзакции  }
    STATUS:=BTRV(B_END,DUMY_BUF,DUMY_BUF,DUMY_LEN,DUMY_BUF,0);
    if STATUS<>0 then
    begin
       writeln(OUTPUT,'Ошибка конца транзакции.Код = ',STATUS);
       return;
    end;


EXTEND  в языке PASCAL

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

type
    ADDRESS_REC = record
      case integer of
       1: (NAME   : string(30);
          STREET  : string(30);
          CITY    : string(30);
          STATE   : string(2);
          ZIP     : string(5));
       2: (ENTIRE : string(98));
      end;
  var
     BUF_LEN     : integer;
     DATA_BUF    : ADDRESS_REC;
     EXT_NAME    : string(14);
     FILE_NAME   : string(14);
     KEY_BUF     : string(30);
     POS_BLOCK   : string(128);
     STATUS      : integer;
   begin
  FILE_NAME:='ADDRESS.BTR ';
  BUF_LEN:=sizeof(DATA_BUF);
  STATUS:=BTRV(B_OPEN,POS_BLOCK,DATA_BUF.ENTIRE,BUF_LEN,FILE_NAME,0);
   if STATUS<>0 then
     begin
      writeln(OUTPUT,'Ошибка открытия файла.Код = ',STATUS) ;
      return;
     end;
    EXT_NAME:='B:\ADDRESS.EXT';
   STATUS:=BTRV(B_EXTEND,POS_BLOCK,DATA_BUF.ENTIRE,BUF_LEN,EXT_NAME,0);
   if STATUS<>0 then
    begin
      writeln(OUTPUT,'Ошибка расширения файла.Код = ',STATUS) ;
      return;
    end;
  STATUS:=BTRV(B_CLOSE,POS_BLOCK,DATA_BUF.ENTIRE,BUF_LEN,KEY_BUF,0);
  STATUS:=BTRV(B_OPEN,POS_BLOCK,DATA_BUF.ENTIRE,BUF_LEN,FILE_NAME,0);



     201/Rev1.00                                              C-9



Управление записями Btrieve
-------------------------------------------------ДД

  if STATUS<>0 then
    writeln(OUTPUT,'Ошибка повторного открытия файла.Код = ',STATUS) ;
  else
    writeln(OUTPUT,'Файл успешно открыт повторно.Код = ',STATUS);


GET DIRECT в языке PASCAL

Следующий пример показывает как прикладная программа может
использовать команду GET DIRECT , чтобы отсортировать записи
в файле BTRIEVE по внешниму индексу.( Смотри описание GET
POSITION, где на примере показано ,как построить внешний индекс).

type
    ADDRESS_REC = record
      case integer of
       1: (NAME   : string(20);
          STREET  : string(20);
          CITY    : string(10);
          STATE   : string(2);
          ZIP     : string(5));

       2: (REC_POS: string(4));
       3: (ENTIRE : string(57));
      end;
 type
    INDX_REC = record
      case integer of
       1: (INDX_POS :  string(4);
          INDX_STATE:  string(2));
       2: (ENTIRE   : string(6));
      end;
  var
     FILE_DATA   : ADDR_REC;
     FILE_LEN    : integer;
     FILE_POS    : string(128);
     INDX_DATA   : INDX_REC;
     INDX_LEN    : integer;
     INDX_POS    : string(128);
     NAME_KEY    : string(20);
     STATE_KEY   : string(2);
     STATUS      : integer;
   begin
 FILE_LEN:=sizeof(FILE_DATA);
 INDX_LEN:=sizeof(INDX_DATA);
 STATUS:=BTRV(B_GET_LOW,INDX_POS,INDX_DATA.ENTIRE,INDX_LEN,STATE_KEY,0);
   if STATUS<>EOF_ERR do                { Чтение до конца файла }
   begin
   if STATUS<>0  then
      begin
      writeln(OUTPUT,'Ошибка открытия файла.Код = ',STATUS) ;
      return;
      end;
 FILE_DATA.REC_POS=INDX_DATA.INDX_POS;
 STATUS:=BTRV(B_GET_DIRECT,FILE_POS,FILE_DATA.ENTIRE,FILE_LEN,
        NAME_KEY,0);




     201/Rev1.00                                              C-10



                                   Пример программ для Pascal
-------------------------------------------------ДД

   if STATUS<>0 then
   begin
      writeln(OUTPUT,'Ошибка чтения записи файла.Код = ',STATUS) ;
      return;
   end;
 with FILE_DATA do
      writeln(OUTPUT,NAME,STREET,CITY,STATE,ZIP);
      STATUS:=BTRV(B_GET_NEXT,INDX_POS,INDX_DATA.ENTIRE,INDX_LEN,
            STATE_KEY,0);
   end;


GET DIRECTORY в языке PASCAL

Следующий пример показывает как прикладная программа может
использовать команды GET и SET DIRECTORY ,чтобы получить текущую
директорию в начале программы и восстановить ее перед окончанием.

var
     DIR_PATH    : string(64);
     DUMY_BUF    : string(128);
     DUMY_LEN    : integer;
     STATUS      : integer;
   begin
   STATUS:=BTRV(B_GET_DIR,DUMY_BUF,DUMY_BUF,DUMY_LEN,DIR_PATH,0);
   if STATUS<>0 then
      begin
        writeln(OUTPUT,'Ошибка получения текущей директории.Код =', STATUS) ;
        return;
      end;
   STATUS:=BTRV(B_SET_DIR,DUMY_BUF,DUMY_BUF,DUMY_LEN,DIR_PATH,0);
   if STATUS<>0 then
      begin
        writeln(OUTPUT,'Ошибка восстановления текущей директории.Код =',  STATUS) ;
        return;
      end;


GET EQUAL в языке PASCAL

В следующем примере часть инветарного номера является ключом в
файле инвентаризационной ведомости.Прикладная программа по одной
команде GET EQUAL получает запись,содержащую инвентаризационную
информацию с заданным ключем и определяет, нужно ли
переупорядочить эту часть номера.

type
     INVENTORY = record
        case integer of
        1:(PART_NUM    : string(5);
          PART_DESC    : string(10);
          QUAN_ON_HAND :string(3);
          REORDER_POINT: string(3));
          REORDER_QUANT: string(3));
        2:(ENTIRE      : string(28));
       end;




     201/Rev1.00                                              C-11



Управление записями Btrieve
-------------------------------------------------ДД

   var
      DATA_LEN    : integer;
      DATA_BUF    : INVENTORY;
      KEY_BUF     : string(5);
      POS_BLK     : string(128);
      STATUS      : integer;
    begin
   DATA_LEN:=sizeof(DATA_BUF);
   KEY_BUF:='03426';                  {Часть номера для поиска }
   STATUS:=BTRV(B_GET_EQ,POS_BLK,DATA_BUF.ENTIRE,DATA_LEN,KEY_BUF,0);
    if STATUS<>0 then
    begin
       writeln(OUTPUT,'Ошибка чтения файла.КОД=',STATUS) ;
       return;
    end;
  with DATA_BUF do
    if QUAN_ON_HAND0 then
       writeln(OUTPUT,'Ошибка чтения файла.КОД=',STATUS) ;
    else
       writeln(OUTPUT,'Самый молодой сотрудник -',BUF_NAME);


После выполнение команды GET FIRST BTRIEVE установит текущую
позицию как показано на рисунке:

                                                <--- предыдущая
---------------------------------------------        запись
I Brook,Wendy W.          I 18  I 071582    I   <--- текущая
---------------------------------------------        запись
I Ross,John L.            I 20  I 121081    I   <--- следующая
---------------------------------------------        запись
I Blarid,Suzanne M.       I 25  I 050281    I
---------------------------------------------
I Brandes William J.      I 40  I 031576    I
---------------------------------------------
                               ^
                               I
                               I
                          путь доступа


GET GREATER в языке PASCAL

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

type
     POLICY = record
        case integer of
        1:(POLICY_NUM  : string(10);
          NAME         : string(20);
          EFFECT_DATE  : string(6));
          VIOLATIONS   : string(2));
        2:(ENTIRE      : string(38));
       end;
   var
      DATA_LEN    : integer;
      DATA_BUF    : POLICY;
      KEY_BUF     : string(2);
      POS_BLOCK   : string(128);
      STATUS      : integer;
    begin
   DATA_LEN:=sizeof(DATA_BUF);
   KEY_BUF:='03'
   STATUS:=BTRV(B_GET_GT,POS_BLOCK,DATA_BUF.ENTIRE,DATA_LEN,KEY_BUF,2);






     201/Rev1.00                                              C-13



Управление записями Btrieve
-------------------------------------------------ДД

    if STATUS<>0 then
       begin
         writeln(OUTPUT,'Ошибка чтения файла.КОД=',STATUS) ;
         return;
       end;
    if STATUS<>EOF_ERR do
       begin
         writeln(OUTPUT,DATA_BUF.NAME,'Имеет',DATA_BUF.VIOLATIONS, 'нарушений');
         STATUS:=BTRV(B_GET_NEXT,POS_BLOCK,DATA_BUF.ENTIRE,DATA_LEN,KEY_BUF,2);
         if (STATUS<>0)and(STATUS<>EOF_ERR) then
         writeln(OUTPUT,'Ошибка чтения файла.КОД=',STATUS) ;
       end;



GET GREATER OR  EQUAL в языке PASCAL

Если дата покупки - это ключ в файле накладных ,то прикладная
программа может использовать команду GET GREATER OR  EQUAL чтобы
получить запись первой покупки ,сделанной в мае 1982 года.

type
     INVOICE = record
        case integer of
        1:(INV_NUM     : string(5);
          DATE_OF_SALE : string(6);
          CUST_NUM     : string(5);
          TOTAL_PRICE  : string(8));
        2:(ALL         : string(26));
       end;
   var
      DATA_LEN    : integer;
      DATA_BUF    : INVOICE;
      KEY_BUF     : string(6);
      POS_BLOCK   : string(128);
      STATUS      : integer;
    begin
   DATA_LEN:=sizeof(DATA_BUF);
   KEY_BUF:='050182';         {поиск начинается 1 мая 1982 года}

    STATUS:=BTRV(B_GET_GE,POS_BLOCK,DATA_BUF.ALL,DATA_LEN,KEY_BUF,1);
    if STATUS<>0 then
       writeln(OUTPUT,'Ошибка чтения файла.КОД=',STATUS) ;
    else
       writeln(OUTPUT,'Первая покупка в мае была сделана', DATA_BUF.TOTAL_PRICE);

После выполнение команды GET GREATER OR EQUAL  BTRIEVE установит
текущую позицию как показано на рисунке:












     201/Rev1.00                                              C-14



                                   Пример программ для Pascal
-------------------------------------------------ДД

---------------------------------------------
I 03110   I 041582  I 11315  I 0018400      I
---------------------------------------------
I 03111   I 042882  I 34800  I 0009600      I
---------------------------------------------
I 03112   I 042882  I 51428  I 0012456      I   <--- предыдущая
---------------------------------------------        запись
I 03113   I 050282  I 65541  I 0003645      I   <--- текущая
---------------------------------------------        запись
I 03114   I 050282  I 14367  I 0009872      I   <--- следующая
---------------------------------------------        запись
I 03115   I 051682  I 15699  I 0057599      I
---------------------------------------------
                 ^
                 I
                 I
             путь доступа


GET LAST  в языке PASCAL

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

type
     EMP_REC = record
        case integer of
        1:(EMP_NUM     : string(6);
          EMP_NAME     : string(20);
          EMP_DEPT     : string(2);
          EMP_TOT_COM  : string(6);
          EMP_CUR_COM  : string(6));
        2:(ENTIRE      : string(40));
       end;
   var
      BUF_LEN     : integer;
      DATA_BUF    : EMP_REC;
      KEY_BUF     : string(6);
      POS_BLOCK   : string(128);
      STATUS      : integer;
    begin
    BUF_LEN:=sizeof(DATA_BUF);
    STATUS:=BTRV(B_GET_LAST,POS_BLK,DATA_BUF.ENTIRE,BUF_LEN,KEY_BUF,1);
    if STATUS<>0 then
       writeln(OUTPUT,'Ошибка чтения файла.КОД=',STATUS) ;
    else
       writeln(OUTPUT,'Служащий с большим комиссионным вознаграждением',
        DATA_BUF.EMP_NAME);

После выполнение команды GET LAST  BTRIEVE установит текущую
позицию как показано на рисунке:







     201/Rev1.00                                              C-15



Управление записями Btrieve
-------------------------------------------------ДД

-----------------------------------------------
I 704904 I Brook,Wendy W.   I A1  I 110.95    I
-----------------------------------------------
I 831469 IRoss,John L.      I A5  I 240.80    I
-----------------------------------------------
I 876577 IBlanid,Kathleen M.I A3  I 562.75    I <--- предыдущая
-----------------------------------------------      запись
I 528630 IBrandes,Maureen R. I A5 I 935.45    I <--- текущая
-----------------------------------------------      запись
                                                <--- следующая
                                         ^              запись
                                         I
                                         I
                                    путь доступа


GET LESS THEN в языке PASCAL

Следующий пример показывает,как прикладная программа использует
команду GET LESS THEN , чтобы найти имена всех подписчиков,
которые получили журналы менее 3 раз перед тем,как прервали
подписку. Число оставшихся выпусков - ключ 2 в файле подписки.

type
      SUBSCRIPTION = record
        case integer of
        1:(CUST_NAME      : string(20);
          DATE_SUBSCRIBED : string(6);
          DATE_PAUD       : string(6));
          ISSUE_PURCH     : string(3);
          ISSUE_REMAIN    : string(3));
        2:(ENTIRE         : string(40));
       end;
   var
      BUF_LEN     : integer;
      DATA_BUF    : SUBSCRIPTION;
      KEY_BUF     : string(3);
      POS_BLOCK   : string(128);
      STATUS      : integer;
    begin
   BUF_LEN:=sizeof(DATA_BUF);
   KEY_BUF:='003;         {начало поиска меньше 3}

   STATUS:=BTRV(B_GET_LT,POS_BLOCK,DATA_BUF.ENTIRE,BUF_LEN,KEY_BUF,2);
    if STATUS<>0 then
      begin;
       writeln(OUTPUT,'Ошибка чтения файла.КОД=',STATUS) ;
       return;
      end;
  while  STATUS<>EOF_ERR do            {читать до конца  файла}
      begin;
       writeln(OUTPUT,'Послано ',DATA_BUF,CUST_NAME);
       STATUS:=BTRV(B_GET_PREV,POS_BLOCK,DATA_BUF.ENTIRE,BUF_LEN,KEY_BUF,2);
       return;
      end;





     201/Rev1.00                                              C-16



                                   Пример программ для Pascal
-------------------------------------------------ДД

  if (STATUS<>0) and (STATUS<>EOF_ERR) then
     begin
       writeln(OUTPUT,'Ошибка чтения файла.КОД=',STATUS) ;
       return;
      end;
   end;


GET LESS THEN OR EQUAL в языке PASCAL

В следующем примере прикладная программа использует команду GET
LESS THEN OR EQUAL , чтобы определить первый дом, который
продается по цене в пределах 110,000 долларов.

type
      HOME = record
        case integer of
        1:(PRICE          : string(7);
          ADDRESS         : string(20);
          SQUARTE_FEET    : string(6);
          YEAR_BUILT      : string(4));
        2:(ALL            : string(38));
       end;
   var
      DATA_LEN    : integer;
      DATA_BUF    : HOME;
      KEY_BUF     : string(3);
      POS_BLOCK   : string(128);
      PRICE_KEY   : string(70;
      STATUS      : integer;
    begin
   DATA_LEN:=sizeof(DATA_BUF);
   PRICE_KEY:='0110000';        {начало поиска со 110,000}

   STATUS:=BTRV(B_GET_LE,POS_BLOCK,DATA_BUF.ALL,DATA_LEN,PRICE_KEY,0);
    if STATUS<>0 then
       writeln(OUTPUT,'Ошибка чтения файла.КОД=',STATUS) ;
                 else
       writeln(OUTPUT,'Дом по ',DATA_BUF.ADDRESS,'продается за ', DATA_BUF.PRICE);

После выполнение команды GET LESS OR EQUAL  BTRIEVE установит
текущую позицию как показано на рисунке:

-----------------------------------------------
I 0050000 I 330 N.31         I 002200  I 1960 I
-----------------------------------------------
I 0055000 I 11132 Maple Ave. I 002000  I 1965 I
-----------------------------------------------
I 0070000 I 604 Church StreetI 002300  I 1968 I <--- предыдущая
-----------------------------------------------      запись
I 0105000 I 3517 N.Lakes Ave.I 002500  I 1975 I <--- текущая
-----------------------------------------------      запись
I 0220000 I 4500 Oceanfront AI 003000  I 1980 I <--- следующая
-----------------------------------------------        запись
       ^
       I
       I
    путь доступа


     201/Rev1.00                                              C-17



Управление записями Btrieve
-------------------------------------------------ДД

GET NEXT в языке PASCAL

В следующем примере прикладная программа использует команду GET
NEXT ,чтобы напечатать почтовые ярлыки, отсортированные по
индексу.Индекс   - первый ключ в файле.

type
      ADDRESS_REC  = record
        case integer of
        1:(NAME           : string(20);
          STREET          : string(20);
          CITY            : string(10);
          STATE           : string(2);
          ZIP             : string(5));
        2:(ENTIRE         : string(58));
       end;
   var
      DATA_LEN    : integer;
      DATA_BUF    : ADDRESS_REC;
      POS_BLOCK   : string(128);
      PRINTER     : text;
      STATUS      : integer;
      ZIP_KEY     : string(5);
    begin
     ASSIGN(PRINTER,'LPT1');     { инициализация принтера }
     REWRITE(PRINTER);
   DATA_LEN:=sizeof(DATA_BUF);
   STATUS:=BTRV(B_GET_FIRST,POS_BLOCK,DATA_BUF.ENTIRE,DATA_LEN,ZIP_KEY,1);
    if STATUS<>0 then
      begin;
       writeln(OUTPUT,'Ошибка чтения адреса файла.КОД=',STATUS) ;
       return;
      end;
   with DATA_BUF do
  while  STATUS<>EOF_ERR do            {читать до конца файла}
      begin;
       page(PRINTER);
       writeln(PRINTER,NAME);          {печать имени }
       writeln(PRINTER,STREET);        {печать улицы}
       writeln(PRINTER,CITY,',',STATE,' ',ZIP);     {печать города, штата,индекса}
  STATUS:=BTRV(B_GET_NEXT,POS_BLOCK,DATA_BUF.ENTIRE,DATA_LEN,ZIP_KEY,1);
  if (STATUS<>0) and (STATUS<>EOF_ERR) then
     begin
       writeln(OUTPUT,'Ошибка чтения адреса файла.КОД=',STATUS) ;
       return;
      end;
   end;


GET POSITION в языке PASCAL

Следующий пример показывает ,как команда GET POSITION может быть
использована для создания внешнего индекса существующего файла
BTRIEVE.Kогда внешний индекс создан,прикладная программа может
читать файл внешнего индекса снизу до верху и использовать
команду GET DIRECT , чтобы отсортировать записи в файле BTRIEVE
по полям ,которые были ранее были об'явлены ключевыми полями.



     201/Rev1.00                                              C-18



                                   Пример программ для Pascal
-------------------------------------------------ДД

type
      ADDR_REC  = record
        case integer of
        1:(NAME           : string(20);
          STREET          : string(20);
          CITY            : string(10);
          STATE           : string(2);
          ZIP             : string(5));
        2:(REC_POS        : string(4));
        3:(ENTIRE         : string(57));
       end;
  type
      INDX_REC  = record
        case integer of
        1:(INDX_POS       : string(4);
          INDX_STATE      : string(2));
        2:(ENTIRE         : string(6));
       end;
   var
      FILE_LEN    : integer;
      FILE_DATA   : ADDR_REC;
      FILE_POS    : string(128);
      INDX_DATA   : INDX_REC;
      INDX_LEN    : integer;
      INDX_POS    : string(128);
      NAME_KEY    : string(2);
      STATUS      : integer;
    begin
   FILE_LEN:=sizeof(FILE_DATA);
   INDX_LEN:=sizeof(INDX_DATA);
   STATUS:=BTRV(B_GET_FIRST,FILE_POS,FILE_DATA.ENTIRE,FILE_LEN,NAME_KEY,0);
    if   STATUS<>EOF_ERR do            {читать до конца файла}
    begin
    if STATUS<>0 then
      begin;
       writeln(OUTPUT,'Ошибка чтения  файла.КОД=',STATUS) ;
       return;
      end;
   INDX_DATA.INDX_STATE:=FILE_DATA.STATE;
   STATUS:=BTRV(B_GET_POS,FILE_POS,FILE_DATA.ENTIRE,FILE_LEN,NAME_KEY,0);
   INDX_DATA.INDX_POS:=FILE_DATA.REC_POS;
  STATUS:=BTRV(B_INSERT,INDX_POS,INDX_DATA.ENTIRE,INDX_LEN,STATE_KEY,0);
  if (STATUS<>0) then
     begin
       writeln(OUTPUT,'Ошибка включения адреса файла.КОД=',STATUS) ;
       return;
      end;
   STATUS:=BTRV(B_GET_next,FILE_POS,FILE_DATA.ENTIRE,FILE_LEN,NAME_KEY,0);
   end;


GET PREVIOUS в языке PASCAL

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


     201/Rev1.00                                              C-19



Управление записями Btrieve
-------------------------------------------------ДД


type
      COMPANY_REC  = record
        case integer of
        1:(NAME           : string(30);
          TOTAL_SALES     : string(10);
        2:(ALL            : string(40));
       end;
   var
      DATA_LEN    : integer;
      DATA_BUF    : COMPANY_REC;
      POS_BLOCK   : string(128);
      SALES_KEY   : string(10);
      STATUS      : integer;
    begin
   DATA_LEN:=sizeof(DATA_BUF);
   STATUS:=BTRV(B_GET_LAST,POS_BLOCK,DATA_BUF.ALL,DATA_LEN,SALES_KEY,1);
    if STATUS<>0 then
      begin;
       writeln(OUTPUT,'Ошибка чтения адреса файла.КОД=',STATUS) ;
       return;
      end;
   with DATA_BUF do
    while  STATUS<>EOF_ERR do
      begin;
       writeln(OUTPUT,DATA_BUF.NAME,DATA_BUF.TOTAL_SALES);
       STATUS:=BTRV(B_GET_PREV,POS_BLOCK,DATA_BUF.ALL,DATA_LEN,SALES_KEY,1);
       if (STATUS<>0) and (STATUS<>EOF_ERR) then
          begin
            writeln(OUTPUT,'Ошибка чтения файла.КОД=',STATUS) ;
            return;
         end;
      end;


INSERT  в языке PASCAL

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

type
          EMP_REC  = record
        case integer of
        1:(NAME           : string(20);
          HIRE_DATE       : string(6);
          ANNUAL_SAL      : string(6));
        2:(ENTIRE         : string(32));
       end;
   var
      DATA_LEN    : integer;
      DATA_BUF    : EMP_REC;
      POS_BLOCK   : string(128);
      KEY_BUF     : string(20);
      STATUS      : integer;





     201/Rev1.00                                              C-20



                                   Пример программ для Pascal
-------------------------------------------------ДД

    begin
    with DATA_BUF do
       begin
         NAME:='Jones,Mary E';
         HIRE_DATE:='120882';
         ANNUAL_SAL:='020000';
       end;
   DATA_LEN:=sizeof(DATA_BUF);
   STATUS:=BTRV(B_INSERT,POS_BLOCK,DATA_BUF.ENTIRE,DATA_LEN,KEY_BUF,0);
    if STATUS<>0 then
      begin;
       writeln(OUTPUT,'Код BTRIEVE=',STATUS) ;

После выполнения команды INSERT текущая позиция в файле BTRIEVE
будет следующая:

--------------------------------------
I Adams,David H.  I 150781  I 030000 I
-------------------------------------
I Broun,William J.I 010581  I 055000 I  <--- предыдущая
--------------------------------------        запись
I Jones,Mary E.   I 120882  I 020000 I  <--- текущая
--------------------------------------        запись
I Smith,Bruce L.  I 100182  I 040000 I  <--- следующая
--------------------------------------       запись
                    ^
                    I
                    I
               путь доступа


OPEN    в языке PASCAL

Следующий пример показывает,как открыть файл BTRIEVE из программы
на языке PASCAL.

var
      BUF_LEN     : integer;
      DATA_BUF    : string(92);
      POS_BLOCK   : string(128);
      FILE_NAME   : string(20);
      STATUS      : integer;
  begin
    FILE_NAME:='C:\DATA\EMPLOYE.BTR';
    STATUS:=BTRV(B_OPEN,POS_BLOCK,DATA_BUF,BUF_LEN,FILE_NAME,0);
    if STATUS<>0 then
       writeln(OUTPUT,'Код BTRIEVE=',STATUS) ;
  end;


SET DIRECTORY в языке PASCAL

В cледующем примере прикладная программа устанавливает текущую
директорию перед тем ,как выполнить команду OPEN.






     201/Rev1.00                                              C-21



Управление записями Btrieve
-------------------------------------------------ДД


type
      ADDRESS_REC  = record    {Структура файла адресов }
        case integer of
        1:(NAME           : string(30);
          STREET          : string(30);
          CITY            : string(30);
          STATE           : string(2);
          ZIP             : string(5));
        2:(ENTIRE         : string(98));
       end;
   var
      BUF_LEN     : integer;
      DATA_BUF    : ADDRESS_REC;
      DIR_PATH    : string(6);
      FILE_NAME   : string(14);
      KEY_BUF     : string(30);
      POS_BLOCK   : string(128);
      STATUS      : integer;
   begin
    BUF_LEN:=sizeof(DATA_BUF);
    DIR_PATH:='DATA';
    DIR_PATH[6]:=chr(0);
    STATUS:=BTRV(B_SET_DIR,POS_BLOCK,DATA_BUF.ENTIRE,BUF_LEN,FILE_NAME,0);
    if STATUS<>0 then
      begin;
       writeln(OUTPUT,'Ошибка во время установки текущей директории.
               КОД=',STATUS) ;
       return;
      end;
    FILE_NAME:='ADDRESS.BTR';
    STATUS:=BTRV(B_OPEN,POS_BLOCK,DATA_BUF.ENTIRE,BUF_LEN,FILE_NAME,0);
    if STATUS<>0 then
      begin;
       writeln(OUTPUT,'Ошибка чтения  файла.КОД=',STATUS) ;
       return;
      end;


STAT  в языке PASCAL

В следующем примере прикладная программа использует команды STAT
и CREATE ,чтобы почистить файл BTRIEVE.

type
     byte_type=0..255;
     KEY_SPEC=record
       KEY_POS     : integer;
       KEY_LEN     : integer;
       KEY_FLAGS   : integer;
       NOT_USED    : string(4);
       KEY_RSV     : array[1..6] of byte_type; {выравнивание слова}
       end;







     201/Rev1.00                                              C-22



                                   Пример программ для Pascal
-------------------------------------------------ДД

    FILE_SPEC=record
     case integer of
     1:  (REC_LEN     : integer;
         PAGE_SIZE    : integer;
         NDX_CNT      : integer;
         NOT_USED     : string(4);
         VARIABLE     : integer;
         RESERVED     : string(2);
         PRE_ALLOC    : integer;
         KEY_BUF      : array[1..2] of KEY_SPEC);
     2:  (SPEC_BUF   : integer);
     end;
   var
      DATA_BUF    : string(440;
      DATA_BUF_LEN: integer;
      FILE_BUF    : FILE_SPEC;
      FILE_BUF_LEN: integer;
      FILE_NAME   : string(14);
      KEY_BUF     : string(64);
      POS_BLK     : string(128);
      STATUS      : integer;
    begin
   DATA_BUF_LEN:=sizeof(DATA_BUF);
   FILE_BUF_LEN:=sizeof(FILE_BUF);
   FILE_NAME:=LEDGER.BTR;
   STATUS:=BTRV(B_OPEN,POS_BLK,DATA_BUF,DATA_BUF_LEN,FILE_NAME,0);
    if STATUS<>0
    then
       begin
       writeln(OUTPUT,'Ошибка открытия файла.Код = ',STATUS) ;
       return;
       end;
    STATUS:=BTRV(B_STAT,POS_BLK,FILE_BUF.SPEC_BUF,FILE_BUF_LEN,0);
    if STATUS<>0
    then
       begin
       writeln(OUTPUT,'Ошибка поиска   файла.Код = ',STATUS) ;
       return;
       end;
    STATUS:=BTRV(B_CLOSE,POS_BLK,DATA_BUF,DATA_BUF_LEN,FILE_NAME,0);
    if STATUS<>0
    then
       begin
       writeln(OUTPUT,'Ошибка закрытия файла.Код = ',STATUS) ;
       return;
       end;
   FILE_BUF_LEN:=sizeof(FILE_BUF);
   STATUS:=BTRV(B_CREATE,POS_BLK,FILE_BUF.SPEC_BUF,FILE_BUF_LEN,FILE_NAME,0);
    if STATUS<>0
      then
       writeln(OUTPUT,'Ошибка создания файла.Код = ',STATUS) ;
      else
       writeln(OUTPUT,'Успешная чистка файла.) 







     201/Rev1.00                                              C-23



Управление записями Btrieve
-------------------------------------------------ДД

STEP FIRST  в языке PASCAL

Смотри  STEP NEXT.


STEP LAST   в языке PASCAL

Смотри  STEP PREVIOUS.


STEP NEXT  в языке PASCAL

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

type
     EMP_REC=record;
     case integer of
     1:  (NUM         : string(6);
         NAME         : string(30);
         ADDR         : string(50));
     2:  (ENTIRE      : integer(86));
     end;
   var
      BUF_LEN     : integer;
      OLD_BUF     : EMP_REC;
      OLD_KEY     : string(6);
      OLD_POS     : string(128);
      NEW_BUF     : EMP_REC;
      NEW_KEY     : string(6);
      NEW_POS     : string(128);
      STATUS      : integer;
  begin
    BUF_LEN:=sizeof(OLD_BUF);
    STATUS:=BTRV(B_STEP_FST,OLD_POS,OLD_BUF.ENTIRE,BUF_LEN,OLD_KEY,0);
    while STATUS<>EOF_ERR do               {читать до конца файла}
     if STATUS<>0
      then
       begin
        writeln(OUTPUT,'Ошибка чтения   файла.Код = ',STATUS) ;
        return;
       end;
  NEW_BUF.NUM:=OLD_BUF.NUM;
  NEW_BUF.NAME:=OLD_BUF.NAME;
  NEW_BUF.ADDR:=OLD_BUF.ADDR;
  STATUS:=BTRV(B_INSERT,NEW_POS,NEW_BUF.ENTIRE,BUF_LEN,NEW_KEY,0);
    if STATUS<>0
     then
       begin
        writeln(OUTPUT,'Ошибка включения файла.Код = ',STATUS) ;
        return;
       end;
       STATUS:=BTRV(B_STEP_NXT,OLD_POS,OLD_BUF.ENTIRE,BUF_LEN,OLD_KEY,0);
end;





     201/Rev1.00                                              C-24



                                   Пример программ для Pascal
-------------------------------------------------ДД

STEP PREVIOUS  в языке PASCAL

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

type
     EMP_REC=record
     case integer of
     1:  (NUM         : string(6);
         NAME         : string(30);
         ADDR         : string(50));
     2:  (ENTIRE      : integer(86));
     end;
   var
      BUF_LEN     : integer;
      OLD_BUF     : EMP_REC;
      OLD_KEY     : string(6);
      OLD_POS     : string(128);
      NEW_BUF     : EMP_REC;
      NEW_KEY     : string(6);
      NEW_POS     : string(128);
      STATUS      : integer;
   begin
     BUF_LEN:=sizeof(OLD_BUF);
     STATUS:=BTRV(B_STEP_LST,OLD_POS,OLD_BUF.ENTIRE,BUF_LEN,OLD_KEY,0);
     while STATUS<>EOF_ERR do           {читать до конца файла  }
       begin
       if STATUS<>0
         then
           begin
            writeln(OUTPUT,'Ошибка чтения   файла.Код = ',STATUS) ;
            return;
           end;
     NEW_BUF.NUM:=OLD_BUF.NUM;
     NEW_BUF.NAME:=OLD_BUF.NAME;
     NEW_BUF.ADDR:=OLD_BUF.ADDR;
     STATUS:=BTRV(B_INSERT,NEW_POS,NEW_BUF.ENTIRE,BUF_LEN,NEW_KEY,0);
     if STATUS<>0
       then
         begin
           writeln(OUTPUT,'Ошибка включения файла.Код = ',STATUS) ;
           return;
         end;
     STATUS:=BTRV(B_STEP_PREV,OLD_POS,OLD_BUF.ENTIRE,BUF_LEN,OLD_KEY,0);
end;


UPDATE  в языке PASCAL

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







     201/Rev1.00                                              C-25



Управление записями Btrieve
-------------------------------------------------ДД


type
          EMP_REC  = record
        case integer of
        1:(NAME           : string(20);
          HIRE_DATE       : string(6);
          ANNUAL_SAL      : string(6));
        2:(ALL            : string(32));
       end;
   var
      DATA_LEN    : integer;
      DATA_BUF    : EMP_REC;
      POS_BLK     : string(128);
      KEY_BUF     : string(20);
      STATUS      : integer;
 begin
   DATA_LEN:=sizeof(DATA_BUF);
   NAME_KEY:='Jones,Mary E';
   STATUS:=BTRV(B_GET_EQ,POS_BLK,DATA_BUF.ALL,DATA_LEN,NAME_KEY,0);
    if STATUS<>0 then
      begin;
       writeln(OUTPUT,'Код BTRIEVE=',STATUS) ;
       return;
      end;
    DATA_BUF.ANNUAL_SAL:='025000';
    STATUS:=BTRV(B_UPDATE,POS_BLK,DATA_BUF.ALL,DATA_LEN,NAME_KEY,0);
    if STATUS<>0 then
      begin;
       writeln(OUTPUT,'Код BTRIEVE=',STATUS);

После выполнения команды UPDATE текущая позиция в файле BTRIEVE
будет следующая:

--------------------------------------
I Adams,David H.  I 150781  I 030000 I
--------------------------------------
I Broun,William J.I 010581  I 055000 I  <--- предыдущая
--------------------------------------        запись
I Jones,Mary E.   I 120882  I 025000 I  <--- текущая
-------------------------------------        запись
I Smith,Bruce L.  I 100182  I 040000 I  <--- следующая
--------------------------------------       запись
                    ^
                    I
                    I
               путь доступа














     201/Rev1.00                                              C-26


69
                                   Пример программ для СOBOL
-------------------------------------------------ДД

ПРИЛОЖЕНИЕ D:
ПРИМЕРЫ НА ЯЗЫКЕ COBOL
-------------------------------------------------

Следующие примеры показывают ,как вызывать BTRIEVE из прикладных
програм,написанных на языке COBOL. В примерах представлены все
команды BTRIEVE.


ABORT TRANSACTION в языке COBOL

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


   DATA DIVISION.
   WORKING-STORAGE SECTION.
   77 B-ABORT      PIC 99 COMP-0 VALUE 21.
   77 B-BEGIN      PIC 99 COMP-0 VALUE 19.
   77 B-END        PIC 99 COMP-0 VALUE 20.
   77 B-INSERT     PIC 99 COMP-0 VALUE 2.
   77 B-OPEN       PIC 99 COMP-0 VALUE 0.
   77 KEY-NUM      PIC 99 COMP-0 VALUE 0.
   01 B-STATUS     PIC 99 COMP-0.
   01 DSP-STATUS   PIC 99999.
   01 HDR-BUFFER.
      02 HDR-ORD-NUM PIC 99 COMP-0.
      02 HDR-CUST    PIC 99 COMP-0.
      02 HDR-DATE    PIC X(6).
   01 DET-BUFFER.
      02 HDR-ORD-NUM PIC 99 COMP-0.
      02 HDR-PART    PIC 99 COMP-0.
      02 HDR-QUAN    PIC 99 COMP-0.
   01 DET-KEY        PIC 99 COMP-0.
   01 DET-LEN        PIC 99 COMP-0 VALUE 6.
   01 DET-POS-BLK    PIC X(128).
   01 DUMY-BUF       PIC X(128).
   01 DUMY-LEN       PIC 99 COMP-0 VALUE 128.
   01 HDR-KEY        PIC 99 COMP-0.
   01 HDR-LEN        PIC 99 COMP-0 VALUE 10.
   01HDR-POS-BLK     PIC X(128).
   PROCEDURE DIVISION.
   BEGIN.
   * Начало транзакции
   CALL'BTRV'USING B-BEGIN,B-STATUS,DUMY-BUF,DUMY-BUF, DUMY-LEN,DUMY-BUF,KEY-NUM.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY(5,1)"Ошибка начала транзакции.Код=" DSP-STATUS
         STOP RUN
   * Включение записи в основной файл
         MOVE 236 TO HDR_ORD_NUM.
         MOVE 201 TO HDR_CUST.
         MOVE "061538" TO HDR_DATE.
   CALL'BTRV'USING B-INSERT,B-STATUS,HDR-POS-BLK, HDR-BUFFER,HDR-LEN,HDR-KEY,KEY-NUM.


     201/Rev1.00                                              D-1



Управление записями Btrieve
-------------------------------------------------ДД

   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY(5,1)"Ошибка включения записи в основной файл. Код="DSP-STATUS
         STOP RUN
  * Включение 2 записей в файл деталей
         MOVE 236 TO DET_ORD_NUM.
         MOVE 1002 TO DET_PART.
         MOVE 1 TO DET_QUAN.
   CALL'BTRV'USING B-INSERT,B-STATUS,DET-POS-BLK, DET-BUFFER,DET-LEN,DET-KEY,KEY-NUM.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка включения записи в Файл деталей.Код="DSP-STATUS
   CALL'BTRV'USING B-ABORT,B-STATUS,DUMY-BUF, DUMY-BUF,DUMY-LEN,DUMY-BUF,KEY-NUM.
         STOP RUN
         MOVE 1024 TO DET-PART.
         MOVE 1 TO DET-QUAM.
   CALL'BTRV'USING B-INSERT,B-STATUS,DET-POS-BLK, DET-BUFFER,DET-LEN,DET-KEY,KEY-NUM.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY(5,1)"Ошибка включения записи в файл деталей. Код="DSP-STATUS
   CALL'BTRV'USING B-ABORT,B-STATUS,DUMY-BUF, DUMY-BUF,DUMY-LEN,DUMY-BUF,KEY-NUM.
         STOP RUN
*
*  Конец транзакции
*


BEGIN TRANSACTION в языке COBOL

Смотри ABORT TRANSACTION и END TRANSACTION

CLOSE в языке COBOL

Следующий пример показывает ,как закрыть файл BTRIEVE из языка
COBOL .

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   77 B-CLOSE      PIC 99 COMP-0 VALUE 1.
   77 NAME-KEY     PIC 99 COMP-0 VALUE 0.
   77 B-STATUS     PIC 99 COMP-0.
   01 BUF-LEN      PIC 99 COMP-0 VALUE 80.
   01 DATA-BUFFER  PIC X(80).
   01 DSP-STATUS   PIC 99999.
   01 KEY-BUFFER   PIC X(30).
   01 POSITION-BLOCK PIC X(128).
   PROCEDURE DIVISION.

   BEGIN.
   CALL'BTRV'USING B-CLOSE,B-STATUS,POSITION-BLOCK, DATA-BUFFER,BUF-LEN,KEY-BUFFER,NAME-KEY.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"BTRIEVE код="DSP-STATUS
         STOP RUN






     201/Rev1.00                                              D-2



                                   Пример программ для СOBOL
-------------------------------------------------ДД

CREATE в языке COBOL

В следующем примере прикладная программа создает файл BTRIEVE c
двумя ключами.Ключ 0 - целое 2-байтное число.Ключ 1 допускает
дубликаты,может быть модифицирован,состоит из двух сегментов.
Первый сегмент - 2-байтовая строка - отсортирован в порядке
убывания,второй сегмент - заканчивающаяся нулями 30-байтовая
строка .Записи фиксированной длины,размерностью 80.

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   77 DUPLICATES   PIC 9 COMP-0 VALUE 1.
   77 MODIFIABLE   PIC 9 COMP-0 VALUE 2.
   77 SEGMENTED    PIC 99 COMP-0 VALUE 16.
   77 DESCSERT     PIC 99 COMP-0 VALUE 64.
   77 EXTTYPE      PIC 999 COMP-0 VALUE 256.
   77 B-INTEGER    PIC 9 COMP-0 VALUE 1.
   77 B-STRING     PIC 9 COMP-0 VALUE 0.
   77 B-ZSTRING    PIC 99 COMP-0 VALUE 11.
   77 B-CREATER    PIC 99 COMP-0 VALUE 14.
   77 KEY-NUMBER   PIC 99 COMP-0 VALUE 0.
   77 B-STATUS     PIC 99 COMP-0 VALUE 0.
   01 BUF-LEN      PIC 99 COMP-0 VALUE 64.
   01 DSP-STATUS   PIC 99999.

   01 DATA-BUFFER.
      02 RECORD-LENGTH    PIC 99 COMP-0 VALUE 80.
      02 PAGE-SIZE        PIC 9(4) COMP-0 VALUE 1024.
      02 NUMBER-OF-INDEXES PIC 99 COMP-0 VALUE 2.
      02 NOT-USED-1       PIC X(4).
      02 VAR-REC-LEN      PIC 99 COMP-0 VALUE 0.
      02 NOT-USED-1A      PIC X(2).
      02 PRE-ALLOC        PIC 99 COMP-0 VALUE 0.
      02 KEY SPECS OCCURS 3 TIMES.
         05 KEY-POSITION  PIC 99 COMP-0.
         05 KEY-LENGTH    PIC 99 COMP-0.
         05 KEY-FLAG      PIC 99 COMP-0.
         05 NOT-USED-2    PIC X(4).
         05 KEY-TYPE      PIC 9 COMP-0 VALUE 0.
         05 FILLER        PIC X(5).
   01 FILE-NAME    PIC X(17) VALUE "\data\create.tst"
   01 POSITION-BLOCK PIC X(128)VALUE SPACES.
   PROCEDURE DIVISION.
   BEGIN.
         MOVE 64 TO BUF-LEN.
         MOVE 1 TO KEY-POSITION(1).
         MOVE 2 TO KEY_LENGTH(1).
         MOVE EXTTYPE TO KEY_FLAG(1).
         MOVE B-INTEGER TO KEY_TYPE(1).
         MOVE 3 TO KEY_POSITION(2).
         MOVE 2 TO KEY_LENGTH(2).
         ADD DUPLICATES MODIFIABLE SEGMENTED EXTTYPE DESC GIVING KEY-FLAG(2)
         MOVE B-STRING TO KEY_TYPE(2).
         MOVE 5 TO KEY_POSITION(3).
         MOVE 30 TO KEY_LENGTH(3).
         ADD DUPLICATES MODIFIABLE EXTTYPE DESC GIVING KEY-FLAG(3)
   CALL'BTRV'USING B-CREATE,B-STATUS,POSITION-BLOCK,DATA-BUFFER,BUF-LEN,FILE-NAME,KEY-NUMBER.



     201/Rev1.00                                              D-3



Управление записями Btrieve
-------------------------------------------------ДД

   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка создания Файла. Код="DSP-STATUS


CREATE SUPPLEMENTAL INDEX в языке COBOL

В следующем примере прикладная программа добавляет индекс в файл
BTRIEVE.Первый сегмент ключа - 10-байтовая сторка.Он может быть
модифицирован и допускает дубликаты.Второй сегмент 2-байтовое
целое число.

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   77 DUPLICATES   PIC 9 COMP-0 VALUE 1.
   77 MODIFIABLE   PIC 9 COMP-0 VALUE 2.
   77 SEGMENTED    PIC 99 COMP-0 VALUE 16.
   77 EXTTYPE      PIC 999 COMP-0 VALUE 256.
   77 B-INTEGER    PIC 9 COMP-0 VALUE 1.
   77 B-STRING     PIC 9 COMP-0 VALUE 0.
   77 B-OPEN       PIC 99 COMP-0 VALUE 0.
   77 B-CLOSE      PIC 99 COMP-0 VALUE 1.
   77 KEY-NUMBER   PIC 99 COMP-0 VALUE 0.
   77 B-STATUS     PIC 99 COMP-0 VALUE 0.
   01 BUF-LEN      PIC 99 COMP-0 VALUE 64.
   01 DSP-STATUS   PIC 99999.

   01 DATA-BUFFER.
      02 KEY SPECS OCCURS 2 TIMES.
         05 KEY-POSITION  PIC 99 COMP-0.
         05 KEY-LENGTH    PIC 99 COMP-0.
         05 KEY-FLAG      PIC 99 COMP-0.
         05 NOT-USED-2    PIC X(4).
         05 KEY-TYPE      PIC 9 COMP-0 VALUE 0.
         05 FILLER        PIC X(5).
   01 FILE-NAME    PIC X(17) VALUE "\data\create.tst"
   01 POSITION-BLOCK PIC X(128)VALUE SPACES.
   PROCEDURE DIVISION.
   BEGIN.
         MOVE 32 TO BUF-LEN.
   CALL'BTRV'USING B-OPEN,B-STATUS,POSITION-BLOCK,DATA-BUFFER,BUF-LEN,FILE-NAME,KEY-NUMBER.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка открытия Файла. Код="DSP-STATUS
          STOP RUN
         MOVE 32 TO BUF-LEN.
         MOVE 40 TO KEY-POSITION(1).
         MOVE 10 TO KEY_LENGTH(1).
         ADD DUPLICATES MODIFIABLE SEGMENTED EXTTYPE GIVING KEY-FLAG(2).
         MOVE B-STRING TO KEY_TYPE(1).
         MOVE 50 TO KEY_POSITION(2).
         MOVE 2 TO KEY_LENGTH(2).
         ADD DUPLICATES MODIFIABLE EXTTYPE GIVING KEY-FLAG(2).
         MOVE B-INTEGER TO KEY_TYPE(2).
   CALL'BTRV'USING B-CREIDX,B-STATUS,POSITION-BLOCK,DATA-BUFFER,BUF-LEN,FILE-NAME,KEY-NUMBER.





     201/Rev1.00                                              D-4



                                   Пример программ для СOBOL
-------------------------------------------------ДД

   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка во время добавления дополнительного индекса в файл.Код="DSP-STATUS
         STOP RUN


DELETE в языке COBOL

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

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   77 B-DELETE     PIC 99 COMP-0 VALUE 4.
   77 B-GET-EQUAL  PIC 99 COMP-0 VALUE 5.
   77 NAME-KEY     PIC 99 COMP-0 VALUE 0.
   77 B-STATUS     PIC 99 COMP-0.
   01 DISPLAY-STATUS PIC 99999.
   01 BUF-LEN      PIC 99 COMP-0 VALUE 30.
   01 RESERVSTION-RECORD.
      02 FLIGHT-NUMBER    PIC X(3).
      02 PASSANGER        PIC X(15).
      02 AMOUNT-PAID      PIC X(6).
      02 ISSUE-DATE       PIC X(6).
   01 KEY-BUFFER          PIC X(15).
   01 POSITION-BLOCK      PIC X(128).
   PROCEDURE DIVISION.
   BEGIN.
         MOVE "Martin,David H." TO KEY-BUFFER.
   CALL'BTRV'USING B-GET-EQUAL,B-STATUS,POSITION-BLOCK, RESERVATION-RECORD,BUF-LEN,KEY-BUFFER,NAME-KEY.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"BTRIEVE код="DSP-STATUS
          STOP RUN
   CALL'BTRV'USING B-DELETE,B-STATUS,POSITION-BLOCK, RESERVATION-RECORD,BUF-LEN,KEY-BUFFER,NAME-KEY.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"BTRIEVE код="DSP-STATUS
          STOP RUN

После выполнения DELETE текущее положение в файле BTRIEVE будет
следующее:

-------------------------------------------
і 326 і Grawley,Joe J.  і 179.85 і 061582 і
-------------------------------------------
і 711 і Howell,Susan    і 259.40 і 052382 і   <--- предыдущая
-------------------------------------------        запись
і 326 і Petersy,John H. і 445.80 і 061782 і   <--- следующая
-------------------------------------------        запись
і 840 і White,Rosemary  і 397.00 і 060282 і
-------------------------------------------
              ^
              і
              і
           путь доступа



     201/Rev1.00                                              D-5



Управление записями Btrieve
-------------------------------------------------ДД

DROP SUPPLEMENTAL INDEX в языке COBOL

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

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   77 B-DROP       PIC 99 COMP-0 VALUE 32.
   77 B-STATUS     PIC 99 COMP-0 VALUE 0.
   77 INV-KNUM     PIC 99 COMP-0 VALUE 6.
   01 BUF-LEN      PIC 99 COMP-0 VALUE 64.
   01 POSITION-BLOCK PIC X(128) VALUE SPACES.
   01 DSP-STATUS   PIC 99999.
   01 KEY-NUMBER   PIC 99 COMP-0 VALUE 3.
   01 DUMY-BUF     PIC X(2) VALUE SPACES.
   PROCEDURE DIVISION.
   BEGIN.
         MOVE 1 TO BUF-LEN.
   CALL'BTRV'USING B-DROP,B-STATUS,POSITION-BLOCK, DUMY-BUF,BUF-LEN,DUMY-BUF,KEY-NUMBER.
   IF B-STATUS = INV-KNUM
         DISPLAY"Номер ключа на уничтожение не является дополнительным индексом."
   ELSE
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка уничтоженияе дополнительногоиндекса.Код="DSP-STATUS
          STOP RUN
   IF B-STATUS NOT = 0
      IF B-STATUS = INV-KNUM
         DISPLAY"Номер ключа на уничтожение не является дополнительным индексом."
   ELSE
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка уничтоженияе дополнительного индекса.Код="DSP-STATUS
          STOP RUN


























     201/Rev1.00                                              D-6



                                   Пример программ для СOBOL
-------------------------------------------------ДД

END TRANSACTION в языке COBOL

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

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   77 B-ABORT      PIC 99 COMP-0 VALUE 21.
   77 B-BEGIN      PIC 99 COMP-0 VALUE 19.
   77 B-END        PIC 99 COMP-0 VALUE 20.
   77 B-GET-EQ     PIC 99 COMP-0 VALUE 5.
   77 B-OPEN       PIC 99 COMP-0 VALUE 0.
   77 B-UPDATE     PIC 99 COMP-0 VALUE 3.
   77 KEY-NUM      PIC 99 COMP-0 VALUE 0.
   01 B-STATUS     PIC 99 COMP-0.
   01 DSP-STATUS   PIC 99999.
   01 BUF-LEN      PIC 99 COMP-0 VALUE 47
   01 LEDGER-REC.
      02 ACCT-ID   PIC 9(5) COMP-0.
      02 DESCDATE  PIC X(40).
      02 BALANCE   PIC 9(8) COMP-3.
   01 KEY-BUF      PIC 9(5) COMP-0
   01 POS-BLK      PIC X(128).
   01 DUMY-BUF     PIC X(128).
   01 DUMY-LEN     PIC 99 COMP-0 VALUE 128.
   PROCEDURE DIVISION.
   BEGIN.
   * Начало транзакции
   CALL'BTRV'USING B-BEGIN,B-STATUS,DUMY-BUF,DUMY-BUF,DUMY-LEN,DUMY-BUF,KEY-NUM.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка начала транзакции.Код="DSP-STATUS
         STOP RUN
*  Нахождение и обновление записи денежных счетов
         MOVE 101 TO KEY-BUF.
   CALL'BTRV'USING B-GET-EQ,B-STATUS,POS-BLK,LEDGER-REC,BUF-LEN,KEY-BUF,KEY-NUM.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка получения записи.Код="DSP-STATUS
   CALL'BTRV'USING B-ABORT,B-STATUS,DUMY-BUF,DUMY-BUF,DUMY-LEN,DUMY-BUF,KEY-NUM.
         STOP RUN
         SUBSTRACT 250 FROM BALANCE.
   CALL'BTRV'USING B-UPDATE,B-STATUS,POS-BLK,LEDGER-REC,BUF-LEN,KEY-BUF,KEY-NUM.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка обновления записи.Код ="DSP-STATUS
   CALL'BTRV'USING B-ABORT,B-STATUS,DUMY-BUF,DUMY-BUF,DUMY-LEN,DUMY-BUF,KEY-NUM.
         STOP RUN
*
*  Нахождение и обновление записи  счетов затрат
*
         MOVE 511 TO KEY-BUF.
   CALL'BTRV'USING B-GET-EQ,B-STATUS,POS-BLK,LEDGER-REC
                              BUF-LEN,KEY-BUF,KEY-NUM.




     201/Rev1.00                                              D-7



Управление записями Btrieve
-------------------------------------------------ДД

   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка получения записи.Код="DSP-STATUS
   CALL'BTRV'USING B-ABORT,B-STATUS,DUMY-BUF,
                   DUMY-BUF,DUMY-LEN,DUMY-BUF,KEY-NUM.
         STOP RUN
         ADD 250 TO BALANCE.
   CALL'BTRV'USING B-UPDATE,B-STATUS,POS-BLK,LEDGER-REC,
                              BUF-LEN,KEY-BUF,KEY-NUM.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка обновления записи.Код ="DSP-STATUS
   CALL'BTRV'USING B-ABORT,B-STATUS,DUMY-BUF,
                   DUMY-BUF,DUMY-LEN,DUMY-BUF,KEY-NUM.
         STOP RUN
*
*  конец транзакции
*
   CALL'BTRV'USING B-END,B-STATUS,DUMY-BUF,DUMY-BUF,DUMY-LEN,DUMY-BUF,KEY-NUM.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка конца транзакции.Код ="DSP-STATUS
         STOP RUN


EXTEND  в языке COBOL

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

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   77 B-CLOSE      PIC 99 COMP-0 VALUE 1.
   77 B-EXTEND     PIC 99 COMP-0 VALUE 16.
   77 B-OPEN       PIC 99 COMP-0 VALUE 0.
   77 NAME-KEY     PIC 99 COMP-0 VALUE 0.
   01 B-STATUS     PIC 99 COMP-0.
   01 DSP-STATUS   PIC 99999.
   01 BUF-LEN      PIC 99 COMP-0 VALUE 97.
   01 DATA-BUFFER.
      02 NAME      PIC X(30).
      02 STREET    PIC X(30).
      02 CITY      PIC X(30).
      02 STATE     PIC X(2).
      02 ZIP       PIC 9(5).
   01 FILE-NAME    PIC X(14) VALUE "ADDRESS.BTR".
   01 EXT-NAME     PIC X(15) VALUE "B"\ADDRESS.EXT".
   01 KEY-BUFFER   PIC X(30).
   01 POSITION-BLOCK PIC (128) VALUE SPACES.
   PROCEDURE DIVISION.
   BEGIN.
   CALL'BTRV'USING B-OPEN,B-STATUS,POSITION-BLOCK,DATA-BUFFER,BUF-LEN,FILE-NAME,NAME-KEY.   .
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка открытия файла.Код="DSP-STATUS
         STOP RUN
   CALL'BTRV'USING B-EXTEND,B-STATUS,POSITION-BLOCK,DATA-BUFFER,BUF-LEN,FILE-NAME,NAME-KEY.


     201/Rev1.00                                              D-8



                                   Пример программ для СOBOL
-------------------------------------------------ДД

   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка расширения файла.Код = "DSP-STATUS
         STOP RUN
   CALL'BTRV'USING B-CLOSE,B-STATUS,POSITION-BLOCK,DATA-BUFFER,BUF-LEN,FILE-NAME,NAME-KEY.
   CALL'BTRV'USING B-OPEN,B-STATUS,POSITION-BLOCK,DATA-BUFFER,BUF-LEN,FILE-NAME,NAME-KEY.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка повторного открытия файла.Код="DSP-STATUS
   ELSE  DISPLAY"Файл успешно открыт повторно.Код = "DSP-STATUS);


GET DIRECT в языке COBOL

Следующий пример показывает как прикладная программа может
использовать команду GET DIRECT , чтобы отсортировать записи
в файле BTRIEVE по внешниму индексу.( Смотри описание GET
POSITION, где на примере показано ,как построить внешний индекс).

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   77 B-GET-DIRECT PIC 99 COMP-0 VALUE 23.
   77 B-GET-LOW    PIC 99 COMP-0 VALUE 12.
   77 B-NEXT       PIC 99 COMP-0 VALUE 6.
   77 KEY-NUMY     PIC 99 COMP-0 VALUE 0.
   77 B-STATUS     PIC 99 COMP-0.
      88 B-END     VALUE 9.
   01 DSP-STAT     PIC 99999.
   01 ADDR-REC.
      02 NAME      PIC X(20).
      02 STREET    PIC X(20).
      02 CITY      PIC X(10).
      02 STATE     PIC X(2).
      02 ZIP       PIC X(5).
   01 POS-BUF REDEFINES ADDR-REC.
   02 REC-POS      PIC X(4).
   01 FILE-LEN     PIC 99 COMP-0 VALUE 57.
   01 INDX-REC.
      02 INX-POS   PIC X(4).
      02 INX-STATE PIC X(2).
   01 INDX-LEN     PIC 99 COMP-0 VALUE 6.
   01 NAME-KEY     PIC X(20).
   01 STATE-KEY    PIC X(2).
   01 FILE-POS-BLK PIC X(128).
   01 INDX-POS-BLK PIC X(128).
   PROCEDURE DIVISION.
   BEGIN.
   CALL'BTRV'USING B-GET-LOW,B-STATUS,INDX-POS-BLK,INDX-REC,INDX-LEN,STATE-KEY,KEY-NUM.
  GET-NEXT.
   IF B-EOF GO TO XIT.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STAT
         DISPLAY"Ошибка открытия файла.Код="DSP-STAT
         STOP RUN
   MOVE INX-POS TO REC-POS.
   CALL'BTRV'USING B-GET-DIRECT,B-STATUS,FILE-POS-BLK,ADDR-REC,FILE-LEN,NAME-KEY,KEY-NUM.




     201/Rev1.00                                              D-9



Управление записями Btrieve
-------------------------------------------------ДД

   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STAT
         DISPLAY"Ошибка чтения файла.Код = "DSP-STAT
         STOP RUN
         DIAPLAY NAME.STREET,CITY,STATE,ZIP.
   CALL'BTRV'USING B-GET-NEXT,B-STATUS,INDX-POS-BLK,INDX-REC,INDX-LEN,STATE-KEY,KEY-NUM.
   GO TO GET-NEXT.
  XIT.


GET DIRECTORY в языке COBOL

Следующий пример показывает как прикладная программа может
использовать команды GET и SET DIRECTORY ,чтобы получить текущую
директорию в начале программы и восстановить ее перед окончанием.

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   77 B-GET-DIR    PIC 99 COMP-0 VALUE 10.
   77 B-SET-DIR    PIC 99 COMP-0 VALUE 17.
   77 B-STATUS     PIC 99 COMP-0.
   01 DSP-STATUS   PIC 99999.
   01 DIR-PATH     PIC X(64).
   01 DUMY-BUF     PIC X(128).
   01 DUMY-LEN     PIC 99 COMP-0 VALUE 128.
   01 KEY-NUM      PIC 99 COMP-0 VALUE 0.
   PROCEDURE DIVISION.
   BEGIN.
   CALL'BTRV'USING B-GET-DIR,B-STATUS,DUMY-BUF,DUMY-BUF,DUMY-LEN,DIR-PATH,KEY-NUM.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка получения текущей директории.Код "DSP-STATUS
         STOP RUN
   CALL'BTRV'USING B-GET-DIR,B-STATUS,DUMY-BUF,DUMY-BUF,DUMY-LEN,DIR-PATH,KEY-NUM.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STATUS
         DISPLAY"Ошибка восстановления текущей директории.Код ="
         DSP-STATUS
         STOP RUN


GET EQUAL в языке COBOL

В следующем примере часть инветарного  номера является ключом в
файле инвентаризационной ведомости.Прикладная программа по одной
команде GET EQUAL получает запись,содержащую инвентаризационную
информацию с заданным ключем и определяет, нужно ли
переупорядочить эту часть ключа.

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   77 B-GET-EQUAL  PIC 99 COMP-0 VALUE 5.
   77 PART-KEY     PIC 99 COMP-0 VALUE 0.
   77 B-STATUS     PIC 99 COMP-0.
   01 DSP-STAT     PIC 99999.
   01 DIR-PATH     PIC X(64).




     201/Rev1.00                                              D-10



                                   Пример программ для СOBOL
-------------------------------------------------ДД

   01 INVENTORY-RECORD.
      02 PART-NUM  PIC X(5).
      02 PART-DESC PIC X(10).
      02 QUAN-ON-HAND  PIC X(3).
      02 REORDER-POINT PIC X(3).
      02 REORDER-QUAN  PIC X(3).
   01  DATA-LEN    PIC 99 COMP-0 VALUE 24.
   01  KEY-BUFFER  PIC X(5).
   01 POSITION-BLOCK   PIC X(128).
   PROCEDURE DIVISION.
   BEGIN.
       MOVE"03426" TO KEY-BUFFER.
   CALL'BTRV'USING B-GET-EQUAL,B-STATUS,POSITIO-BLOCK,INVENTORY-RECORD,DATA-LEN,KEY-BUFFER,PART-KEY.
   IF B-STATUS NOT = 0
         MOVE B-STATUS TO DSP-STAT
         DISPLAY"Ошибка чтения файла.Код "DSP-STAT
         STOP RUN
   IF QUAN-ON-HAND=FIL_BUF.INDX_CNT)
   {
        printf("Номер ключа на уничтожение не является дополнительным индексом.Код=%d",STAT);
        exit(0);
   };
   FIL_BUF_LEN-1;
   STAT=BTRV(B_DROP,POS_BLK,&DMY,FIL_BUF_LEN,KEY_BUF,KEY_NUM);
    if (STAT!=0)
    {
          printf("Ошибка уничтожения дополнительного индекса. Код=%d",STAT);
          exit(0);
    };
          printf("Успешное создание дополнительного индекса");
     };






     201/Rev1.00                                              E-8



                                   Пример программ для С
-------------------------------------------------ДД


END TRANSACTION в языке C

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

    #define B_ABORT 21
    #define B_BEGIN 19
    #define B_END   20
    #define B_GET_EQ 5
    #define B_OPEN   0
    #define B_UPDATE 3
     struct LEDGER_REC
     {
     int  ACCT_ID;
     char DESC[40];
     long BALANCE;
     };
      int    BUF_LEN;
      struct LEDGER_REC DATA_BUF;
      char   DUMY_BUF[128];
      int    DUMY_LEN;
      int    KEY_BUF;
      char   POS_BLK[128];
      int    STAT;
    main()
   {
   /* Начало транзакции */
   STAT=BTRV(B_BEGIN,DUMY_BUF,DUMY_BUF,&DUMY_LEN,DUMY_BUF,0);
    if (STAT!=0)
    {
          printf("Ошибка начала транзакциии.Код=%d",STAT);
          exit(0);
    };
    /* Нахождение и обновление записи денежных счетов  */
        KEY_BUF=101;                      /* счет 101 */
        BUF_LEN=sizeof(DATA_BUF);
        STAT=BTRV(B_GET_EQ,POS_BLK,&DATA_BUF,&BUF_LEN,&KEY_BUF,0);
    if (STAT!=0)
    {
          printf("Ошибка получения записи.Код=%d",STAT);
          STAT=BTRV(B_ABORT,DUMY_BUF,DUMY_BUF,&DUMY_LEN,DUMY_BUF,0);
          exit(0);
    };
    DATA_BUF.BALANCE=DATA_BUF.BALANCE-250;
    STAT=BTRV(B_UPDATE,POS_BLK,&DATA_BUF,&BUF_LEN,&KEY_BUF,0);
    if (STAT!=0)
    {
          printf("Ошибка обновления записи.Код=%d",STAT);
          STAT=BTRV(B_ABORT,DUMY_BUF,DUMY_BUF,&DUMY_LEN,DUMY_BUF,0);
          exit(0);
    };
    /* Нахождение и обновление записи  счетов затрат   */
        KEY_BUF=511;             /*      Cчет затрат     511 */
        STAT=BTRV(B_GET_EQ,POS_BLK,&DATA_BUF,&BUF_LEN,&KEY_BUF,0);



     201/Rev1.00                                              E-9



Управление записями Btrieve
-------------------------------------------------ДД

    if (STAT!=0)
    {
          printf("Ошибка получения  записи.Код=%d",STAT);
          STAT=BTRV(B_ABORT,DUMY_BUF,DUMY_BUF,&DUMY_LEN,DUMY_BUF,0);
          exit(0);
    };
    DATA_BUF.BALANCE=DATA_BUF.BALANCE+250;
    STAT=BTRV(B_UPDATE,POS_BLK,&DATA_BUF,&BUF_LEN,&KEY_BUF,0);
    if (STAT!=0)
    {
          printf("Ошибка обновления записи.Код=%d",STAT);
          STAT=BTRV(B_ABORT,DUMY_BUF,DUMY_BUF,&DUMY_LEN,DUMY_BUF,0);
          exit(0);
    };
    /*   Конец транзакции  */
    STAT=BTRV(B_END,DUMY_BUF,DUMY_BUF,&DUMY_LEN,DUMY_BUF,0);
    if (STAT!=0)
    {
          printf("Ошибка конца транзакции.Код=%d",STAT);
          exit(0);
    };


EXTEND  в языке C

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

    #define B_CLOSE 1
    #define B_EXTEND 16
    #define B_OPEN   0
     struct  ADDR_REC                /*  структура файла адреса  */
    {
    char   NAME[30];
    char   STREET[30];
    char   CITY[30];
    char   STATE[2];
    char   ZIP[5];
    };
     int  BUF_LEN;
     struct ADDR_REC DATA_BUF;
     char   EXT_NAME[15]="B.ADDRESS.EXT"
     char   FIL_NAME[15]="ADDRESS.BTR";
     char   KEY_BUF[30];
     char   POS_BLK[128];
     int    STAT;
    main()
  BUF_LEN=sizeof(DATA_BUF);
  STAT=BTRV(B_OPEN,POS_BLK,&DATA_BUF,&BUF_LEN,FIL_NAME,0);
    if (STAT!=0)
    {
          printf("Ошибка открытия файла.Код=%d",STAT);
          exit(0);
    };





     201/Rev1.00                                              E-10



                                   Пример программ для С
-------------------------------------------------ДД

  STAT=BTRV(B_EXTEND,POS_BLK,&DATA_BUF,&BUF_LEN,EXT_NAME,0);
    if (STAT!=0)
    {
          printf("Ошибка расширения файла.Код=%d",STAT);
          exit(0);
    };
  STAT=BTRV(B_CLOSE,POS_BLK,&DATA_BUF,&BUF_LEN,KEY_BUF,0);
  STAT=BTRV(B_OPEN,POS_BLK,&DATA_BUF,&BUF_LEN,FIL_NAME,0);
    if (STAT!=0)printf("Ошибка повторного открытия файла. Код=%d",STAT);
    else printf("Файл успешно открыт повторно.");


GET DIRECT в языке C

Следующий пример показывает как прикладная программа может
использовать команду GET DIRECT , чтобы отсортировать записи
в файле BTRIEVE по внешниму индексу.( Смотри описание GET
POSITION, где на примере показано ,как построить внешний индекс).

    #define B_GETDRC   23
    #define B_GETLW    12
    #define B_GETNX    6
    #define B_GETPOS   22
    #define EOF_ERR    9
     struct  ADDRESS
   {
     char  NAME[20];
     char STREET[20];
     char CITY[10];
     char STATE[2];
     char ZIP[5];
   };
    struct ADDR_REC
   {
    struct ADDRESS ADDR;
    long   REC_POS;
   }; FILE_BUF
   struct INDEX
   {
    long   INX_POS;
    char   INX_ST[2];
   };
     int    FILE_LEN;
     char   FILE_POS[128];
     struct INDEX INDX_BUF;
     int    INDX_LEN;
     char   INX_POS[128];
     char   NAME_KEY [20];
     char   ST_KEY[2];
     int    STATUS;
   main() {
 FILE_LEN=sizeof(FILE_BUF);
 INDX_LEN:=sizeof(INDX_BUF);
 STATUS=BTRV(B_GETLW,INX_POS,&INDX_BUF,&INDX_LEN,ST_KEY,0);






     201/Rev1.00                                              E-11



Управление записями Btrieve
-------------------------------------------------ДД

 while (STATUS!=EOF_ERR)
    {
     if(STATUS!=0)
          printf("Ошибка чтения файла.Код=%d",STAT);
          exit(0);
    };
    FILE_BUF.REC_POS=INDX_BUF.INX_POS;
    STATUS=BTRV(B_GETDRC,FIL_POS,&FILE_BUF,&FILE_LEN,NAME_KEY,0);
     if(STATUS!=0)
          printf("Ошибка получения директории файла.Код=%d",STAT);
          exit(0);
    };
    printf("%57s\n",FILE_BUF.ADDR.NAME);
    STATUS=BTRV(B_GETNX,INX_POS,&INDX_BUF,&INDX_LEN,ST_KEY,0);
}


GET DIRECTORY в языке C

Следующий пример показывает как прикладная программа может
использовать команды GET и SET DIRECTORY ,чтобы получить текущую
директорию в начале программы и восстановить ее перед окончанием.

    #define B_GET_DIR  18
    #define B_SET_DIR  17
    char DIR_PATH[64];
    char DUMY_BUF[128];
    int  DUMY_LEN;
    int  STAT;
   main()
   {
     STAT=BTRV(B_GET_DIR,DUMY_BUF,DUMY_BUF,&DUMY_LEN,DIR_PATH,0);
     if(STAT!=0)
      {
          printf("Ошибка получения текущей директории.Код=%d",STAT);
          exit(0);
      };
     STAT=BTRV(B_SET_DIR,DUMY_BUF,DUMY_BUF,&DUMY_LEN,DIR_PATH,0);
     if(STAT!=0)
      {
          printf("Ошибка восстановдения текущей директории.Код=%d",STAT);
          exit(0);
      };


GET EQUAL в языке C

В следующем примере часть инветарного  номера является ключом в
файле инвентаризационной ведомости.Прикладная программа по одной
команде GET EQUAL получает запись,содержащую инвентаризационную
информацию с заданным ключем и определяет, нужно ли
переупорядочить эту часть ключа.

    #define B_GET_EQ   5






     201/Rev1.00                                              E-12



                                   Пример программ для С
-------------------------------------------------ДД

     struct INVENT
     {
      char    PART_NUM[5];
      char    PART_DSC[10];
      char    QUAN_OH[3];
      char    REORD_PT[3];
      char    REORD_QU[3];
     };
      int  DATA_LEN;
      int  I;
      struct INVENT INV_BUF;
      char KEY_BUF[]="03426";
      char POS_BLK[128];
      char STR1[4];
      char STR2[4];
      int  STATUS;
    main()
   {
   DATA_LEN:=sizeof(INV_BUF);
   STATUS=BTRV(B_GETEQ,POS_BLK,&INV_BUF,&DATA_LEN,KEY_BUF,0);
     if(STAT!=0)
      {
          printf("Ошибка чтения файла.Код=%d",STAT);
          exit(0);
      };
   for (I=0;I<3;I++)        /* преобразование даты к символьной строке*/
     {
     STR1[1]=INV_BUF.QUAN_OH[1];
     STR2[1]=INV_BUF.REORD_PT[1];
      };
    STR1[3]=STR2[3]='\0';
    if (strcmp(STR1,STR2)<0
       printf("Время упорядочить %3 изделия из% 10",
       INV_BUF.REORD_QU,INV_BUF.PART_DSC);

Следующая таблица показывает текущее положение в файле BTRIEVE
после выполнения команды GET EQUAL.

---------------------------------------------
і 03419 і Pliers          і 003 і 010 і 015 і   <--- предыдущая
---------------------------------------------        запись
і 03426 і Hammer          і 010 і 003 і 005 і   <--- текущая
---------------------------------------------        запись
і 03430 і Saw             і 005 і 002 і 003 і   <--- следующая
---------------------------------------------        запись
і 03560 і Wrench          і 008 і 005 і 005 і
-------------------------------------------
       ^
       і
       і
     путь доступа









     201/Rev1.00                                              E-13



Управление записями Btrieve
-------------------------------------------------ДД



GET FIRST в языке C

Следующий пример показывает ,как прикладная программа может
использовать команду GET FIRST, чтобы найти самого молодого
сотрудника в компании.Возраст - ключ номер 2 в файле
'сотрудники'.

    #define B_GETFIRST  12

    struct EMP_REC;
        {
     char  NAME[20];
     char  AGE[2];
     char  HIRE_DATE[6];
        };
      int   DATA_LEN;
      struct  EMP_REC EMP_BUF;
      char    KEY_BUF[2];
      char    POS_BLK[128];
      int     STATUS;
    main()
    {
   DATA_LEN=sizeof(EMP_BUF);
   STATUS=BTRV(B_GETFIRST,POS_BLK,&EMP_BUF,&DATA_LEN,KEY_BUF,0);
     if(STAT!=0)
          printf("Ошибка чтения файла.Код=%d",STAT);
     else
          printf("Самый молодой сотрудник из % 20",EMP_BUF.NAME);
     };

После выполнение команды GET FIRST BTRIEVE установит текущую
позицию как показано на рисунке:
                                                <--- предыдущая
---------------------------------------------        запись
і Brook,Wendy W.          і 18  і 071582    і   <--- текущая
---------------------------------------------        запись
і Ross,John L.            і 20  і 121081    і   <--- следующая
---------------------------------------------        запись
і Blarid,Suzanne M.       і 25  і 050281    і
---------------------------------------------
і Brandes William J.      і 40  і 031576    і
-------------------------------------------
                               ^
                               і
                               і
                          путь доступа


GET GREATER в языке C

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




     201/Rev1.00                                              E-14



                                   Пример программ для С
-------------------------------------------------ДД

    #define B_GETGT     8
    #define B_GETNX     6
    #define EOF_ERR     9

     struct    POLICY
       {
        char   POL_NUM[10];
        char   NAME[20];
        char   EFF_DATE[6];

       };
      int  DATA_LEN;
      struct  POLICY POL_BUF;
      char KEY_BUF[]="03";
      cahr POS_BLK[128];
      int  STATUS;
    main() {
 DATA_LEN=sizeof(POL_BUF);
 STATUS=BTRV(B_GETGT,POS_BLK,&POL_BUF,&DATA_LEN,KEY_BUF,2);
 while (STATUS!=EOF_ERR)
    {
    if (STATUS!=0)
          printf("Ошибка чтения файла.Код=%d",STAT);
          exit(0);
    };
  printf("%20 имеют %2 дорожных нарушений\n",POL_BUF.POL_BUF.VIOLAT);
  STATUS=BTRV(B_GET_NX,POS_BLK,&POL_BUF,&DATA_LEN,KEY_BUF,2);
    };


GET GREATER OR  EQUAL в языке C

Если дата покупки - это ключ в файле накладных ,то прикладная
программа может использовать команду GET GREATER OR  EQUAL чтобы
получить запись первой покупки ,сделанной в мае 1982 года.

    #define B_OPEN      0
    #define B_GETGE     9
     struct  INVOICE
        {
        char   INV_NUM[5];
        char   SALE_DT[6];
        char   CUST_NUM[5];
        char   TOT_PRIC[8];
        }
      int   DATA_LEN;
      struct  INVOICE INV_BUF;
      char    KEY_BUF[]="050182";
      char    POS_BLK[128];
      int     STATUS;
    main()
   {
   DATA_LEN=sizeof(INV_BUF);
   STATUS=BTRV(B_GETGE,POS_BLK,&INV_BUF,&DATA_LEN,KEY_BUF,1);
     if(STATUS!=0)
          printf("Ошибка чтения файла.Код=%d",STAT);
     else
          printf("Первая покупка в мае была сделана %5 для %8",INV_BUF.CUST_NUM,INV_BUF.TOT_PRC);};


     201/Rev1.00                                              E-15



Управление записями Btrieve
-------------------------------------------------ДД


После выполнение команды GET GREATER OR EQUAL  BTRIEVE установит
текущую позицию как показано на рисунке:

---------------------------------------------
і 03110   і 041582  і 11315  і 0018400      і
---------------------------------------------
і 03111   і 042882  і 34800  і 0009600      і
---------------------------------------------
і 03112   і 042882  і 51428  і 0012456      і   <--- предыдущая
---------------------------------------------        запись
і 03113   і 050282  і 65541  і 0003645      і   <--- текущая
---------------------------------------------        запись
і 03114   і 050282  і 14367  і 0009872      і   <--- следующая
---------------------------------------------        запись
і 03115   і 051682  і 15699  і 0057599      і
-------------------------------------------
                 ^
                 і
                 і
             путь доступа


GET LAST  в языке C

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

    #define B_GETLAST     13

     struct  EMP_REC
        {
        char   EMP_NUM[6];
        char   EMP_NAME[6];
        char   EMP_DEPT[2];
        char   EMP_TOT[6];
        char   EMP_CUR[6];
        };
      int    BUF_LEN;
      struct EMP_REC EMP_BUF
      char   KEY_BUF[6];
      char   POS_BLK[128];
      int    STATUS;
    main()
    {
    BUF_LEN=sizeof(EMP_BUF);
    STATUS=BTRV(B_GETLAST,POS_BLK,&EMP_BUF,&BUF_LEN,KEY_BUF,1);
     if(STATUS!=0)
          printf("Ошибка чтения файла.Код=%d",STAT);
     else
     printf("Служащий с большим комиссионным вознаграждением %20",EMP_BUF.EMP_NAME);
    };






     201/Rev1.00                                              E-16



                                   Пример программ для С
-------------------------------------------------ДД

После выполнение команды GET LAST  BTRIEVE установит текущую
позицию как показано на рисунке:

-----------------------------------------------
і 704904 і Brook,Wendy W.   і A1  і 110.95    і
-----------------------------------------------
і 831469 іRoss,John L.      і A5  і 240.80    і
-----------------------------------------------
і 876577 іBlanid,Kathleen M.і A3  і 562.75    і <--- предыдущая
-----------------------------------------------      запись
і 528630 іBrandes,Maureen R. і A5 і 935.45    і <--- текущая
-----------------------------------------------      запись
                                                <--- следующая
                                      ^              запись
                                      і
                                      і
                                    путь доступа


GET LESS THAN в языке C

Следующий пример показывает,как прикладная программа использует
команду GET LESS THEN , чтобы найти всех подписчиков, которые
получили журналы менее 3 раз перед тем ,как они прервали
подписку. Число оставшихся выпусков - ключ 2 в файле подписки.

     #define B_GETLT      10
     #define B_GETPR       7
     #define EOF_ERR       9
      struct  SUBSCRP
        {
     char      CUST[20];
     char      SUB_DATE[6];
     char      PD_DATE[6];
     char      ISS_PUR[3];
     char     ISS_REM[3];
        };
      int    BUF_LEN;
      struct SUBSCRP SUB_BUF;
      char   KEY_BUF[]="003";
      char   POS_BLK[128];
      int    STATUS;
    main()
   {
   BUF_LEN=sizeof(SUB_BUF);
   STATUS=BTRV(B_GETLT,POS_BLOCK,&SUB_BUF,&BUF_LEN,KEY_BUF,2);
   while (STATUS!=EOF_ERR)
    {
    if (STATUS!=0)
          printf("Ошибка чтения файла.Код=%d",STAT);
          exit(0);
    };
  printf("Послано %20s\n".SUB_BUF.CUST);
  STATUS=BTRV(B_GETPR,POS_BLK,&SUB_BUF,&BUF_LEN,KEY_BUF,2);






     201/Rev1.00                                              E-17



Управление записями Btrieve
-------------------------------------------------ДД

GET LESS THAN OR EQUAL в языке C

В следующем примере прикладная программа использует команду GET
LESS THEN OR EQUAL , чтобы определить первый дом, который
продается по цене в пределах 110,000 долларов.

    #define B_GETLE      11

      struct HOME_REC
        {
    char   PRICE[7];
    char   ADDRESS[20];
    char   SQ_FEET[6];
    char   YR_BUILT[4];
        };
      int    BUF_LEN;
      struct HOME_REC HOME_BUF
      char   KEY_BUF[]="0110000";
      char   PRICE[70];
      int    STATUS;
    main()
    {
   BUF_LEN=sizeof(HOME_BUF);
   STATUS=BTRV(B_GETLE,POS_BLK,&HOME_BUF,&BUF_LEN,KEY_BUF,0);
     if(STATUS!=0)
          printf("Ошибка чтения файла.Код=%d",STAT);
     else
          printf("Дом по адресу %20 продается за %7",HOME_BUF.ADDRESS,HOME_BUF.PRICE);
    };

После выполнение команды GET LESS OR EQUAL  BTRIEVE установит
текущую позицию как показано на рисунке:

-----------------------------------------------
і 0050000 і 330 N.31         і 002200  і 1960 і
-----------------------------------------------
і 0055000 і 11132 Maple Ave. і 002000  і 1965 і
-----------------------------------------------
і 0070000 і 604 Church Streetі 002300  і 1968 і <--- предыдущая
-----------------------------------------------      запись
і 0105000 і 3517 N.Lakes Ave.і 002500  і 1975 і <--- текущая
-----------------------------------------------      запись
і 0220000 і 4500 Oceanfront Aі 003000  і 1980 і <--- следующая
---------------------------------------------        запись
       ^
       і
       і
    путь доступа


GET NEXT в языке C

В следующем примере прикладная программа использует команду GET
NEXT ,чтобы напечатать почтовые ярлыки, отсортированные по
индексу.Индекс  - первый ключ в файле.





     201/Rev1.00                                              E-18



                                   Пример программ для С
-------------------------------------------------ДД

    #define B_GETFST     12
    #define B_GETNX      6
    #define EOF_ERR      9

      struct  ADDRESS
      {
      char    NAME[20];
      char    STREET[20];
      char    CITY[10];
      char    STATE[2];
      char    ZIP[5];
      };
      int     DATA_LEN;
      struct  ADDRESS ADDR_BUF;
      char    KEY_BUF[5];
      char    POS_BLK[128];
      int     STATUS;
     main()
   DATA_LEN=sizeof(addr_BUF);
   STATUS=BTRV(B_GETFST,POS_BLK,&ADDR_BUF,&DATA_LEN,KEY_BUF,1);
   while (STATUS!=EOF_ERR)
    {
    if (STATUS!=0)
     {
          printf("Ошибка чтения файла.Код=%d",STAT);
          exit(0);
      };
        printf("%20s\n",ADDR_BUF.NAME);
        printf("%20s\n",ADDR_BUF.STREET);

     printf("%10s,%2s%5s\n\n",ADDR_BUF.CITY,ADDR_BUF.STATE,ADDR_BUF.ZIP);
     STATUS=BTRV(B_GET_NX,POS_BLK,&ADDR_BUF,&DATA_LEN,KEY_BUF,1);
    };


GET POSITION в языке C

Следующий пример показывает ,как команда GET POSITION может быть
использована для создания внешнего индекса существующего файла
BTRIEVE.Kогда внешний индекс создан,прикладная программа может
читать файл внешнего индекса снизу до верху и использовать
команду GET DIRECT , чтобы отсортировать записи в файле BTRIEVE
по полям ,которые были ранее были об'явлены ключевыми полями.

    #define B_INSERT     2
    #define B_GETFST    12
    #define B_GETPOS    22
    #define B_GETNX      6
    #define EOF_ERR      9
      struct ADDRESS
        {
     char     NAME[20];
     char     STREET[20];
     char     CITY[10];
     char     STATE[2];
     char     ZIP[5];
        };



     201/Rev1.00                                              E-19



Управление записями Btrieve
-------------------------------------------------ДД

     union ADDR_REC
        {
      struct ADDR_REC
      long   REC_POS;
      } FILE_BUF;
      struct INDEX
        {
      long INX_POS;
      char INX_ST[2];
        };
      int   FILE_LEN;
      char  FIL_POS[128];
      int   I;
      struct INDEX INDX_BUF;
      int   INDX_LEN;
      char  INDX_POS[128];
      char  NAME_KEY[20];
      char  ST_KEY[20];
      int   STATUS;
    main()
   FILE_LEN=sizeof(FILE_BUF);
   INDX_LEN=sizeof(INDX_BUF);
   STATUS=BTRV(B_GET_FIRST,FIL_POS,&FIL_BUF,&FILE_LEN,NAME_KEY,0);
   while (STATUS!=EOF_ERR)
    {
    if (STATUS!=0)
     {
          printf("Ошибка чтения файла.Код=%d",STAT);
          exit(0);
      };
   for(1=0;I<2;I++)INDX_BUF.INX_ST[1]=FILE_BUF.ADDR.STATE[1];;
   STATUS=BTRV(B_GET_POS,FIL_POS,&FIL_BUF,&FILE_LEN,NAME_KEY,0);
   INDX_BUF.INX_POS=FILE_BUF.REC_POS;
   STATUS=BTRV(B_INSERT,INX_POS,&INDX_BUF,&INDX_LEN,ST_KEY,0);
    {
    if (STATUS!=0)
     {
          printf("Ошибка включения индекса файла.Код=%d",STAT);
          exit(0);
      };
      STATUS=BTRV(B_GET_NX,FIL_POS,&FILE_BUF,&FILE_LEN,NAME_KEY,0);
     };


GET PREVIOUS в языке C

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

    #define B_GETLST    13
    #define B_GETPR     7
    #define EOF_ERR      9





     201/Rev1.00                                              E-20



                                   Пример программ для С
-------------------------------------------------ДД

    struct   COMPANY
        {
    char     NAME[30];
    char     TOT_SALE[10];
        };
     struct COMPANY COMP_BUF;
     int    DATA_LEN;
     char   POS_BLOCK[128];
     char   KEY_BUF[10];
     int    STATUS;
    main()
    {
   DATA_LEN=sizeof(COMP_BUF);
   STATUS=BTRV(B_GET_LST,POS_BLK,&COMP_BUF,&DATA_LEN,_BUF_KEY,1);
    {
    if (STATUS!=0)
     {
          printf("Ошибка чтения файла.Код=%d",STAT);
          exit(0);
      };
   print("%30s,%10s\n,COMP_BUF,COMP_BUF.TOT_SALE)
   STATUS:=BTRV(B_GET_PR,POS_BLK,&COPM_BUF,&DATA_LEN,KEY_BUF,1);
      };


INSERT  в языке C

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

    #define B_INS       2
    struct EMP_REC
         {
    char  NAME[20];
    char  HIRE_DAT[6];
    char  ANNL_SAL[6];
         };
    int    DATA_LEN;
    struct  EMP_REC EMP_BUF;
    int I;
    char  NEW_HIRE[]="120882";
    char  NEW_NAME[]="Jones,Mary E";
    char  NEW_SAL[]="020000";
    char  POS_BLK[128];
    char  KEY_BUF[20];
    int  STATUS;
    {
   DATA_LEN=sizeof(EMP_BUF);

   for(I=0;I0 THEN
      PRINT "Ошибка начала транзакции.Код=" STATUS%:END
 250 LSET ORDER.NUM$=MKI$(236)       'Номер 236
 260 LSET CUST.NUM$=MKI$(201):LSET SALE.DATE$="061583"
 280 OPERATION%=2:BUF.LEN%=10
 290 CALL BTRV (OPERATIONS%,STATUS%,HDR.FCB%,BUF.LEN%
                   HDR.KEY$,KEY.NUMBER%)
 300  IF STATUS%<>0 THEN
      PRINT "Код=",STATUS%,"Включения записи основного файла":
      OP%=21:CALL BTRV (OP%,STATUS%,DUMMY.FCB%,DUMMY.LEN%
                   DUMMY.KEY$,KEY.NUMBER%):END
 320 'Включена запись основного файла,будут включены 2 записи в
файл
 321 'деталей
 340 LSET DET.ORD.NUM$=MKI$(236)       'Номер 236
 350 LSET PART.NUM$=MKI$(1002)         'Дискета 1002
 360 LSET QUAN$=MKI$(1)                'Куплена 2 коробка
 365 BUF.LEN%=6
 370 CALL BTRV (OPERATIONS%,STATUS%,DET.FCB%,BUF.LEN%
                   DET.KEY$,KEY.NUMBER%)
 380  IF STATUS%<>0 THEN
      PRINT "Код=",STATUS%,"Включения записи файла деталей":
      OP%=21:CALL BTRV (OP%,STATUS%,DUMMY.FCB%,DUMMY.LEN%
                   DUMMY.KEY$,KEY.NUMBER%):END
 390 LSET PART.NUM$=MKI$(1024)         'Лента   1024
 400 LSET QUAN$=MKI$(1)                'Куплена 1 коробка
 410 CALL BTRV (OPERATIONS%,STATUS%,DET.FCB%,BUF.LEN%
                   DET.KEY$,KEY.NUMBER%)
 420  IF STATUS%<>0 THEN
      PRINT "Код=",STATUS%,"Включения записи файла деталей":
      OP%=21:CALL BTRV (OP%,STATUS%,DUMMY.FCB%,DUMMY.LEN%
                   DUMMY.KEY$,KEY.NUMBER%):END
 430 '


     201/Rev1.00                                              E-1



Управление записями Btrieve
-------------------------------------------------ДД

 440 'Все записи включены .Конец транзакции.
 450 '
 460 OPERATION%=20              'установка кода конца  транзакции
 470 CALL BTRV (OPERATIONS%,STATUS%,DUMMY.FCB%,DUMMY.LEN%
                   DUMMY.KEY$,KEY.NUMBER%)
 480  IF STATUS%<>0 THEN
      PRINT "Ошибка конца транзакции.Код",STATUS%
                    ELSE
      PRINT "Транзакция закончилась успешно"


BEGIN TRANSACTION в языке BASIC

Смотри ABORT TRANSACTION и END TRANSACTION


CLEAR OWNER в языке BASIC

Следующий пример показывает,как выполнять команду CLEAR OWNER


 100 OP%=30
 110 CALL BTRV (OP%,STATUS%,FILE.PTR%,BUF.LEN%,KEY.VAL$,KEY.NUM%)
 120  IF STATUS%<>0 THEN PRINT "Код BTRIEVE ="STATUS%:END


CLOSE в языке BASIC

Следующий пример показывает ,как закрыть файл BTRIEVE из языка
BASIC .


 110 OP%=1
 170 CALL BTRV (OP%,STATUS%,FILE.PTR%,BUF.LEN%,KEY.VAL$,KEY.SELECT%)
 175  IF STATUS%<>0 THEN PRINT "Код BTRIEVE ="STATUS%:END


CREATE в языке BASIC

В следующем примере прикладная программа создает файл BTRIEVE c
двумя ключами.Ключ 0 - целое 2-байтное число.Ключ 1 допускает
дубликаты,может быть модифицирован,состоит из двух сегментов.
Первый сегмент - 2-байтовая строка - отсортирован в порядке
убывания,второй сегмент - заканчивающаяся нулями 30-байтовая
строка .Записи фиксированной длины,размерностью 80.


   20 DUPLICATES%=1
   30 MODIFIABLE%=2
   40 SEGMENTED%=16
   50 DESCSEND%=64
   60 EXTTYPE%=256
   70 BINTEGER%=1
   80 BSTRING%=0
   90 BZSTRING%=11
  100 OPEN "NUL" AS #1
  110 FIELD 1,2 AS RECL$,2 AS PGSZ$,2 AS NKEY$,
            4 AS NREC$,2 AS VARL$,2 AS RES$,


     201/Rev1.00                                              E-2



                                   Пример программ для BASIC
-------------------------------------------------ДД

            2 AS PREALLOC$,2 AS POS1$,2 AS LEN1$,
            2 AS FLG1$,4 AS CNT1$,1 AS KEYT1$,
            5 AS RES1$,2 AS POS2$,2 AS LEN2$,
            2 AS FLG2$,4 AS CNT2$,1 AS KEYT2$,
            5 AS RES2$,2 AS POS3$,2 AS LEN3$,
            2 AS FLG3$,4 AS CNT3$,1 AS KEYT3$,
            6 AS RES3$
  120 LSET RECL$=MKI$(80)
  130 LSET PGSZ$=MKI$(1024)
  140 LSET NKEY$=MKI$(2)
  150 LSET VARL$=MKI$(0)
  160 LSET POS1$=MKI$(1)
  170 LSET LEN1$=MKI$(2)
  180 LSET FLG1$=MKI$(EXTTYPE%)
  190 LSET KEYT1$=MKI$(BINTEGER%)
  200 LSET POS2$=MKI$(3)
  210 LSET LEN2$=MKI$(2)
  220 LSET FLG2$=MKI$(DUPLICATES%+MODIFIABLE%+SEGMENTED%+
                 EXTTYPE%+DESCEND%)
  230 LSET KEYT2$=MKI$(BSTRING%)
  240 LSET POS3$=MKI$(5)
  240 LSET LEN3$=MKI$(30)
  250 LSET FLG3$=MKI$(DUPLICATES%+MODIFIABLE%+SEGMENTED%)
  260 LSET KEYT3$=MKI$(BZSTRING%)
  270 LSET KEYT1$=MKI$(BINTEGER%)
  280 OP%=14
  290 BUF.LEN%=64
  300 FILE.NAME$="\DATE\CREATE.TST"
  310 FCB.ADDR%=VARPTR(#1)
   CALL BTRV (OP%,STATUS%,FCB.ADDR%,
                  BUF.LEN%,FILE.NAME$,KEY.NUMBER%)
   IF STATUS%<>0 THEN
         PRINT "Код ",STATUS%


CREATE SUPPLEMENTAL INDEX в языке BASIC

В следующем примере прикладная программа добавляет индекс в файл
BTRIEVE.Первый сегмент ключа - 10-байтовая сторка.Он может быть
модифицирован и допускает дубликаты.Второй сегмент 2-байтовое
целое число.


   20 DUPLICATES%=1
   30 MODIFIABLE%=2
   40 SEGMENTED%=16
   50 EXTTYPE%=256
   60 BINTEGER%=1
   70 BSTRING%=0
   80 OPEN "NUL" AS #1
   90 FIELD 1,2 AS POS1$,2 AS LEN1$,2 AS FLG1$,
            4 AS CNT1$,1 AS KEYT1$,5 AS RES1$,
            2 AS POS2$,2 AS LEN2$,2 AS FLG21$,
            4 AS CNT2$,1 AS KEYT2$,2 AS RES2$,
  100 OP%=0 '                      установка кода открытия
  110 BUF.LEN%=32
  120 FILE.NAME$="\DATA\CREATE.TST"
  130 FSB.ADDR%=VARPTR(#1)


     201/Rev1.00                                              E-3



Управление записями Btrieve
-------------------------------------------------ДД

  140 CALL BTRV (OP%,STATUS%,FCB.ADDR%,
                  BUF.LEN%,FILE.NAME$,KEY.NUMBER%)
  150 STATUS% 0 THEN
         PRINT "Ошибка при открытии.Код ",STATUS%

  160 LSET POS1$=MKI$(40):LSET LEN1$=MKI$(10)
  180 LSET FLG1$=MKI$(DUPLICATES%+MODIFIABLE%+SEGMENTED%+
                 EXTTYPE%)
  190 LSET KEYT2$=MKI$(BSTRING%)
  200 LSET POS2$=MKI$(50):LSET LEN2$=MKI$(2)
  220 LSET FLG2$=MKI$(DUPLICATES%+MODIFIABLE%+EXTTYPE%)
  230 LSET KEYT2$=MKI$(BINTEGER%)
  240 DUMYK$=SPACE$(10)               'инициализация ключа буфера
  250 BUF.LEN%=32                     'установка длины буфера данных
  260 OP%=31                          'установка кода создания доп.инд.
  270 CALL BTRV (OP%,STATUS%,FCB.ADDR%,
                  BUF.LEN%,DUMYK$,KEY.NUMBER%)
  280 IF STATUS%<> THEN
         PRINT "Ошибка во время создания дополнительного
                 индекса файла.Код=",STATUS%


DELETE в языке BASIC

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


  110 OP%=5
  130 FILE.PTR%=VARPTR(#2)    'указатель позиции блока для 2 откр. файла
  140 KEY.SELECT%=0           'установка номера ключа
  145 KEY.VAL$="Martin,David H."      'установка значения ключа       .
  150 FIELD#2,3 AS FLT.NO$,
      15 AS PASNGR$,
      6 AS AMNT.PD$,
      6 AS ISSU.DATE$
  160 BUF.LEN%=30
  170 CALL BTRV (OP%,STATUS%,FILE.PTR%,
                  BUF.LEN%,KEY.VAL$,KEY.SELECT%)
  175 IF STATUS%<> THEN
         PRINT "Код BTRIEVE=",STATUS%: END
  190 OP%=4
  350 CALL BTRV (OP%,STATUS%,FILE.PTR%,
                  BUF.LEN%,KEY.VAL$,KEY.SELECT%)
  360 IF STATUS%<> THEN
         PRINT "Код BTRIEVE=",STATUS%: END













     201/Rev1.00                                              E-4



                                   Пример программ для BASIC
-------------------------------------------------ДД

После выполнения DELETE текущее положение в файле BTRIEVE будет
следующее:

-------------------------------------------
і 326 і Grawley,Joe J.  і 179.85 і 061582 і
-------------------------------------------
і 711 і Howell,Susan    і 259.40 і 052382 і   <--- предыдущая
-------------------------------------------        запись
і 326 і Petersy,John H. і 445.80 і 061782 і   <--- следующая
-------------------------------------------        запись
і 840 і White,Rosemary  і 397.00 і 060282 і
-------------------------------------------
                 ^
                 і
                 і
              путь доступа


DROP SUPPLEMENTAL INDEX в языке BASIC

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


   40 BUF.LEN%=1
   50 FCB.ADDR%=VARPTR(#1)
   60 OP%=32
   70 KEY.NUMBER%=3
   80 DUMYK$=SPACE$(10)
   90 CALL BTRV (OP%,STATUS%,FCB.ADDR%,
                  BUF.LEN%,DUMYK$,KEY.NUMBER%)
  100 IF STATUS%=6 THEN
         PRINT "Номер ключа на уничтожение не является дополнительным
                 индексом.",
         ELSE  IF STATUS%<> THEN
         PRINT  "Ошибка уничтожения  дополнительного индекса.Код="
         STATUS%


END TRANSACTION в языке BASIC

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


 50 FIELD #2,2 AS ACCT.ID$,40 AS DESC$,4 AS BALANCE$
 130 'Начало транзакции
 150 OPERATION%=19              'установка кода начала транзакции
 170 CALL BTRV (OPERATIONS%,STATUS%,DUMMY.FCB%,DUMMY.LEN%
                   DUMMY.KEY$,KEY.NUMBER%)
 180  IF STATUS%<>0 THEN
      PRINT "Ошибка начала транзакции.Код=" STATUS%:END
 190 'Нахождение и обновление записи денежных счетов
 210 OPERATION%=5:KEY.BUF$=MKI$(101)               'счет 101
 230 BUF.LEN%=46


     201/Rev1.00                                              E-5



Управление записями Btrieve
-------------------------------------------------ДД

 240 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   KEY.BUF$,KEY.NUMBER%)
 250  IF STATUS%<>0 THEN
      PRINT "Код=",STATUS%,"получения записи "
      OP%=21:CALL BTRV (OP%,STATUS%,DUMMY.FCB%,DUMMY.LEN%
                   DUMMY.KEY$,KEY.NUMBER%):END
 260 LSET BALANCE$=MKS$(CVS(BALANCE$)-250)
 270 OPERATION%=3
 280 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   KEY.BUF$,KEY.NUMBER%)
 290  IF STATUS%<>0 THEN
      PRINT "Код=",STATUS%,"обновления записи "
      OP%=21:CALL BTRV (OP%,STATUS%,DUMMY.FCB%,DUMMY.LEN%
                   DUMMY.KEY$,KEY.NUMBER%):END
 310 'Получена и обновлена запись счетов затрат
 335 OPERATION%=5:KEY.BUF$=MKI$(511):BUF.LEN%=46
 360 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   KEY.BUF$,KEY.NUMBER%)
 370  IF STATUS%<>0 THEN
      PRINT "Код=",STATUS%,"получения записи "
      OP%=21:CALL BTRV (OP%,STATUS%,DUMMY.FCB%,DUMMY.LEN%
                   DUMMY.KEY$,KEY.NUMBER%):END
 380 LSET BALANCE$=MKS$(CVS(BALANCE$)+250)
 390 OPERATION%=3
 400 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   KEY.BUF$,KEY.NUMBER%)
 410  IF STATUS%<>0 THEN
      PRINT "Код=",STATUS%,"обновления записи "
      OP%=21:CALL BTRV (OP%,STATUS%,DUMMY.FCB%,DUMMY.LEN%
                   DUMMY.KEY$,KEY.NUMBER%):END
 415 OPERATION%=20           'установка кода конца транзакции
 420  CALL BTRV (OPERATION%,STATUS%,DUMMY.FCB%,DUMMY.LEN%
                   DUMMY.KEY$,KEY.NUMBER%)
 430  IF STATUS%<>0 THEN
      PRINT "Ошибка конца транзакции.Код",STATUS%
                    ELSE
     PRINT "Транзакция закончилась успешно"


EXTEND  в языке BASIC

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


 40 OPEN "NUL" AS #2      ' открытие файла из языка BASIC
 50 FIELD #2,30 AS FULL.NAME$,
    30 AS STREET$,
    30 AS CITY$,
    2 AS STATE$,
    2 AS ZIP$
 60 OPERATION%=0:STATUS%=0     'установка кода открытия
 70 FCB.ADDR%=VARPTR(#2)       'получение адреса FCB
                       'установка буфера ключа и номера ключа
 90 KEY.BUFFER$="ADDRESS.BTR":KEY.NUM%=0
 100 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   KEY.BUFFER$,KEY.NUM%)


     201/Rev1.00                                              E-6



                                   Пример программ для BASIC
-------------------------------------------------ДД

 120  IF STATUS%<>0 THEN
      PRINT "Ошибка открытия файла.Код=",STATUS%:END
 130 OPERATION%=16:KEY.BUFFER$="B\ADDRESS.EXT"
 150 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   KEY.BUFFER$,KEY.NUM%)
 160  IF STATUS%<>0 THEN
      PRINT "Ошибка расширения файла.Код=",STATUS%:END
 170 OPERATION%=1       'установка кода закрытия
 180 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   KEY.BUFFER$,KEY.NUM%)
 190 OPERATION%=0:KEY.BUFFER$="ADDRESS.BTR"
 200 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   KEY.BUFFER$,KEY.NUM%)
 210  IF STATUS%<>0 THEN
      PRINT "Ошибка повторного открытия файла.Код=",STATUS%:END


GET DIRECT в языке BASIC

Следующий пример показывает как прикладная программа может
использовать команду GET DIRECT , чтобы отсортировать записи
в файле BTRIEVE по внешниму индексу.( Смотри описание GET
POSITION, где на примере показано ,как построить внешний индекс).


 40 FIELD #1,20 AS NAM$,20 AS STREET$,10 AS CITY,
             2 AS STATE$,5 AS ZIP$
 50 FIELD #1,4  AS REC.POSITION$
 65 FIELD #2,4  AS POS.INX$,2 AS STATE.INX$
 70 KEY.NUM%=0     'ключ 0 используется для обоих файлов
 80 FILE.PTR%=VARPTR(#1)        'первоначальный FCB-файл
 85 FILE.LEN%=57       'установка длины буфера данных для первого файла
 90 INDX.PTR%=VARPTR(#2)        'индексный FCB-файл
 95 INDX.LEN%=6        'установка длины буфера данных для второго файла
 100 NAME.KEY$=SPACE$(20):STAT.KEY$=SPACE$(2)
 120 READ.LOW%=12:READ.NEXT%=6:GET.DIRECT%=23
 130 CALL BTRV (READ.LOW%,STATUS%,INDX.PTR%,INDX.LEN%,STAT.KEY$,
                   KEY.NUM%)
 140 WHILE STATUS%<>99THEN      'чтение до конца файла
 150  IF STATUS%<>0 THEN
      PRINT "Ошибка чтения записи.Код=",STATUS%," END
 160 LSET REC.POSITION$=POS.INX$
 170 CALL BTRV (GET.DIRECT%,STATUS%,FILE.PTR%,FILE.LEN%,
               NAME.KEY$,KEY.NUM%)
 180  IF STATUS%<>0 THEN
      PRINT "Ошибка получения записи.Код=",STATUS%," END
 190 PRINT NAM$,STREET$,CITY$,ZYP$
 210 CALL BTRV (READ.NEXT%,STATUS%,INDX.PTR%,INDX.LEN%,STAT.KEY$,
                   KEY.NUM%)
 220 WEND


GET DIRECTORY в языке BASIC

Следующий пример показывает как прикладная программа может
использовать команды GET и SET DIRECTORY ,чтобы получить текущую
директорию в начале программы и восстановить ее перед окончанием.



     201/Rev1.00                                              E-7



Управление записями Btrieve
-------------------------------------------------ДД

 40 OPERATION%=18    'операция получения директории
 50 STATUS%=0        'установка статуса
 60 DIR.PATH=SPACE$(65)     'установка ключа буфера
 70  CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   DIR.PATH$,KEY.NUMBER%)
 80   IF STATUS%<>0 THEN
      PRINT "Ошибка получения директории.Код=",STATUS%:END
 90 OPERATION%=17    'операция установки текущей  директории
100  CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   DIR.PATH$,KEY.NUMBER%)
110   IF STATUS%<>0 THEN
      PRINT "Ошибка восстановления тек.директории.Код=",STATUS%:END


GET EQUAL в языке BASIC

В следующем примере часть инветарного  номера является ключом в
файле инвентаризационной ведомости.Прикладная программа по одной
команде GET EQUAL получает запись,содержащую инвентаризационную
информацию с заданным ключем и определяет, нужно ли
переупорядочит эту часть ключа. ли эта часть номера.


 110 FIELD #2,5 AS PART.NUM$, 10 AS PART.DESC$, AS QUAN.ON.HAND$,
      AS 3 REORDER.POINT$,
      AS 3 REORDER.QUAN$,
 140 FCB.ADDR%=VARPTR(#2)       'получение адреса FCB
  150 OPERATION%=5     ' установка кода получения равного
  160 PART.NUMBER$="03426"         ' часть номера для поиска
  170 KEY.NUMBER%=0                ' часть номера - ключ 0
  180 BUF.LEN%=24
 350 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                  PART.NUMBER$,KEY.NUMBER%)   ' получение записи
 360  IF STATUS%<>0 THEN
      PRINT "Ошибка чтения файла.Код=",STATUS%:END
 370 IF QUAN.ON.HAND$0 THEN
      PRINT "Ошибка чтения файла.Код=",STATUS%:END
 370  PRINT "Самый молодой сотрудник -"EMP.NAME$


После выполнение команды GET FIRST BTRIEVE установит текущую
позицию как показано на рисунке:
                                                <--- предыдущая
---------------------------------------------        запись
і Brook,Wendy W.          і 18  і 071582    і   <--- текущая
---------------------------------------------        запись
і Ross,John L.            і 20  і 121081    і   <--- следующая
---------------------------------------------        запись
і Blarid,Suzanne M.       і 25  і 050281    і
---------------------------------------------
і Brandes William J.      і 40  і 031576    і
-------------------------------------------
                            ^
                            і
                            і
                       путь доступа


GET GREATER в языке BASIC

Следующий пример показывает ,как прикладная программа для
страховой компании может использовать GET GREATER, чтобы
определить,кто из владельцев страхового полиса имеет более
3 дорожных нарушений.Число дорожных нарушений - ключ 2 в файлу
сртахового полиса.


 110  FIELD #2,10 AS POLICY.NUM$,6 AS EFFECT.DATE$,
      2 AS VIOLATION$
 140 FCB.ADDR%=VARPTR(#2)       'получение адреса FCB
 150 OPERATION%=8:BUF.LEN%=38   'установка кода и длины буфера
 170 KEY.NUM%=2                ' нарушения    - ключ 2
 180 KEY.BUF$="03"             ' начало поиска - больше 3
 190 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                  KEY.BUF$,KEY.NUM%)
 200  IF STATUS%<>0 THEN


     201/Rev1.00                                              E-9



Управление записями Btrieve
-------------------------------------------------ДД

      PRINT "Ошибка чтения файла.Код=",STATUS%:END
 210 OPERATION%=6              'установка кода получения следующего
 220 WHILE STATUS%<>9 THEN     'чтение до конца файла
 230 PRINT NAM$;"имеет",VIOLATION$;"дорожных нарушений"
 240 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                  KEY.BUF$,KEY.NUM%)
 250  IF (STATUS%<>0) AND (STATUS%<>9) THEN
      PRINT "Ошибка чтения файла.Код=",STATUS%:END
 260  WEND


GET GREATER OR  EQUAL в языке BASIC

Если дата покупки - это ключ в файле накладных ,то прикладная
программа может использовать команду GET GREATER OR  EQUAL чтобы
получить запись первой покупки ,сделанной в мае 1982 года.


 110  FIELD #2,5  AS INVOICE.NUM$
      6 AS DATE.OF.SALE$,
      5 AS CUST.NUM$,
      8 AS TOTAL.PRICE$
 140 FCB.ADDR%=VARPTR(#1)       'получение адреса FCB
 150 OPERATION%=9               ' установка кода GET GREATE OR EQUAL
 155 BUF.LEN%=24                'установка  длины буфера данных
 160 FIRST.DATE$="050182"       'начало поиска 1 мая 1982 года
 170 KEY.NUMBER%=1              ' дата покупки - ключ 1
 350 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                FIRST.DATE$,KEY.NUMBER%)  'получение записи
 360  IF STATUS%<>0 THEN
      PRINT "Ошибка чтения файла.Код=",STATUS%:END
 370 PRINT "Первая покупка в мае была сделана",
              CUST.NUM$",за",TOTAL.PRICE$


После выполнение команды GET GREATER OR EQUAL  BTRIEVE установит
текущую позицию как показано на рисунке:

---------------------------------------------
і 03110   і 041582  і 11315  і 0018400      і
---------------------------------------------
і 03111   і 042882  і 34800  і 0009600      і
---------------------------------------------
і 03112   і 042882  і 51428  і 0012456      і   <--- предыдущая
---------------------------------------------        запись
і 03113   і 050282  і 65541  і 0003645      і   <--- текущая
---------------------------------------------        запись
і 03114   і 050282  і 14367  і 0009872      і   <--- следующая
---------------------------------------------        запись
і 03115   і 051682  і 15699  і 0057599      і
-------------------------------------------
                 ^
                 і
                 і
             путь доступа


GET LAST  в языке BASIC


     201/Rev1.00                                              E-10



                                   Пример программ для BASIC
-------------------------------------------------ДД


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


 110  FIELD #2,6  AS EMP.NUM$
     20 AS EMP.NAME$,
      2 AS DEPT$,
      6 AS TOT.COM$,
      6 AS CUR.COM$
 140 FCB.ADDR%=VARPTR(#2)       'получение адреса FCB
 150 OPERATION%=13              ' установка кода GET LAST
 155 BUF.LEN%=40                'установка  длины буфера данных
 160 KEY.NUM%=1:KEY.BUF$=SPACE$(6)   'установка номера ключа
                                     'и длины буфера ключа
 180 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                KEY.BUF$,KEY.NUM%)
 190  IF STATUS%<>0 THEN
      PRINT "Ошибка чтения файла.Код=",STATUS%:END
 200 PRINT "Служащий с большим комиссионным вознаграждением",
                 EMP.NAME$


После выполнение команды GET LAST  BTRIEVE установит текущую
позицию как показано на рисунке:

-----------------------------------------------
і 704904 і Brook,Wendy W.   і A1  і 110.95    і
-----------------------------------------------
і 831469 іRoss,John L.      і A5  і 240.80    і
-----------------------------------------------
і 876577 іBlanid,Kathleen M.і A3  і 562.75    і <--- предыдущая
-----------------------------------------------      запись
і 528630 іBrandes,Maureen R. і A5 і 935.45    і <--- текущая
-----------------------------------------------      запись
                                                <--- следующая
                                      ^              запись
                                      і
                                      і
                                 путь доступа


GET LESS THAN в языке BASIC

Следующий пример показывает,как прикладная программа использует
команду GET LESS THAN , чтобы найти имена всех подписчиков,
которые получили журналы менее 3 раз перед тем,как они прервали
подписку. Число оставшихся выпусков - ключ 2 в файле подписки.


 110  FIELD #2,20 AS CUST.NAME$,
      6 AS DATE.SUBSCRIBED$,
      6 AS DATE.PAID$,
      3 AS ISSUES.PURCHASED$,
      3 AS ISSUES.REMAINING$
 140 FCB.ADDR%=VARPTR(#2)       'получение адреса FCB


     201/Rev1.00                                              E-11



Управление записями Btrieve
-------------------------------------------------ДД

 150 OPERATION%=10              ' установка кода операции
 155 BUF.LEN%=38                'установка  длины буфера данных
 160 KEY.NUM%=2:KEY.BUF$="003"       'сохранившиеся издания - ключ 2
                                     'начало поиска меньше 3
 190 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                KEY.BUF$,KEY.NUM%)
 200  IF STATUS%<>0 THEN
      PRINT "Ошибка чтения файла.Код=",STATUS%:END
 210 OPERATION%=7               ' установка кода GET PREVIOUS
 220 WHILE STATUS%<>9           'чтение до начала файла
 230  PRINT "Послано",CUST.NAME$
 240 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                KEY.BUF$,KEY.NUM%)
 250  IF (STATUS%<>0) AND (STATUS%<>9) THEN
      PRINT "Ошибка чтения файла.Код=",STATUS%:END
 260 WEND


GET LESS THAN OR EQUAL в языке BASIC

В следующем примере прикладная программа использует команду GET
LESS THAN OR EQUAL , чтобы определить первый дом, который
продается по цене в пределах 110,000 долларов.


 110  FIELD #1,7 AS PRICE$,
      20 AS ADDRESS$,
      6 AS SQUARE.FEET$,
      4 AS YEAR.BUILT$
 140 FCB.ADDR%=VARPTR(#1)       'получение адреса FCB
 150 OPERATION%=11              ' установка кода операции GET LESS THAN
                                ' OR EQUAL
 160 BUF.LEN%=37                'установка  длины буфера данных
 170 KEY.NUM%=0:KEY.BUF$="0110000"   'цена - ключ 0
                                     'начало поиска со 110,000
 190 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                KEY.BUF$,KEY.NUM%)
 200  IF STATUS%<>0 THEN
      PRINT "Ошибка чтения файла.Код=",STATUS%:END
 210  PRINT "Дом по адресу",ADDRESS$,"продается за",PRICE$




















     201/Rev1.00                                              E-12



                                   Пример программ для BASIC
-------------------------------------------------ДД

После выполнение команды GET LESS OR EQUAL  BTRIEVE установит
текущую позицию как показано на рисунке:

-----------------------------------------------
і 0050000 і 330 N.31         і 002200  і 1960 і
-----------------------------------------------
і 0055000 і 11132 Maple Ave. і 002000  і 1965 і
-----------------------------------------------
і 0070000 і 604 Church Streetі 002300  і 1968 і <--- предыдущая
-----------------------------------------------      запись
і 0105000 і 3517 N.Lakes Ave.і 002500  і 1975 і <--- текущая
-----------------------------------------------      запись
і 0220000 і 4500 Oceanfront Aі 003000  і 1980 і <--- следующая
---------------------------------------------        запись
       ^
       і
       і
    путь доступа


GET NEXT в языке BASIC

В следующем примере прикладная программа использует команду GET
NEXT ,чтобы напечатать почтовые ярлыки, отсортированные по
индексу.Индекс  - первый ключ в файле.


  110 FIELD #3,20 AS NAM$,
    20 AS STREET$,
    10 AS CITY$,
    2 AS STATE$,
    5 AS ZIP$
 140 OPERATION%=12:BUF.LEN%=57 'GET FIRST ,чтобы установить тек.позицию
 150 FCB.ADDR%=VARPTR(#3)       'получение адреса FCB
 160 KEY.NUM%=1                 'индекс - ключ 1
 170 KEY.VALUE$=SPACE$(5)       'установка буфера ключа
 350 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   KEY.VALUE$,KEY.NUM%)
 360  IF STATUS%<>0 THEN
      PRINT "Ошибка чтения адреса файла.Код=",STATUS%:END
 370 OPERATION%=6            ' установка кода операции GET NEXT
 380 WHILE STATUS%<>9 THEN   'чтение до конца файла
 390 LPRINT FORM.FEED$       'начало нового ярлыка
 400 LPRINT NAM$             'печать имени
 410 LPRINT STREET$          'печать улицы
 420 LPRINT CITY$," ",STATE$,ZIP$ 'печать города и штата
 430 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   KEY.VALUE$,KEY.NUM%)
 440  IF STATUS%<>0 THEN
      PRINT "Ошибка чтения адреса файла.Код=",STATUS%:END
 450 WEND


GET POSITION в языке BASIC

Следующий пример показывает ,как команда GET POSITION может быть
использована для создания внешнего индекса существующего файла
BTRIEVE.Kогда внешний индекс создан,прикладная программа может


     201/Rev1.00                                              E-13



Управление записями Btrieve
-------------------------------------------------ДД

читать файл внешнего индекса снизу до верху и использовать
команду GET DIRECT , чтобы отсортировать записи в файле BTRIEVE
по полям ,которые были ранее были об'явлены ключевыми полями.


 40 FIELD #1,20 AS NAM$,
    20 AS STREET$,
    10 AS CITY$,
    2 AS STATE$,
    5 AS ZIP$
 50 FIELD #1,4  AS REC.POSITION$
 60 FIELD #2,4  AS POS.INX$,2 AS STATE.INX$
 70 KEY.NUM%=0     'ключ 0 используется для обоих файлов
 80 FILE.PTR%=VARPTR(#1):LEN%=57  'FCB основного  файла
 90 INDX.PTR%=VARPTR(#2):LEN%=6   'FCB индексного файла
 100 NAME.KEY$=SPACE$(20)         'буфер ключа основного файла
 110 STAT.KEY$=SPACE$(2)          'буфер ключа индексного файла
 120 READ.LOW%=12:READ.NEXT%=6:INSERT%=2
 130 CALL BTRV (READ.LOW%,STATUS%,FILE.PTR%,LEN1%,NAME.KEY$,
                   KEY.NUM%)
 140 WHILE STATUS%<>9 THEN      'чтение до конца файла
 150  IF STATUS%<>0 THEN
      PRINT "Ошибка чтения файла.Код=",STATUS%," END
 160 LSET STATE.INX$=STATE$
 170 CALL BTRV (GET.POS%,STATUS%,FILE.PTR%,
               NAME.KEY$,KEY.NUM%)
 180 LSET POS.INX$=REC.POSITION$
 190 CALL BTRV (INSERT%,STATUS%,INDX.PTR%,LEN2%,STAT.KEY$,
                   KEY.NUM%)
 200  IF STATUS%<>0 THEN
      PRINT "Ошибка включения записи.Код=",STATUS%," END
 210 CALL BTRV (READ.NEXT%,STATUS%,FILE.PTR%,LEN1%,NAME.KEY$,
                   KEY.NUM%)
 220 WEND


GET PREVIOUS в языке BASIC

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



 110 FIELD #3,20 AS COMPANY$,
    10 AS TOTAL.SALES$
 140 FCB.ADDR%=VARPTR(#1)       'получение адреса FCB
 145 BUF.LEN%=40                'установка длины буфера данных
 150 OPERATION%=13              ' GET LAST для получения текущей позиции
 160 KEY.NUM%=1                 'общая стоимость - ключ 1
 170 KEY.VALUE$=SPACE$(10)       'установка буфера ключа
 350 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   KEY.VALUE$,KEY.NUM%)
 360  IF STATUS%<>0 THEN
      PRINT "Ошибка чтения файла.Код=",STATUS%:END
 365 'установка кода GET PREVIOUS и длины буфера данных


     201/Rev1.00                                              E-14



                                   Пример программ для BASIC
-------------------------------------------------ДД

 370 OPERATION%=7:BUF.LEN%=38
 380 WHILE STATUS%<>9 THEN   'чтение до конца файла
 420 PRINT COMPANY$,TOTAL.SALES$
 430 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%
                   KEY.VALUE$,KEY.NUM%)
 440  IF (STATUS%<>0) AND (STATUS%<>9) THEN
      PRINT "Ошибка чтения файла.Код=",STATUS%:END
 450 WEND


INSERT  в языке BASIC

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


  110 OP%=2
  130 FILE.PTR%=VARPTR(#2)
  140 KEY.SELECT%=0
  150 FIELD #2,20 AS NAM$,
      6 AS DATE.OF.HIRE$,
      6 AS ANNUAL.SAL$,
  160 LSET NAM$="Jones,Mary E."     'присваивание значений полям
  180 LSET DATE.OF.HIRE$="120882"
  185 LSET ANNUAL.SAL$="020000"
  190 KEY.VAL$=SPACE$(20)
  200 BUF.LEN%=32
  350 CALL BTRV (OP%,STATUS%,FILE.PTR%,BUF.LEN%,KEY.VAL$,
                   KEY.SELECT%)
  360  IF STATUS%<>0 THEN
      PRINT "Код BTRIEVE =",STATUS%:END


После выполнения команды INSERT текущая позиция в файле BTRIEVE
будет следующая:

--------------------------------------
і Adams,David H.  і 150781  і 030000 і
-------------------------------------
і Broun,William J.і 010581  і 055000 і  <--- предыдущая
-------------------------------------        запись
і Jones,Mary E.   і 120882  і 020000 і  <--- текущая
-------------------------------------        запись
і Smith,Bruce L.  і 100182  і 040000 і  <--- следующая
--------------------------------------       запись
               ^
               і
               і
           путь доступа


OPEN    в языке BASIC

Следующий пример показывает,как открыть файл BTRIEVE из программы
на языке BASIC .




     201/Rev1.00                                              E-15



Управление записями Btrieve
-------------------------------------------------ДД

   05 OPEN "SEGMENT.ADR"FOR INPUT AS #1      'строки 5,10,20 не
                                             'требуются для компилятора
                                             'языка BASIC
   10 INPUT #1,SEG.ADDR%.
   20 DEF.SEG=SEG.ADDR%
   30 OPEN "NUL" AS #2 LEN=92
   40 FIELD #2,6 AS EMP.NUM$,
      30 AS EMP.NAM$,
      6 AS HIRE.DATE$,
      50 AS ADDR$
    45 BUF.LEN=92
    50 OP%=0
    60 FILE.PTR%=VARPTR(#2)
    65 KEY.VAL$="C:\DATA\EMPLOYE.BTR"
    70 CALL BTRV (OP%,STATUS%,FILE.PTR%,BUF.LEN%,KEY.VAL$,
                   KEY.SELECT%)
    80 IF STATUS%<>0 THEN
      PRINT "Код BTRIEVE =",STATUS%:END


RESET в языке BASIC

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


   100 OP%=28
   110 CALL BTRV (OPERATION%,STATUS%,FILE.PTR%,BUF.LEN%,KEY.BUFFER$,
                   KEY.NUM%)
    80 IF STATUS%<>0 THEN
      PRINT "Код BTRIEVE =",STATUS%:END


SET DIRECTORY в языке BASIC

В cледующем примере прикладная программа устанавливает текущую
директорию перед тем ,как выполнить команду OPEN.


  60 OPERATION%=17      'установка кода SET DIRECTORY
  70 DIR.PATH$="\DATA"+CHR$(0)
  80 CALL BTRV (OPERATIONS%,STATUS%,DUMMY.FCB%,DUMMY.LEN%
                   DIR.PATH$,KEY.NUMBER%)
  90  IF STATUS%<>0 THEN
      PRINT "Ошибка установки текущей директории.Код ="STATUS%:END
  92 OPEN "NUL" AS #2                    'открытие файла из BASIC
  94 FIELD #2,20 AS FULL.NAME$,
    30 AS STREET$,
    30 AS CITY$,
    2 AS STATE$,
    6 AS ZIP$
 100 OPERATION%=0               'установка кода OPEN
 110 STATUS%=0
 120 FCB.ADDR%=VARPTR(#2)       'получение адреса FCB
 125 BUF.LEN%=98
 130 KEY.BUFFER$="ADDRESS.BTR"
 140 KEY.NUMBER%=0              'установка буфера ключа
 150 CALL BTRV (OPERATIONS%,STATUS%,FCB.ADDR%,BUF.LEN%


     201/Rev1.00                                              E-16



                                   Пример программ для BASIC
-------------------------------------------------ДД

                   KEY.BUFFER$,KEY.NUMBER%)
 360  IF STATUS%<>0 THEN
      PRINT "Ошибка открытия файла.Код=",STATUS%:END


SET OWNER в языке BASIC

В следующем примере показано как установить собственное имя файлу
"Payroll".


  100 OP%=29
  110 FIELD #2,8 AS OWNER$
  120 LSET OWNER$="Payroll"+CHR$(0)
  125 BUF.LEN%=8
  130 KEY.VAL$="Payroll"+CHR$(0)
  135 KEY.NUM%=0
  140 CALL BTRV (OP%,STATUS%,FILE.PTR%,BUF.LEN%
                   KEY.VAL$,KEY.NUM%)
  150  IF STATUS%<>0 THEN
      PRINT "Код BTRIEVE=",STATUS%:END


STAT  в языке BASIC

В следующем примере прикладная программа использует команды STAT
и CREATE ,чтобы почистить файл BTRIEVE.


  FIELD 2,2 AS RECL$,2 AS PGSZ$,2 AS KEY$,
     4 AS NREC$,2 AS VARL$,
     2 AS REC$,2 AS PREALLOC$,
     2 AS POS1$,2 AS LEN1$,
     2 AS FLG1$,4 AS CNT1$,
     1 AS KEYT1$,5 AS RES1$,
     2 AS POS2$,2 AS LEN2$,
     2 AS FLG2$,4 AS CNT2$,
     1 AS KEYT2$,5 AS RES2$,
  50 FCB.ADDR%=VARPTR(#2)       'установка указателя на файл 2
  60 BUF.LEN%=48                'установка длины буфера данных
  70 OP%=0                      'установка кода OPEN
  80 STATUS%=0
  90 FILE.NAME$='LEDGER.BTR"
 100 CALL BTRV (OP%,STATUS%,FCB.ADDR%,BUF.LEN%
                   FILE.NAME$,KEY.NUMBER%)
 110 OP%=15                     'установка кода команды STAT
 120 KEY.BUF$=SPACE$(64)        'установка ключа буфера
 130 BUF.LEN%=48                'и длины буфера данных
 140 CALL BTRV (OP%,STATUS%,FCB.ADDR%,BUF.LEN%
                   KEY.BUF$,KEY.NUMBER%)
 150  IF STATUS%<>0 THEN
      PRINT "Ошибка получения файла статистики.Код=",STATUS%
 160 OP%=1
 170 CALL BTRV (OP%,STATUS%,FCB.ADDR%,BUF.LEN%
                   FILE.NAME$,KEY.NUMBER%)
 180  IF STATUS%<>0 THEN
      PRINT "Невозможно открыть файл.Код=",STATUS%
 190 OP%=14:BUF.LEN%=48


     201/Rev1.00                                              E-17



Управление записями Btrieve
-------------------------------------------------ДД

 210 CALL BTRV (OP%,STATUS%,FCB.ADDR%,BUF.LEN%
                   FILE.NAME$,KEY.NUMBER%)
 220  IF STATUS%<>0 THEN
      PRINT "Невозможно создать файл.Код=",STATUS%


STEP FIRST  в языке BASIC

Смотри  STEP NEXT.


STEP LAST   в языке BASIC

Смотри  STEP PREVIOUS.


STEP NEXT  в языке BASIC

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


  30 OPEN "NUL" AS #1 LEN=86
  40 FIELD #1,6  AS EMP1.NUM$,
    30 AS EMP1.NAM$,
    50 AS ADDR1$
  50 OP1%=0                       'установка кода команды OPEN
  60 KEY.NUM1%=-2                 'открытие в режиме получения
  70 FILE.PTR1%=VARPTR(#1):BUF.LEN1%=86  'указатель на файл 1
                                        'установка длины буфера данных
  80 CALL BTRV (OP1%,STATUS%,FILE.PTR1%,BUF.LEN1%,KEY.VAL1$,
                   KEY.NUM1%)
  90  IF STATUS%<>0 THEN
      PRINT "Код BTRIEVE =",STATUS%  :END
 100 NAME.VAL1$=SPACE$(6): KEY.NUM1%=0
 110 OPEN "NUL" AS #1 LEN=86
 120 FIELD #2,6  AS EMP2.NUM$,
    30 AS EMP2.NAM$,
    50 AS ADDR2$
 125 BUF.LEN2%=86:    OP1%=0      'установка кода команды
                                  'установка длины буфера данных
 140 KEY.NUM2%=0                  'установка режима открытия
 145 FILE.PTR2%=VARPTR(#2)         'указатель на файл 2
 150 NAME.VAL2$="C:\DATA\EMPLOYE2.BTR"
 170 CALL BTRV (OP1%,STATUS%,FILE.PTR2%,BUF.LEN2%,KEY.VAL2$,
                   KEY.NUM2%)
 180  IF STATUS%<>0 THEN
      PRINT "Код BTRIEVE =",STATUS%  :END
 190 NAME.VAL2$=SPACE$(6)         'инициализация ключа буфера
 200 OP2%=33:    OP3%=2: OP4%=24  'установка кода команды
 220 CALL BTRV (OP2%,STATUS%,FILE.PTR1%,BUF.LEN1%,KEY.VAL1$,
                   KEY.NUM1%)
 230 WHILE STATUS%<>9 THEN      'чтение до конца запорченного файла
 240 LSET EMP2.NUM$=EMP1.NUM$
 250 LSET EMP2.NAM$=EMP1.NAM$ :LSET ADDR2$=ADDR1$
 265 'включение записи
 270 CALL BTRV (OP3%,STATUS%,FILE.PTR2%,BUF.LEN2%,KEY.VAL2$,


     201/Rev1.00                                              E-18



                                   Пример программ для BASIC
-------------------------------------------------ДД

                   KEY.NUM2%)
 280  IF STATUS%<>0 THEN
      PRINT "Ошибка чтения файла.Код =",STATUS%  :END
 285 'использование STEP NEXT для получения следующей замиси
 290 CALL BTRV (OP4%,STATUS%,FILE.PTR1%,BUF.LEN1%,KEY.VAL1$,
                   KEY.NUM1%)
 300 WEND


STEP PREVIOUS  в языке BASIC

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


  30 OPEN "NUL" AS #1 LEN=86
  40 FIELD #1,6  AS EMP1.NUM$,
    30 AS EMP1.NAM$,
    50 AS ADDR1$
  50 OP1%=0                       'установка кода команды OPEN
  60 KEY.NUM1%=-2                 'открытие в режиме получения
  60 FILE.PTR1%=VARPTR(#1):BUF.LEN1%=86  'указатель на файл 1
                                        'установка длины буфера данных
  70 NAME.VAL2$="C:\DATA\EMPLOYE.BTR"
  80 CALL BTRV (OP1%,STATUS%,FILE.PTR1%,BUF.LEN1%,KEY.VAL1$,
                   KEY.NUM1%)
  90  IF STATUS%<>0 THEN
      PRINT "Код BTRIEVE =",STATUS%  :END
 100 NAME.VAL1$=SPACE$(6): KEY.NUM1%=0
 110 OPEN "NUL" AS #1 LEN=86
 120 FIELD #2,6  AS EMP2.NUM$,
    30 AS EMP2.NAM$,
    50 AS ADDR2$
 125 BUF.LEN2%=86:    OP1%=0      'установка кода команды
                                  'установка длины буфера данных
 140 KEY.NUM2%=0                  'установка режима открытия
 145 FILE.PTR2%=VARPTR(#2)        'указатель на файл 2
 150 NAME.VAL2$="C:\DATA\EMPLOYE2.BTR"
 170 CALL BTRV (OP1%,STATUS%,FILE.PTR2%,BUF.LEN2%,KEY.VAL2$,
                   KEY.NUM2%)
 180  IF STATUS%<>0 THEN
      PRINT "Код BTRIEVE =",STATUS%  :END
 190 NAME.VAL2$=SPACE$(6)         'инициализация ключа буфера
 200 OP2%=34:    OP3%=2: OP4%=35  'установка кода команды
 220 CALL BTRV (OP2%,STATUS%,FILE.PTR1%,BUF.LEN1%,KEY.VAL1$,
                   KEY.NUM1%)
 230 WHILE STATUS%<>9 THEN      'чтение до конца запорченного файла
 240 LSET EMP2.NUM$=EMP1.NUM$
 250 LSET EMP2.NAM$=EMP1.NAM$ :LSET ADDR2$=ADDR1$
 265 'включение записи
 270 CALL BTRV (OP3%,STATUS%,FILE.PTR2%,BUF.LEN2%,KEY.VAL2$,
                   KEY.NUM2%)
 280  IF STATUS%<>0 THEN
      PRINT "Ошибка чтения файла.Код =",STATUS%  :END
 285 'использование STEP PREVIOUS для получения следующей замиси
 290 CALL BTRV (OP4%,STATUS%,FILE.PTR1%,BUF.LEN1%,KEY.VAL1$,
                   KEY.NUM1%)


     201/Rev1.00                                              E-19



Управление записями Btrieve
-------------------------------------------------ДД

 300 WEND


STOP  в языке BASIC

Следующий пример показывает,как  удалить BTRIEVE из памяти.


 110 OP%=25                      'установка кода команды OPEN
 170 CALL BTRV (OP%,STATUS%,FILE.PTR%,BUF.LEN%,KEY.VAL$,
                   KEY.SELECT%)
 175  IF STATUS%<>0 THEN
      PRINT "Код BTRIEVE =",STATUS%  :END


UNLOCK  в языке BASIC

Следующий пример показывает,как разблокировать запись.


 100 OP%=27 :KEY.NUM%=0
 140 CALL BTRV (OP%,STATUS%,FILE.PTR%,BUF.LEN%,KEY.VAL%,
                   KEY.NUM%)
 150  IF STATUS%<>0 THEN
      PRINT "Код BTRIEVE =",STATUS%  :END


UPDATE  в языке BASIC

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


 110 OP%=5
 130 FILE.PTR%=VARPTR(#2)
 140 KEY.SELECT%=0
 145 KEY.VAL$="Jones,Mary E."
 150 FIELD #2,20 AS NAM$,
     6 AS DATE.OF.HIRE$,
     6 AS ANNUAL.SAL$
 160 BUF.LEN%=32
 170 CALL BTRV (OP%,STATUS%,FILE.PTR%,BUF.LEN%,KEY.VAL$,
                   KEY.SELECT%)
 175  IF STATUS%<>0 THEN
      PRINT "Код BTRIEVE =",STATUS%  :END
                   KEY.NUM1%)
 180 LSET ANNUAL.SAL$="025000"
 190 OP%=3
 350 CALL BTRV (OP%,STATUS%,FILE.PTR%,BUF.LEN%,KEY.VAL$,
                   KEY.SELECT%)
 360  IF STATUS%<>0 THEN
      PRINT "Ошибка чтения файла.Код =",STATUS%  :END


После выполнения команды UPDATE текущая позиция в файле BTRIEVE
будет следующая:



     201/Rev1.00                                              E-20



                                   Пример программ для BASIC
-------------------------------------------------ДД

--------------------------------------
і Adams,David H.  і 150781  і 030000 і
-------------------------------------
і Broun,William J.і 010581  і 055000 і  <--- предыдущая
-------------------------------------        запись
і Jones,Mary E.   і 120882  і 025000 і  <--- текущая
-------------------------------------        запись
і Smith,Bruce L.  і 100182  і 040000 і  <--- следующая
--------------------------------------       запись
                ^
                і
                і
            путь доступа


VERSION в языке BASIC

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


 90 FILE.PTR%=VARPTR(#2)
 100 FIELD #2,2 AS VER$,
     2 AS REV$,
     1 AS NET$
 110 OP%=26:BUF.LEN%=5
 170 CALL BTRV (OP%,STATUS%,FILE.PTR%,BUF.LEN%,KEY.VAL$,
                   KEY.NUM%)
 180  IF STATUS%<>0 THEN
      PRINT "Код BTRIEVE =",STATUS%
 190  END





























     201/Rev1.00                                              E-21


69
                                   Типы расширенных ключей
-------------------------------------------------ДД

 Приложение G:
 Расширенные типы ключей
 -------------------------------------------------

 Это приложение описывает коды расширенных типов ключей
 и внутренний формат памяти для расширенных типов ключей,
 поддерживаемых Btrieve.

 Коды расширенных типов ключей

 Расширенные типы ключей задавайте используя коды в таблице на
 рисунке G.1.

                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і  тип                 код    і
                  і                             і
                  ННННННННННННННННННННННННННННННН
                  і string               0      і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і integer              1      і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і float                2      і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і date                 3      і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і time                 4      і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і decimal              5      і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і money                6      і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і logical              7      і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і numeric              8      і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і bfloat               9      і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і lstring              10     і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і zstring              11     і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і unsigned binary      14     і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                  і autoincrement        15     і
                  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

                            Рисунок G.1.
                   Коды расширенных типов ключей

 Расширенные типы ключей

 Самовозрастающий тип

 Самовозрастающий ключ - это целое число, длиной 2 или 4 байта.
 Btrieve сортирует самовозрастающие ключи по их абсолютному
 значению, сравнивая значения, помещенные в различные записи, по
 символьно справа налево.



     201/Rev1.00                                              G-1



Управление записями Btrieve
-------------------------------------------------ДД

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

      - самовозрастающий ключ не допускает дублирующих значений

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

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

 Следующий параграф описывает, как Btrieve трактует
 самовозрастающие ключи, когда вы включаете запись в файл.

 Если вы задали для самовозрастающего ключа значение двоичного
 нуля, Btrieve  задает значение ключу, основываясь на следующих
 критериях:

      - если запись, которую вы включаете, будет первая запись в
        файле, то Btrieve назначит самовозрастающему ключу
        значение 1 и включает запись в файл

      - если в файле уже существуют записи, то Btrieve назначит
        ключу значение, которое на 1 больше, чем наибольшее
        абсолютное значение в файле, и включает запись в файл

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

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

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

 Тип BFLOAT

 Поле с типом Bfloat - реальное число с одинарной или двойной
 плотностью, хранимое в формате, совместимом с Microsoft BASIC.
 Реальное число с одинарной точностью  хранится с 23-битовой
 мантиссой, 8-битовым порядком со смещением 128 и знаковым битом.





     201/Rev1.00                                              G-2



                                   Типы расширенных ключей
-------------------------------------------------ДД

 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
 -------------------------------------------------
 і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і
 і               і і                                             і
 і               і і                                             і
 і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і
 -------------------------------------------------
 порядок 8 бит    ^    мантисса 23 бита
                  і
                  і
                 знак

 Представление реального числа с двойной плотностью точно такое
 же, за исключением того, что мантисса занимает 55 бит вместо 23.
 Оставшиеся 32 значащих бита хранятся с 0 по 3 байт.

 Тип Date

 Внутренний вид 4-битового поля типа Date выглядит следующим
 образом:

 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
 -------------------------------------------------
 і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і
 і                               і               і               і
 і                               і               і               і
 і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і
 -------------------------------------------------
             год                       месяц             день

 День и месяц хранятся в однобайтном двоичном формате. Год
 2-байтное двоичное число, которое представляет собой полное
 значение года, а не смещение относительно некоторого заданного
 года.

 Тип Decimal

 Поля типа Decimal хранятся как упакованные десятичные числа по
 две десятичные цифры в байте. Этот формат совместим с типом
 данных COMP-3 в стандарте ANSI-74 языка COBOL. Внутреннее
 представление n-байтного десятичного поля выглядит следующим
 образом :


    байт 0              байт 1                   байт n-1

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
 ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД           ДДДДДДДДДДДДДДДДДДД
 і і і і і і і і і і і і і і і і і    . . . . .  і і і і і і і і і
 і       і       і       і       і               і       і       і
 і       і       і       і       і               і       і       і
 і і і і і і і і і і і і і і і і і               і і і і і і і і і
 ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД           ДДДДДДДДДДДДДДДДДДД

 цифра 1 цифра 2 цифра 3 цифра 4                 цифра 2n-1  знак



     201/Rev1.00                                              G-3



Управление записями Btrieve
-------------------------------------------------ДД

 Байт знака имеет значение F или C для положительных чисел и D для
 отрицательных чисел. Заметим, что десятичная точка
 подразумевается. Все значения для ключей типа Decimal должны
 иметь одно и то же число десятичных позиций, чтобы Btrieve
 правильно сравнивал ключи.

 Тип  Float

 Тип Float совместим со стандартом IEEE для реальных чисел с
 одинарной и двойной полтностью. Внутренний формат  для 4-байтного
 числа типа Float содержит 23-битовую мантиссу, 8-битовый порядок
 со смещением 127 и бит знака. Иллюстрация этого представлена
 ниже:

 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
 -------------------------------------------------
 і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і
 і і               і                                             і
 і і               і                                             і
 і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і
 -------------------------------------------------
  ^  8 бит порядка        23 бита мантиссы
  і
  і
 знак

 Поля типа Float, занимающие 8 байтов, имеют 52-битовую мантиссу,
 11-битовый порядок со смещеним 1023 и бит знака. Внутренний
 формат имеет вид:

 байт 7-4
 6 6 6 6 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3
 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2
 -------------------------------------------------
 і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і
 і і                   і                                         і
 і і                   і                                         і
 і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і
 -------------------------------------------------
 ^ 11 бит порядка        20 бита
 і
 і
 знак

 байт 3-0
 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1
 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
 -------------------------------------------------
 і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і
 і                                                               і
 і                                                               і
 і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і
 -------------------------------------------------
                            32 бита мантиссы





     201/Rev1.00                                              G-4



                                   Типы расширенных ключей
-------------------------------------------------ДД

 Тип Integer

 Тип Integer назначается целому числу и должен состоять из четного
 числа байтов. Внутреннее представление типа Integer совпадает
 с двоичным целым форматом Intel, но старший и младший байты в
 слове поменяны  местами. Btrieve рассматривает ключ справа налево
 по словам. Знак должен хранится в первом полубайте за младшим
 байтом. Это совпадает с форматом типа Integer большинства языков.


 Тир Logical

 Расширенный тип ключа Logical хранится как 1 или 2 байтовое
 значение. Btrieve сравнивает логический тип ключа со строкой. Это
 позволяет прикладным программам определять, истино или ложно
 хранимое значение.


 Тип Lstring

 Тип Lstring  в Btrieve соответсвует типу String в языке Pascal.
 Он имеет те же характеристики, что и обычный тип String, за
 исключением того, что первый байт строки содержит двоичную длину
 этой строки. ДЛины, хранимая в байте 0 строка типа Lstring,
 задает число значащих байтов. Btrieve игнорирует любую информацию
 за пределами строки, ограниченной заданной длиной.

 Тип Money

 Внутреннее представление для типа Money полностью совпадает с
 типом Decimal.

 Тип Numeric

 Значение Numeric хранится как ASCII-строка, прижатая к правому
 краю с ведущими нулями. Во внутреннем представлении каждый знак
 занимает 1 байт. Крайний правый байт числа включает встроенный
 знак. Следующая таблица показывает как получить  крайнюю правую
 цифру для положительных и отрицательных чисел из встроенного
 знака.

      число       положительное           отрицательное
         1             A                        J
         2             B                        K
         3             C                        L
         4             D                        M
         5             E                        N
         6             F                        O
         7             G                        P
         8             H                        Q
         9             I                        R
         0             {                        }

 Для положительных чисел крайняя правая цифра может быть
 представлена 1-0 вместо A-{. Btrieve одинаково воспринимает оба
 представления положительных чисел.




     201/Rev1.00                                              G-5



Управление записями Btrieve
-------------------------------------------------ДД

 Тип String

 Тип String в Btrieve  - это последовательность символов,
 упорядоченная слева направо. Каждый символ представлен  в одном
 байте в формате ASCII.

 Тип Time

 Поля типа Time - 4-байтное значение, имеющее следующий внутренний
 вид:

 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
 -------------------------------------------------
 і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і
 і               і               і               і               і
 і               і               і               і               і
 і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і
 -------------------------------------------------
  часы            минуты          секунды      сотые доли секунды

 Тип Unsigned Binary

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

 Тип Zstring

 Тип Zstring  в Btrieve соответсвует типу String в языке C. Он
 имеет те же характеристики, что и обычный тип String, за
 исключением того, что тип Zstring заканчивается байтом,
 содержащим двоичный 0. Btrieve игнорирует любую информацию после
 первого двоичного нуля, входящего в строку типа Zstring.




-------------------------------------------------

                             NOVELL

                   Система управления данными

                         NetWare Btrievе

-------------------------------------------------

ВАЖНОЕ ПРИМЕЧАНИЕ
-------------------------------------------------

Этот продукт программного обеспечения содержит:

     * Руководство по эксплуатации администратора записи Btrieve;

     * Файлы BSERVER.VAP, BROUTER.VAP,BREQUEST.EXE и
       BREQUEST.DLL;

     * Библиотека программ языкового интерфейса;

     * автономные утилиты B и BUTIL .

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

Нельзя распространять любое из следующего:

     * любую часть руководства

     * неотредактированные языковые интерфейсы

     * B и BUTIL автономные утилиты

     * BSERVER.VAP, BROUTER.VAP, BREQUEST.EXE или BREQUEST.DLL;
































     201/Rev1.00                                              1-2



                                   Управление записями Btrieve
-------------------------------------------------

KAK ПОЛЬЗОВАТЬСЯ ДАННЫМ РУКОВОДСТВОМ
-------------------------------------------------

Это руководство предназначено для использования в виде
справочника и руководства по операциям для программистов,
системщиков и аналитиков. B нем даются об'яснения концепций и
операций, которые должны знать программисты при составлении
прикладных программ c применением Btrieve в качестве
администратора записи и системы поиска.

За этим вступлением следует краткий раздел c описанием новых
свойств, добавляемых к Btrieve для этой версии.

     B главе 1      дан обзор свойств, которые предоставляет
                    Btrieve, здесь же дается описание принципов
                    работы Btrieve.

     B главе 2      описаны структуры файла Btrieve, управление
                    файлом и как Btrieve обеспечивает целостность
                    файла.

     B главе 3      описано, как пользоваться программой
                    конфигурации BSETUP, чтобы конфигурировать и
                    устанавливать Btrieve на вычислительной сети.

     B главе 4      описаны программы утилиты, которые включены в
                    Btrieve.

     B главе 5      описано, как сопрягать Btrieve c разными
                    языками программирования.

     B главе 6      объясняется назначение и применение 36
                    операций Btrieve.

     B приложении A перечислены коды операций Btrieve.

     B приложении B перечислены и описаны коды состояния и
                    сообщения oб ошибках, которые Btrieve
                    возвращает Вашей программе.

     B приложениях C,D,E и F приведены примеры программ,
                    написанные в Pascal COBOL, C и BASIC, чтобы
                    продемонстрировать, как использовать Btrieve
                    для различных операций записи.

     B приложении G даны описания и диаграммы расширенных типов
                    ключей Btrieve.

B конце данного руководства дан классификатор терминов Btrieve,
которые встречаются в данном руководстве.

Прежде чем монтировать и использовать Btrieve для разработки
систем базы данных Вы должны ознакомиться c главами 1-3. Если Вы
устанавливаете Btrieve на специальном служебном устройстве, Вы
должны прочитать и запомнить информацию главы 3. Главы 4-6, a
также приложения, необходимые программистам при разработке
программ.



     201/Rev1.00                                              1-3



Управление записями Btrieve
-------------------------------------------------

НОВЫЕ СВОЙСТВА ЭТОЙ ВЕРСИИ
-------------------------------------------------

Btrieve v5.0 обладает некоторыми новыми свойствами. B следующих
разделах перечислены новые качества c их кратким описанием.

ПРОЦЕСС BROUTER VAP.

Процесс BROUTER, включенный c этой версией, обеспечивает
коммуникационной способностью между BSERVER и другими VAPs. Эта
способность дает возможность VAPs, a также прикладным программам
рабочей станции, делать вызовы Btrieve к BSERVER.

УПЛОТНЕНИЕ ДАННЫХ.

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

STEP-ОПЕРАЦИИ.

Три step-операции добавлены к Btrieve. Эти операции - Step First,
Step Previous, Step Last - позволяют Вам трассировать файл в
любом направлении, используя физический порядок записи. Имя
операции Step Direct было заменено на Step Next.

BUTIL ИЗМЕНЕНИЯ.

Новая команда, - CLONE, была добавлена к утилите BUTIL. Эта
команда позваляет Вам дублировать структуру существующего файла,
не нарушая данные, содержащиеся в начальном файле.

Новая опция "Replace Existing File" была добавлена к команде
CREATE. Эта опция позволяет Вам определить, xoтите ли Вы создать
новый файл, если уже существует файл c таким же именем

НОВЫЕ ТИПЫ ФАЙЛА BTRIEVE.

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

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

Key-only файлы. He содержать страниц данных. Вся запись хранится
c индексом, исправляя ввод данных и время поиска. Key-only файлы
очень удобны для быстрого поиска записей и могут использоваться,
как внешние индексы для других файлов.


ПОРОГ СВОБОДНОГО ПРОСТРАНСТВА ДЛЯ ЗАПИСЕЙ ПЕРЕМЕННОЙ ДЛИНЫ.

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


АВТОИНКРЕМЕНТНЫЙ ТИП КЛЮЧА.

Автоинкрементный тип ключа дает возможность пользователю выбрать
ключ, для которого Btrieve автоматически поддерживает значение.
Вы можете использовать автоинкрементные ключи, как номера записи,
которые Btrievе автоматически инкрементирует, когда записи
добавляются к файлу.

РУЧНЫЕ КЛЮЧИ.

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

                                                      Глоссарий
-------------------------------------------------

ГЛОССАРИЙ
-------------------------------------------------

     ACCESS PATH  - путь доступа - это указатель (индекс),
       который состоит из ключевых полей и используется  BTRIEVE
       для получения записей. Номер ключа определяет текущий путь
       доступа. У файла может быть до 24 различных путей доступа.


     ALTERNATE COLLATING SEQUENCE - альтернативная сортирующая
       последовательность -отличная от стандарта ASCII
       последовательность,которая задает порядок сортировки
       ключей в BTRIEVE

     APPLICATION INTERFACE - интерфейс с прикладными программами
       программа,которая осуществляет доступ к структуре файлов
       BTRIEVE из пользовательских программ.

     ASCII - слово,образованное из начальных букв AMERICAN
       STANDARD CODE FOR INFORMATION INTERCHANGE ( американский
       стандартный код для обмена информацией ) - это стандартный
       7-битовый информационный код, включающий 128 стандартных
       символов, в том числе управляющие символы,прописные и
       строчные буквы,числа,знаки.

     CACHE - КЭШ - область оперативной памяти,где хранятся
       страницы физического диска; используется для уменьшения
       количества обращений к физическому диску.

     CONCURANCY CONTROL - параллельный контроль - метод , с
       помощью которого BTRIEVE разрешает возможные
       конфликты,когда  2 станции пытаются обновлять или удалять
       одни и те же записи в одно и то же время. Параллельный
       контроль включает пассивный контроль,контроль транзакций и
       блокирование записей.

     DATABASE - база данных - набор из одной или нескольких
       последовательных записей или файлов по определенной
       предметной области.

     DESCRIPTION FILES - дескрипторные файлы - последовательные
       файлы , содержащих информацию ,необходимую для таких
       утилит BTRIEVE, как CREATE,INDEX и SINDEX.

     DIRECTORY - директория - файл,содержащий структуру диска.
       Директория может содержать поддиректории.

     DOS - то же ,что MS DOS или PC DOS.

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

     FCR - см. FILE CONTROL RECORD

     FIELD - поле - часть области памяти,занимаемой записью.
       Является единицей информации в записи.


Глоссарий
-------------------------------------------------


     FILE - набор однотипных записей , рассматриваемых как единое
       целое.

     FILE CONTROL RECORD - управляющая запись файла - первая
       страница файла,содержащая размер файла и другие
       характеристики.

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

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

     INTEGRITY CONTROL - интегрированный контроль - метод,
       используемый для обеспечения целостности файлов. В
       частности , BTRIEVE использует файл сохраненного образа,
       чтобы гарантировать целостность файла и базы данных.

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

     KEY FIELD - ключевое поле - поле BTRIEVE используется для
       идентификации  определенных записей.

     KEY NUMBER - номер ключа - идентификатор, связанный с
       определенным ключевым полем в файле

     MEMORY RESIDENT - резидентная память - атрибут программы ,
       который разрешает отображению программы сохраняться в
       памяти даже после окончания выполнения. Операционная
       система не загружает другие программы в память,отведенную
       для резидентной памяти. Под управлением DOS программа
       BTRIEVE RECORD MANAGER является программой с резидентной
       памятью,она находится в памяти до рестарта системы или
       выполнения команды STOP.

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

     NULL KEY - нулевой ключ - разрешает пользователю задавать
       для поля пустое значение

     OPERATION - команда - специальное действие ( DELETE,CREATE,
       GET EQUAL и т.д.),манипулирующее записями в BTRIEVE-
       файле.

     PAGE - страница - единица дисковой памяти,содержащая число
       байтов,кратное 512 ,но не более 4096 байтов. Страница
       наименьшая единица памяти , которой BTRIEVE обменивается
       между основной памятью и дисковой.



                                                      Глоссарий
-------------------------------------------------



     PARTITIONED FILE - разделенный файл - логический файл
       BTRIEVE, состоящий из 2 отдельных физических дисковых
       файлов. Это позволяет BTRIEVE создавать логический файл
       размером больше,чем физический размер диска.

     POSITIONING - позиционирование - установление текущего
       положения управляющей записи внутри текущего пути доступа,
       приводящего к успешному завершению команды.

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

     PRIMARY FILE - первичный файл - первоначальная часть
       разделенного файла до выполнения команды EXTEND.

     RECORD - запись - набор из 1 или более последовательных
       полей по одной теме,например записи платежной ведомости
       служащих.

     RECORD MANAGER - программа управления записями - часть
       BTRIEVE, которая выполняет пересылку логических записей
       между ползовательской программой и физическим диском.

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

     TRANSACTION - транзакция - набор логически связанных команд
       BTRIEVE для работы не более ,чем с 12 файлами.

     UTILITIES - утилиты - стандартные программы, которые
       выполняют "поддерживающие" функции, такие как
       BUTIL-COPY,_STOP и т.д.


Яндекс цитирования