![]() |
#3 |
Участник
|
Если в таблице, которую планируется фильтровать таким способом - не будет индекса по 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(); 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; } При этом будет работать индекс в фильтруемой таблице |
|