Если в таблице, которую планируется фильтровать таким способом - не будет индекса по recid - фильтр будет тормозить.
Не лучше ли пойти другим путем - просто перечислить через запятую те значения полей, по которым построен индекс в фильтруемой таблице таблице (AccountNum например в вашем случае)
и запихнуть это в Range dataSource данной таблицы ?
например qbr.value("10001,10003,10005,15155,13555,15555 и так далее")
Только нужно помнить что у Range есть ограничение на длинну этого самого Range - 250 символов как я понял.
Но это обходится добавлением нового Range в dataSource формы.
Вот пример реализации добаления Range в форме SalesTable
X++:
// Удалить все Range по SalesId
while (SalesTable_qr.query().dataSourceTable(tablenum(SalesTable)).findRange(fieldnum(SalesTable, SalesId)))
{
SalesTable_qr.query().dataSourceTable(tablenum(SalesTable)).clearRange(fieldnum(SalesTable, SalesId));
}
// Получить список Range, разбитых по длинне не более 250 символов
rangeCon = salesStatusFilter.criteriaCon();
if (rangeCon == conNull())
{
SalesTable_qr.query().dataSourceTable(tablenum(SalesTable)).addRange(fieldnum(SalesTable, SalesId)).value("null");
}
else
{
// Может быть добавлено несколько Range
for (i = 1; i <= conLen(rangeCon); i++)
{
rangeTmp = conPeek(rangeCon, i);
qbr = SalesTable_qr.query().dataSourceTable(tablenum(SalesTable)).addRange(fieldnum(SalesTable, SalesId));
qbr.value(rangeTmp);
}
}
SalesTable_ds.research();
Вот пример как эти Range подготовить (разбитые по 250 символов)
X++:
range = "";
while ( )
{
salesTable = ;
pr.setText("Обработка заказа: " + salesTable.SalesId);
pr.incCount();
if ( )
{
if (strLen(range + "," + salesTable.SalesId) > #maxQueryRangeLen)
{
statusFilterCon += range;
range = "";
}
if (range)
range += ",";
range += salesTable.SalesId;
i++;
}
}
if (range)
{
statusFilterCon += range;
}
Таким способом можно фильтровать сотни (может и тысячи) произвольных записей.
При этом будет работать индекс в фильтруемой таблице