Цитата:
Изначально опубликовано kashperuk
[B]Все гениальное просто. B]

Ох уж эти гении.... Предложили типичный пример борьбы с производительностью системы. именно "с", а не "за"
Может лучше по нашему, по рабоче-крестьянски, но зато с толком и расстановкой
Аксапты под рукой нет, поэтому вместо примера получилось вот такое руководство по программированию
делаете постоянную таблицу, например RecIdFilterTable (saveDataPerCompany=NO)
с тремя int столбцами
RefRecId
SessionId
Cookie
Строим индексы
первый по RefRecId
второй составной по SessioId и Cookie
заносите в таблицу RecId тех записей, которые нужно будет отобрать в каком нито вашем крутом запросе
в SessionId заносите код текущей сессии Axapta - получаем из одноименной функции
в Cookie любую хрень, уникальную в пределах сессии - можно, например,
через Sequence создать свою системную серию или "украсть" очередной RecId через SystemSequence
Связка SessionId - Cookie будет уникальным идентификатором набора RecId в пределах всей Аксапты, запоминаем их значения.
На самом деле достаточно и Cookie, но об этом позже
Теперь пишем свой запрос и дописываем к нему кусок со связкой к RecIdFilterTable
selеct МояСуперТаблица
....
....
exists join RecIdFilterTable
where МояСуперТаблица.RecId == RecIdFilterTable.RefRecId
&& RecIdFilterTable.SessionId == Запомненный код сессии
&& RecIdFilterTable.Cookie == Запомненный COOKIE
Не забываем создать индекс по RecId в МояСуперТаблица
Записи в RecIdFilterTable вставляем через RecordInsertList
В результате имеем все что хотели - быструю выборку неограниченного количества произвольных записей
Осталось только определиться с уборкой мусора в этой таблице
1. После того как запрос отработал чистим таблицу, передавая в качестве критерия для команды delete_from запомненные значения SessionID и Cookie
2. Для того, чтобы убирать мусор, который может появится в случае аварийного падения аксапты между набиванием RecId в таблицу и последующим стриранием этих данных, при старте сессии чистим эту таблицу, используя в качестве критерия только SessionId. Такую чистку следует вызвывать из application.startupPost()
Прочитав все это огромная просьба сначала попробовать, прежде чем начать все это "опускать" (как так, лишняя таблица, запись куда то, лучше мы напишем супервыернутый запрос на 3 экрана с 200 ранжами и т.д., или как предлагали временную таблицу сделаем) Все затраты вычислительных ресуров связанные с описанной инфраструктурой при ее грамотной реализации многократно компенсируются за счет существенного уменьшения времени выполнения запроса.
Для любителей экономить RecId которые так безалаберно растранжириваются здесь на временные записи: класс SystemSequence позволяет запретить генерацию RecId для определенных таблиц - точно сейчас не скажу - нет аксапты под руками - кажется
suspendRecIdGeneration(). Вызовите ее с tablenum(RecIdFilterTable) и никто не тронет драгоценных RecId. Вместо них будут набиваться по очереди 2 "левых" значения, но в данном случае это абсолютно не важно
Кто будет делать, не поленитесь оформить все это в виде класса - вещь универсальная на 100 %
и не забудьте там метод который приделывает фильтр к произвольному QueryBuildDataSource
Добавка:
Про автоматичкскую генерацию "левых" RecId наврал. это оказался побочный эффект одного алгоритма. Так что если не хотите тратить настоящие RecId заполняйте это поле вручную любым значением