Работа с нерегулярными таблицами БД средствами языка ASL
С точки зрения конкретного проекта
нерегулярными
считаются все таблицы, не входящие в
регулярную структуру проекта,
хранимую в DBD-файле. Нерегулярные таблицы БД
могут быть использованы для решения следующих задач.
- Создание периодических накопительных таблиц с целью ускорения и
упрощения построения отчетов.
- Создание новых отношений, нужных только для
работы конкретной программы или окна.
- Работа с регулярными таблицами другого проекта.
Работа с нерегулярными таблицами предполагает несколько этапов.
- Описание структуры и связей при помощи
процедур CREATE_TABLE, CREATE_FIELD,
CREATE_INDEX, CREATE_LINK,
CREATE_INDEX_AND_LINK, тех же самых, что
используются в DBS-программах для описания
регулярных таблиц БД. Никаких структурных запретов на данный момент не
налагается, в частности подключаемую таблицу можно описать как справочник или
даже как Lend-таблицу к регулярной,
что впрочем не отменяет необходимости
подумать, прежде чем сделать что-либо
подобное. Кроме того необходимо обращением к свойству
TABLE.StructureVersion
(до появления этого свойства это делалось при помощи процедуры
SET_VERSION_OF_TABLE) указать версию структуры, т.е.
порядковый номер изменения структуры таблицы. При
подключении таблицы другой БД версию можно
узнать в диалоге "Структура базы данных"
(комбинация клавиш Ctrl+F10). Для прочих нерегулярных таблиц
версию придется аккуратно вести вручную. Всякий раз при изменении структуры
нерегулярной таблицы программист обязан одновременно изменить и номер версии
(для обеспечения уникальности лучше его всегда инкрементировать). Аккуратность в
данном вопросе абсолютно необходима, поскольку физические файлы нерегулярной
таблицы не
содержат описания своей структуры, а содержит только номер версии, который т.о. является
единственным средством
контроля соответствия описанной структуры таблицы физическим файлам. При
несоответствии поведение системы непредсказуемо.
- Задание времени жизни нерегулярной таблицы. По времени жизни нерегулярные таблицы
делятся на программные и
локальные. Процедура CREATE_TABLE создает программную нерегулярную
таблицу БД, структура которой будет автоматически уничтожена по завершении
создавшей ее программы. Программную
нерегулярную таблицу БД можно преобразовать в локальную присвоением значения
TABLE.Scope_Local свойству
TABLE.Scope.
Структура локальной таблицы БД существует до окончания сеанса
клиента ASB или до вызова процедуры
KILL_ALL_IRREGULAR_TABLES, как следствие, локальные таблицы могут применятся
в окнах.
- Подключение нерегулярной таблицы, т.е. связывание идентификатора таблицы БД,
заданного в CREATE_TABLE, с физическими файлами данных и индексов при помощи
процедуры-функции ATTACH_TABLE. К этому моменту описание структуры таблицы
должно быть полностью завершено, добавить что-либо
впоследствии будет невозможно. ATTACH_TABLE проверяет формат файлов,
совпадение номера версии структуры, и т.п. В режимах открытия
Input
и Output
при несовпадении заданной версии с номером версии, считанным из заголовка
файла данных, ATTACH_TABLE завершится исключением 112, в режиме Create
версия прописывается в заголовок создаваемого файла данных.
- Собственно работа с нерегулярной таблицей мало отличается от работы с
регулярной.
- Используются те же процедуры
позиционирования и
модификации.
- Значения полей текущей записи доступны непосредственно.
- Нерегулярные таблицы видны в отладчике и в диалоге "Структура базы
данных".
- Отключение нерегулярной таблицы.
- Программную таблицу можно отключить при
помощи процедуры DETACH_TABLE. Режимы открытия
Output
и Create
требуют явного отключения, в противном случае после
успешного окончания программы будет выброшено
исключение 122. Если
программа,
где выполнен ATTACH_TABLE, но еще не было DETACH_TABLE,
завершается исключением, то DETACH_TABLE выполняется
автоматически, причем с параметром Purge
. После отключения таблицы она становится недоступной для
файловых операций и обращений к полям, однако структура таблицы,
описанная CREATE_TABLE и пр., будет сохранена до
окончания программы, поэтому после
отключения таблицы готовым описанием можно воспользоваться для повторного
подключения.
- Локальную таблицу
отключить вызовом DETACH_TABLE невозможно, будет выброшено
исключение 978. Только
KILL_ALL_IRREGULAR_TABLES отключает и уничтожает структуры сразу
всех нерегулярных таблиц.
- Операции модификации не поддерживают
контроль целостности
- Все операции с нерегулярной таблицей -
нетранзакционные. Аналогом
фиксации транзакции можно считать вызов DETACH_TABLE(TableName,
Save), т.к. именно здесь новые данные записываются на диск. Аналог аннулирования
транзакции - вызов DETACH_TABLE(TableName,
Purge), в том числе неявный, данные на диск не попадают, поэтому гарантируется их неизменность на диске.
- Сетевое разделение нерегулярной таблицы БД реализуется на режиме открытия,
который указывается в параметре OpenMode процедуры ATTACH_TABLE. В режиме чтения (Input)
таблицу могут подключить одновременно несколько пользователей, а в режимах
создания (Create) и
модификации (Output) - только один пользователь. Более
того, пока таблица другой БД подключена в нашем проекте как нерегулярная, работа с ней, как с регулярной,
в "родном" проекте невозможна (справедливо для всех режимов
подключения).
- Нерегулярные таблицы всегда находятся в жестком режиме, свойство
TABLE.AccessDataMode по
чтению всегда дает adm_RIDGE. Но блокировки
записей не ставятся.
- Нерегулярная таблица никогда не имеет архивной половины, несмотря на указание
навигатора.
- На нерегулярные таблицы БД не действуют файловые фильтры.
- Процедура GETTIMESTAMP работает
по-разному для регулярных и нерегулярных таблиц.
- Нерегулярные таблицы помечаются значком '+' в диалоге
"Структура базы данных".
Примеры программ с
использованием нерегулярных таблиц см. в
описании процедуры-функции ATTACH_TABLE.