Навигация по БД Назад В начало Вперед
<оператор-навигации> = [<имя-логической-таблицы> | viewTable ]
  <тип-операции> [ <параметр-оптимизации> ] [<параметр-визуализации>]
  [<таблица-для-навигации>] [<конструкция-where>];

<имя-логической-таблицы> - если не указано, то берется главная логическая таблица (интерфейса, формы).

viewTable - явно связывает оператор навигации с главной логической таблицей.

<тип-операции> - указывает, какая запись таблицы станет текущей:

<тип-операции> = getFirst | getLast | getNext | getPrev

getFirst - переход к первой строке физической таблицы, если таблица указана в секции <таблица-для-навигации>. Иначе переход к первой строке текущей логической таблицы.

getLast - переход к последней строке физической таблицы, если таблица указана в секции <таблица-для-навигации>. Иначе переход к последней строке текущей логической таблицы.

getNext - переход к следующей строке физической таблицы, если таблица указана в секции <таблица-для-навигации> (таблица должна быть открыта и должна иметь текущую запись). Иначе переход к следующей строке текущей логической таблицы.

getPrev - переход к предыдущей строке физической таблицы, если таблица указана в секции <таблица-для-навигации> (таблица должна быть открыта и должна иметь текущую запись). Иначе переход к предыдущей строке текущей логической таблицы.

<параметр-оптимизации> - управление оптимизацией работы сервера БД.

<параметр-оптимизации> = nocache | fastfirstrow

nocache - при считывании записей из таблицы механизм кэширования будет выключен.

fastfirstrow - считывать по одной записи из таблицы за одно обращение к БД. Параметр имеет смысл, если заранее известно, что потребуется только одна запись (не будет последующих getNext и getPrev).

<параметр-визуализации> - включение /выключение визуализации итераций по таблице. По синтаксису и реализации совпадают с элементом <параметр-визуализации> операторов модификации (см. раздел "Операторы Insert, Update и Delete. ").

<таблица-для-навигации> - указывает, по какой физической таблице будет производиться навигация:

<таблица-для-навигации> = <имя-таблицы-из-выборки>

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

<конструкция-where> - условие подцепки для оператора навигации (см. "Конструкция where. ").

Если вызван оператор навигации с конструкцией where, то на время своего выполнения он отменяет текущую подцепку для таблицы в которой происходит поиск /перебор записей. Если найденная запись не попадает в текущую подцепку, то модификатор возвращает статус tsOk, но текущая запись становится невалидной. Перед вызовом операторов навигации, условие в where для которых не является более сильным чем условие текущей подцепки рекомендуется вызывать ResetBounds, после вызова модификатора и выборки найденных значений рекомендуется вызывать SetBounds для таблицы модификатора.

Снимается только подцепка! Условия (condition) уровня ЛТ не снимаются - это не подцепка. Если к таблице для навигации в ЛТ подцеплена какая-то другая, то эта подцепка также не будет сниматься.

Вообще все операции идут в ЛТ. Конструкция where и т.п. дает возможность лишь изменить текущую структуру ЛТ (что к чему и как подцеплено, какие и на что наложены ограничения), но вне ЛТ не идёт ничего!

Если в конструкции where нет ограничений на таблицу для навигации, то начиная с Атлантис 5.4.23 компилятор выдает предупреждение: "Не заданы ограничения на таблицу <имя-таблицы>". Подавить сообщение можно использованием root:

getfirst x$files where ((root == x$files.xf$code
					 and 10 == x$fields.xe$filecode));

Если не указана таблица для навигации, то начиная с Атлантис 5.4.23 компилятор выдает предупреждение: "Модификатор <название> выполняется для всей логической таблицы". Подавить сообщение можно использованием viewTable:

if (getFirst viewTable <> tsOk)

Необходимо учитывать, что после вызова операторов навигации на экране НЕ происходит автоматическое переотображение информации о текущей записи. То есть, если алгоритм меняет текущую запись, необходимо либо сохранить и восстановить позицию с помощью функций PushPos и PopPos, либо вызвать метод переотображения информации о текущей позиции RescanPanel (tn<имя таблицы>).

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

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

Пример

if (getFirst Employee <> tsOk)
  Message('Сотрудников не найдено');

Если результат модификатора Вас не интересует, то для подавления ненужного сообщения (в данном случае, скорее всего, сообщения "Ключ не найден" при пустой таблице Employee) можно написать

if (getFirst Employee <> tsOk) {};

Версия

Предупреждения: "Не заданы ограничения на таблицу <имя-таблицы>" и "Модификатор <название> выполняется для всей логической таблицы" и соответствующий им контроль - начиная с Атлантис 5.4.23.