Если дополнительная таблица подцеплена по уникальному ключу, то просто включите её в подзапрос для оператора цикла используя параметры оптимизации
Код: Выделить всё
create view as from RootTable, LeafTable where ((RootTable.LeafRef == LeafTable.NRec));
...
_loop RootTable (LeafTable) {
if IsValid(tnLeafTable) {
...
}
}
При означенных условиях с помощью параметра оптимизации мы заставляем Атлантис доставлять данные корневого и подчинённого узлов одним запросом. IsValid проверяет, выполнялась ли доставка данных для узла и, если нет, то выполняет соответствующий запрос и возвращает статус операции, иначе - просто возвращает статус. В нашем случае работа метода сведётся к простой проверке статуса узла, поскольку попытка выборки данных уже была осуществлена (результаты частично уже лежат в кэшах драйвера; следующие порции доставляются и помещаются в кэши по мере необходимости).
ReReadRecord = ReReadRecord(CurTable) здесь совершенно не нужен? Более того, он может быть вреден для работы _loop.
Set здесь совершенно не нужен. Да и вообще, зачем запрос на перерисовку данных во время цикла, кроме как для "мультиков"? Тем более что Атлантис, ориентируясь на левую часть оператора присваивания (переменная ObjRem_), решит, что перерисовать нужно узел... tnNoTable и в нём же - взвести флаг наличия модификаций. Из обсуждения не видно, что все эти эффекты - ожидаемы и желательны.
Далее, если подчинённая таблица подцеплена по неуникальному ключу (как, к примеру, спецификация документа), то данные для неё в цикле ВСЁ РАВНО будут доставляться отдельным запросом. То есть, либо неявно - в вызове IsValid, либо явно - с помощью модификатора getXXXX. Разница заключается в том, что модификатор - это безоговорочный приказ, а метод выполняет попытку доставки только при необходимости. Только нужно учитывать, что по такой подцепке в подчинённой таблице может обнаружиться более, чем одна запись.
Код: Выделить всё
create view as from RootTable, LeafTable where ((RootTable.NRec == LeafTable.RootRef));
...
_loop RootTable {
...
if getfirst LeafTable = tsOk {
...
}
// более годный вариант для многоразового применения в рамках одной итерации
if IsValid(tnLeafTable) {
...
}
}
Итак, валидность подцепленной таблицы НУЖНО проверять. И так было всегда.