Похоже я продолжаю упорно рекламировать одну и ту же фичу
Выборка произвольных записей одним запросом
Набираем RecId в Set любым способом (пример пробега по выделенным записям во втором сообщении) ну или вот готовый код:
X++:
public static Set dsGetMarked(FormDataSource _ds)
{
Set markedRecords = new Set(Types::Int64);
Common markedRecord;
if (! _ds.anyMarked() && _ds.cursor())
{
markedRecords.add(_ds.cursor().RecId);
}
else
{
markedRecord = _ds.getFirst(true);
while (markedRecord)
{
markedRecords.add(markedRecord.RecId);
markedRecord = _ds.getNext();
}
}
return markedRecords;
}
Смотрим пример использования класса RecordReferenceList_RU по ссылке выше. У данного класса есть возможность явно установить набор обрабатываемых записей setRecords().
Чуть измененный пример из исходной темы:
X++:
static void refList_TutorialSet(Args _args)
{
RecordReferenceList_RU refList = RecordReferenceList_RU::construct();
RecordReference_RU ref;
InventTable inventTable;
int i;
Set markedRecords = new Set(Types::Int64);
Query query;
QueryBuildDataSource qbds;
QueryRun queryRun;
;
setprefix("RecordReferenceList_RU");
while select inventTable
{
markedRecords.add(inventTable.RecId);
i++;
if (i > 10)
{
break;
}
}
refList.setRecords(markedRecords);
refList.flush();
info("Query");
query = new Query();
qbds = query.addDataSource(tablenum(InventTable));
refList.join(qbds);
queryRun = new QueryRun(query);
while (queryRun.next())
{
info(queryRun.get(tablenum(InventTable)).caption());
}
info("Select");
while select inventTable
join ref
where ref.RefRecId == inventTable.RecId
&& ref.ParmId == refList.getParmId()
{
info(inventTable.caption());
}
refList.cleanup();
}
плюсы/минусы/замечания описаны в исходной теме