Оператор цикла по таблице Назад В начало Вперед

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

<оператор-цикла-по-таблице> = [ external ] _loop
	[ backward | forward ]
	[ fullcache | stdcache | nocache ]
	( <имя-таблицы> | viewTable )
	[ <параметры-оптимизации> ]
	[ <параметр-визуализации> ]
	[ <конструкция-where> ]
	<оператор>

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

backward, forward - указывает направление итерации по записям таблицы (по умолчанию - forward, от меньшего значения индекса к большему значению).

fullcache - в цикле будут считаны все записи в рамках текущих ограничений, что эквивалентно вызову функции SetRowSetSize (dcsInfinity) данный параметр используется по умолчанию.

stdcache - при считывании записей из таблицы цикла будет использоваться стандартный механизм кэширования, что эквивалентно вызову функции SetRowSetSize (dcsDefault).

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

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

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

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

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

<параметры-оптимизации> = (-) | (+)
  | (<имя-таблицы> { , <имя-таблицы> } )

(-) - символ "-" отключает оптимизацию.

(+) - символ "+" указывает компилятору, что набор таблиц, используемых внутри тела цикла, необходимо определить по исходному тексту программы.

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

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

<параметр-визуализации> - управляет визуализацией итераций по таблице. По синтаксису и реализации совпадают с элементом <параметр-визуализации> операторов модификации.

<конструкция-where> - ограничения /условия /порядок, определяющие множество и порядок итерируемых записей (см. раздел "Конструкция where. ").

<оператор> - любой оператор языка VIP.

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

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

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

Конфликты могут возникнуть и в пределах одного приложения в случае модификации итерируемой таблицы с синонима, если модификации подвергается множество итерируемых записей. Поведение оператора _loop в этом случае никак не регламентируется. Оператор external _loop в этом случае "не увидит" вставленных записей, прервется с ошибкой в случае их удаления, но нормально отработает (т.е. будет использовать новые значения) в случае их модификации.

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

Если внутри оператора _loop используется удаление и вставка записей для экземпляра <имя_таблицы> или любого его синонима, то при использовании атрибута fullcache не будет происходить выбрасывания измененных данных из кэша. Это приведет к тому, что данные, модифицированные через синоним, не будут видны через экземпляр <имя_таблицы>.

В случае использования цикла external _loop, все операции по всем экземплярам таблицы не будут сказываться на выборке данных.

Также в цикле _loop запрещается осуществлять модификацию полей экземпляра физической итерируемой таблицы, участвующих в текущих ограничениях на таблицу. Для всех экземпляров физической таблицы (в том числе и итерируемого) не рекомендуется производить вставку /модификацию /удаление, приводящее к изменению множества итерируемых записей.

Версия

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