05.06.2015, 12:13 | #1 |
Участник
|
Как query прикрутить к форме?
Добрый день, допустим я сформировал query с помощью класса RecordRefrenceList_RU. А как прикрутить его к форме CustTable, не могу придумать. То есть мне нужно открыть форму с отфильтрованным списком. Спасибо.
|
|
05.06.2015, 12:25 | #2 |
Участник
|
Добрый день, вам на init датасорса CustTable после super() надо написать что-то вроде
X++: qbds = CustTable_ds.query().dataSourceTable(tablenum(CustTable)); qbds.clearDynalinks(); refList = RecordReferenceList_RU::construct(); // тут заполнить refList значениями ну или как вы его заполняете refList.flush(); refList.join(qbds); // просто приджоинить |
|
05.06.2015, 12:45 | #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; } При этом будет работать индекс в фильтруемой таблице |
|
05.06.2015, 16:40 | #4 |
Участник
|
Далеко не всегда этот способ лучше.
Особенно в сложных запросах, в которых приходится план запроса в БД фиксировать. Так как запрос каждый раз разный в БД получается (в зависимости от числа параметров). Также число параметров в запросе ограничено, так что ваш вариант имеет ограничения (Хотя конечно в большинстве случаев мы их и не достигнем) Эта тема уже на форуме обсуждалась. У каждого подхода есть свои + и - |
|