Использование позиции |
В таблицах имеется специальное поле с идентификатором x$position, и типом positionHandle of <имя-таблицы> (см. "Позиции. "). Данное поле автоматически распознается компилятором и имеет платформозависимое (имеется в виду БД, в том числе и таблицы в памяти) значение.
Пример:
BaseDoc.x$position
Использование переменных и полей этого типа допускается только в операторе присваивания и в операторе сравнения на "равно" и "не равно". В переменную можно присвоить значение позиции любой таблицы.
При попытке присвоения в поле таблицы позиции от другой таблицы и при сравнении позиций от различных таблиц генерируется исключение exIncompatiblePositionField.
Пример:
var p : positionHandle; var pBaseDoc : positionHandle of BaseDoc; var pSoprHoz : positionHandle of SoprHoz; _try { p := pBaseDoc; pSoprHoz := p; // исключительная ситуация } _except on exIncompatiblePositionField: // сделать что-нибудь полезное
Имеется константа с именем NULL для обозначения отсутствия позиций. NULL можно сравнивать и присваивать позициям любых таблиц.
if (p <> NULL) BaseDoc.x$positon := p;
При присваивании в поле x$position таблицы корректного значения позиции, например переданного в качестве параметра, реального обращения к БД происходить не будет, работа с таблицей будет происходить, как будто произошло считывание данных (виртуальный GetDirect) и вызвали функцию ClearBuffer. Для передачи вместе с позицией значений полей необходимо использовать механизм структур. Стоит обратить внимание на то, что при этом флаги измененности значения полей будут выставлены. Т.е. если после этого записать конструкцию типа update current myTable, то значения всех присвоенных таким образом полей попадут в запрос на модификацию.
Если скопировать только позицию, без буфера, а затем вызвать update current myTable, то значения полей в БД изменены не будут.
При присваивании позиции НИКАКИЕ ограничения не проверяются. Это может привести к тому, что запись будет не соответствовать текущим фильтрам, баундам и т.д.