|
|
|
|
#1 |
|
Участник
|
Всё-таки не до конца понятно, как применить этот динамический фильтр. В методе initQuery находится мой запрос и динамический фильтр на него не действует, то есть, если выбираю критерии - в запрос они не добавляются...
Может быть его нужно как-то активизировать или что ? Подскажите, пожалуйста. Метод initParmDefault X++: public void initParmDefault() { this.initQuery(); super(); } X++: void initQuery() { Query query = new Query(); QueryBuildDataSource qbds_vendsp,qbds_vendsplist,qbds_vendinvoice; QueryBuildRange qbr; ; qbds_vendsplist = query.addDataSource(tablenum(VendSpListTrans)); qbds_vendsplist.orderMode(OrderMode::GroupBy); qbds_vendsplist.addSelectionField(fieldnum(VendSpListTrans,InternalSp)); qbds_vendsplist.addSelectionField(fieldnum(VendSpListTrans,SpClosed)); qbds_vendsplist.addSelectionField(fieldnum(VendSpListTrans,ItemId)); qbds_vendsplist.addSelectionField(fieldnum(VendSpListTrans,SpQty)); qbds_vendsplist.addSortField(fieldnum(VendSpListTrans,InternalSp)); qbds_vendsplist.addSortField(fieldnum(VendSpListTrans,Itemid)); qbds_vendsplist.addSortField(fieldnum(VendSpListTrans,SpClosed)); qbds_vendsplist.addSortField(fieldnum(VendSpListTrans,SpQty)); //->скрытие полей-индексов в динамических фильтрах qbr = qbds_vendsplist.addRange(fieldnum(VendSpListTrans,InternalSpTrans)); qbr.status(RangeStatus::Hidden); //<- qbds_vendinvoice = qbds_vendsplist.addDataSource(tablenum(VendInvoiceTrans)); qbds_vendinvoice.orderMode(OrderMode::GroupBy); qbds_vendinvoice.addSelectionField(fieldnum(VendInvoiceTrans,ItemId)); qbds_vendinvoice.addSelectionField(fieldnum(VendInvoiceTrans,InternalSp)); qbds_vendinvoice.addSortField(fieldnum(VendInvoiceTrans,ItemId)); qbds_vendinvoice.addSortField(fieldnum(VendInvoiceTrans,InternalSp)); // qbds_vendinvoice.addSortField(fieldnum(VendInvoiceTrans,Qty)); qbds_vendinvoice.addSelectionField(fieldnum(VendInvoiceTrans,Qty),SelectionField::Sum); qbds_vendinvoice.addLink(fieldnum(VendSpListTrans,InternalSp), fieldnum(VendInvoiceTrans,InternalSp)); //->скрытие полей-индексов в динамических фильтрах qbr = qbds_vendinvoice.addRange(fieldnum(VendInvoiceTrans,PurchId)); qbr.status(RangeStatus::Hidden); qbr = qbds_vendinvoice.addRange(fieldnum(VendInvoiceTrans,InvoiceDate)); qbr.status(RangeStatus::Hidden); qbr = qbds_vendinvoice.addRange(fieldnum(VendInvoiceTrans,InvoiceId)); qbr.status(RangeStatus::Hidden); qbr = qbds_vendinvoice.addRange(fieldnum(VendInvoiceTrans,LineNum)); qbr.status(RangeStatus::Hidden); qbr = qbds_vendinvoice.addRange(fieldnum(VendInvoiceTrans,numberSequenceGroup)); qbr.status(RangeStatus::Hidden); qbr = qbds_vendinvoice.addRange(fieldnum(VendInvoiceTrans,InternalInvoiceId)); qbr.status(RangeStatus::Hidden); //<- qbds_vendsp = qbds_vendinvoice.addDataSource(tablenum(VendSpListJour)); qbds_vendsp.addSelectionField(fieldnum(VendSpListJour,SpClosed)); qbds_vendsp.addRange(fieldnum(VendSpListJour,EmplId)); qbds_vendsp.addLink(fieldnum(VendInvoiceTrans,InternalSp),fieldnum(VendSpListJour,InternalSp)); info(qbds_vendsplist.toString()); queryRun = new SysQueryRun(query); Последний раз редактировалось user_ax; 10.06.2013 в 11:53. |
|
|
|
|
#2 |
|
Участник
|
Цитата:
|
|
|
|
|
#3 |
|
Участник
|
Цитата:
Сообщение от gl00mie
Я не утверждал, что Query/QueryRun может генерить SQL-операторы update вместо select'а, однако, в Аксапте при обновлении записей в цикле (без использования update_recordset) принято в этом цикле выбирать записи на обновление (по аналогии с while select forupdate). Можно, конечно, в цикле их выбирать без указания, что они будут обновляться (по аналогии с while select), и потом либо перевыбирать на обновление, либо отрубать проверку, что запись была выбрана на обновление, но в общем случае надо понимать, зачем делать именно так, вместо того чтобы изначально просто выбирать записи на обновление и не усложнять код.А класс запускается изначально где, на сервере или на клиенте? И где он собственно использует запрос для выборки данных, на сервере или на клиенте? Если на сервере, то учитывают ли pack/unpack, что надо паковать запрос? Потому что без этого изменения, внесенные в критерии фильтрации запроса на клиенте, при возврате управления на сервер будут утеряны.
![]() В свойстве Run On стоит Called From. В методе пакую запрос посредством X++: return [#CurrentVersion,#CurrentList, queryrun.query().pack()];X++: switch (version) { case #CurrentVersion: [version,#CurrentList] = packedClass; if (SysQuery::isPackedOk(queryCon)) queryRun = new QueryRun(queryCon); else this.initQuery(); break; default: return false; }
|
|
|
|
|
#4 |
|
Участник
|
Цитата:
Сообщение от user_ax
В методе пакую запрос посредством
X++: return [#CurrentVersion,#CurrentList, queryrun.query().pack()];X++: switch (version) { case #CurrentVersion: [version,#CurrentList] = packedClass; if (SysQuery::isPackedOk(queryCon)) queryRun = new QueryRun(queryCon); else this.initQuery(); break; default: return false; } Код: [version,#CurrentList, queryCon] = packedClass; |
|
|
|
| За это сообщение автора поблагодарили: gl00mie (1). | |
|
|
#5 |
|
Участник
|
Цитата:
Может быть действительно дело в том, где запускается класс? |
|
|
|
|
#6 |
|
Участник
|
Вопрос был не об этом, а о том, где запускается класс. Если на самом классе стоит Called from, то надо смотреть свойства пункта меню, которым он запускается. В конце концов, можно в main поставить точку останова и посмотреть в отладчике.
Цитата:
Сообщение от user_ax
В методе пакую запрос посредством
X++: return [#CurrentVersion,#CurrentList, queryrun.query().pack()];X++: switch (version) { case #CurrentVersion: [version,#CurrentList] = packedClass; if (SysQuery::isPackedOk(queryCon)) queryRun = new QueryRun(queryCon); else this.initQuery(); break; default: return false; } X++: [#CurrentVersion,#CurrentList, queryrun.query().pack()] [version,#CurrentList] = packedClass; X++: [version,#CurrentList, queryCon] = packedClass; |
|
|
|
|
#7 |
|
Участник
|
Цитата:
Сообщение от gl00mie
Вопрос был не об этом, а о том, где запускается класс. Если на самом классе стоит Called from, то надо смотреть свойства пункта меню, которым он запускается. В конце концов, можно в main поставить точку останова и посмотреть в отладчике.Тут непонятно, что есть queryCon и каким образом оно получается из packedClass. Кроме того, подозрение вызывает несоответствие количества пакуемых и распаковываемых элементов в pack/unpack:
X++: [#CurrentVersion,#CurrentList, queryrun.query().pack()] [version,#CurrentList] = packedClass; X++: [version,#CurrentList, queryCon] = packedClass; querycon - контейнер, в который пакуется содержимое запроса, насколько я понял... По поводу несоответствия кол-ва переменных - поправил уже, недоглядел. |
|
|
|
|
#8 |
|
Участник
|
Цитата:
Измените значение макроса CurrentVersion в методе classDeclaration, что бы указать что старые сохранённые значения параметров уже устарели и нужно заново проинициализировать их значениями поумолчанию. |
|
|
|
|
#9 |
|
Участник
|
Цитата:
Сообщение от S.Kuskov
А метод initParmDefault срабатывает? Поставьте в нём точку останова или выведите тестовое сообщение, что бы проверить.
Измените значение макроса CurrentVersion в методе classDeclaration, что бы указать что старые сохранённые значения параметров уже устарели и нужно заново проинициализировать их значениями поумолчанию. Значение макросов менял, не помогает, всё равно делает выборку всех значений, независимо от фильтра. |
|
|
| Теги |
| runbasereport, диалог, динамическая форма, периодическая операция, программно |
|
|
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|