02.04.2013, 15:04 | #41 |
Участник
|
Мне наш ещё один программист подсказал почти такой же способ, как и вы, но с одним "но": создать 2 объекта datasource для двух таблиц EmplTable и VendSpListJour и в источник EmplTable привязать к VendSpListJour, как дочерний, после активировать их связи и тогда получается то, что мне необходимо В любом случае спасибку нажал вам за то, что потратили своё время и помогли мне.
|
|
02.04.2013, 18:31 | #42 |
Участник
|
Если когда-нибудь будете делать через Query в АОТ, то метод paсk должен выглядеть так:
X++: public container pack() { return [#CurrentVersion, #CurrentList, (queryRun) ? queryRun.pack() : conNull()]; } X++: public boolean unpack(container packedClass) { version version = runbase::getVersion(packedClass); container queryCon; switch (version) { case #CurrentVersion: [version,#CurrentList,queryCon] = packedClass; if (sysQuery::isPackedOk(queryCon)) queryRun = new queryRun(queryCon); else this.initQuery(); break; default: return false; } return true; } |
|
02.04.2013, 18:36 | #43 |
Участник
|
Еще для себя напишу, чтобы не забыть
На моем примере на картинке в начале этой темы я показал форму, которая построена на Query, использующую таблицу InventBatch. Это необычная таблица, привязанная сразу к двум таблицам в запросе: к таблице InventDim по полю InventBatchId и к таблице InventTable по полю ItemId. Чтобы запрос с этой таблицей работал корректно, я источник данных для нее сделал дочерним к InventDim через дизайнер Query в АОТ, а в методе initQuery() моего класса программно добавил связку с источником данных InventTable X++: void initQuery() { Query query = new Query(queryStr(zInventAdvanceProdDateReport)); QueryBuildDatasource qbds; QueryBuildRange qbr; ; qbds = query.dataSourceTable(tableNum(InventBatch)); qbr = sysQuery::findOrCreateRange(qbds, fieldNum(InventBatch, ItemId)); qbr.value("((ItemId == InventTable_1.ItemId))"); qbr.status(RangeStatus::Hidden); queryRun = new QueryRun(query); } Последний раз редактировалось Ace of Database; 02.04.2013 в 18:40. |
|
29.05.2013, 18:14 | #44 |
Участник
|
Подниму этот вопрос.
Мне нужно производить определённые действия(проставлять checkbox-ы) только для тех строк в таблице, в которых поле сотрудник равно тому, что я выбрал в динамическом фильтре. В туториалах нет такого. Подскажите, как мне сравнивать со значением из дин.фильтра моё значение? Заранее спасибо за ответы. |
|
29.05.2013, 18:26 | #45 |
Участник
|
Global::inRange(), хотя если есть "динамический фильтр", то, наверно, есть и запрос, и лучше использовать запрос, а не пытаться его расковырять и анализировать "вручную".
|
|
29.05.2013, 20:50 | #46 |
Участник
|
Да, вы правы, запрос есть. Я и хочу в запросе использовать значение из этого фильтра. Не знаю как, правда. Поэтому и спрашиваю.
|
|
30.05.2013, 00:38 | #47 |
Участник
|
Если читать тему с начала, то получается, что уже есть QueryRun с запросом, критерии фильтрации записей уже определены пользователем (через э.. динамический фильтр), запрос этот включает ту таблицу, записи в которой надо обновить. Так что еще нужно для полного счастья? По идее - только прописать в запросе для нужной таблицы qbds.update(true), открыть транзакцию и начать выбирать записи для обновления согласно указанным пользователем критериям. В чем же загвоздка-то?
|
|
30.05.2013, 10:03 | #48 |
Участник
|
Цитата:
Сообщение от gl00mie
Если читать тему с начала, то получается, что уже есть QueryRun с запросом, критерии фильтрации записей уже определены пользователем (через э.. динамический фильтр), запрос этот включает ту таблицу, записи в которой надо обновить. Так что еще нужно для полного счастья? По идее - только прописать в запросе для нужной таблицы qbds.update(true), открыть транзакцию и начать выбирать записи для обновления согласно указанным пользователем критериям. В чем же загвоздка-то?
|
|
30.05.2013, 10:08 | #49 |
Участник
|
|
|
31.05.2013, 17:02 | #50 |
Участник
|
|
|
10.06.2013, 09:56 | #51 |
Участник
|
Что-то нашаманил, что критерии в динамическом фильтре не выбираются вообще, будто заблокированы. Буду переписывать этот запрос с нуля. И, да, уважаемый gl00mie, вы меня неправильно поняли. Я не буду через квери обновлять записи в таблице, я с его помощью просто хочу выбрать их
Последний раз редактировалось user_ax; 10.06.2013 в 09:58. |
|
10.06.2013, 10:07 | #52 |
Ищущий знания...
|
Цитата:
X++: QueryBuildRange.status(RangeStatus::Locked);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
10.06.2013, 10:16 | #53 |
Участник
|
Цитата:
X++: qbds_vendinvoice.orderMode(OrderMode::GroupBy); |
|
10.06.2013, 11:46 | #54 |
Участник
|
Всё-таки не до конца понятно, как применить этот динамический фильтр. В методе 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. |
|
10.06.2013, 12:11 | #55 |
Участник
|
Цитата:
|
|
10.06.2013, 12:15 | #56 |
Участник
|
Цитата:
Измените значение макроса CurrentVersion в методе classDeclaration, что бы указать что старые сохранённые значения параметров уже устарели и нужно заново проинициализировать их значениями поумолчанию. |
|
10.06.2013, 12:17 | #57 |
Участник
|
Цитата:
Сообщение от 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; } |
|
10.06.2013, 12:21 | #58 |
Участник
|
Цитата:
Сообщение от S.Kuskov
А метод initParmDefault срабатывает? Поставьте в нём точку останова или выведите тестовое сообщение, что бы проверить.
Измените значение макроса CurrentVersion в методе classDeclaration, что бы указать что старые сохранённые значения параметров уже устарели и нужно заново проинициализировать их значениями поумолчанию. Значение макросов менял, не помогает, всё равно делает выборку всех значений, независимо от фильтра. |
|
10.06.2013, 12:33 | #59 |
Участник
|
Цитата:
Сообщение от 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). |
10.06.2013, 12:38 | #60 |
Участник
|
Цитата:
Может быть действительно дело в том, где запускается класс? |
|
Теги |
runbasereport, диалог, динамическая форма, периодическая операция, программно |
|
|