Работа с нерегулярными таблицами БД средствами языка ASL

Содержание

  1. Основные понятия
  2. Порядок работы
  3. Отличия от регулярных таблиц БД

Основные понятия

С точки зрения конкретного проекта нерегулярными считаются все таблицы, не входящие в регулярную структуру проекта, хранимую в DBD-файле. Нерегулярные таблицы БД могут быть использованы для решения следующих задач.

Порядок работы

Работа с нерегулярными таблицами предполагает несколько этапов.

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

Отличия от регулярных таблиц БД

  1. Операции модификации не поддерживают контроль целостности
  2. Все операции с нерегулярной таблицей - нетранзакционные. Аналогом фиксации транзакции можно считать вызов DETACH_TABLE(TableName, Save), т.к. именно здесь новые данные записываются на диск. Аналог аннулирования транзакции - вызов DETACH_TABLE(TableName, Purge), в том числе неявный, данные на диск не попадают, поэтому гарантируется их неизменность на диске.
  3. Сетевое разделение нерегулярной таблицы БД реализуется на режиме открытия, который указывается в параметре OpenMode процедуры ATTACH_TABLE. В режиме чтения (Input) таблицу могут подключить одновременно несколько пользователей, а в режимах создания (Create) и модификации (Output) - только один пользователь. Более того, пока таблица другой БД подключена в нашем проекте как нерегулярная, работа с ней, как с регулярной, в "родном" проекте невозможна (справедливо для всех режимов подключения).
  4. Нерегулярные таблицы всегда находятся в жестком режиме, свойство TABLE.AccessDataMode по чтению всегда дает adm_RIDGE. Но блокировки записей не ставятся.
  5. Нерегулярная таблица никогда не имеет архивной половины, несмотря на указание навигатора.
  6. На нерегулярные таблицы БД не действуют файловые фильтры.
  7. Процедура GETTIMESTAMP работает по-разному для регулярных и нерегулярных таблиц.
  8. Нерегулярные таблицы помечаются значком '+' в диалоге "Структура базы данных".

 Примеры программ с использованием нерегулярных таблиц см. в описании процедуры-функции ATTACH_TABLE.