11.10.2016, 12:32 | #1 |
Участник
|
Проблемы с фильтром для формы
Уже второй день бьюсь над фильтром для формы. требуется выводить только журналы (DeliveryWHTKTable) для которых существуют строки (DeliveryWHTKFactLine) для которых в свою очередь существуют записи в таблице (DeliveryWHTKPurchTable).
Помогите, что я не так написал! X++: QBDS_DeliveryWHTKTable = this.query().addDataSource(tableNum(DeliveryWHTKTable)); QBDS_DeliveryWHTKFactLine = QBDS_DeliveryWHTKTable.addDataSource(tablenum(DeliveryWHTKFactLine)); QBDS_DeliveryWHTKFactLine.addLink(fieldnum(DeliveryWHTKTable, DeliveryWHTKId),fieldnum(DeliveryWHTKFactLine, DeliveryWHTKId)); QBDS_DeliveryWHTKFactLine.joinMode(JoinMode::ExistsJoin); QBDS_DeliveryWHTKFactLine.fetchMode(0); QBDS_DeliveryWHTKPurchTable = QBDS_DeliveryWHTKFactLine.addDataSource(tablenum(DeliveryWHTKPurchTable)); QBDS_DeliveryWHTKPurchTable.addLink(fieldnum(DeliveryWHTKFactLine, MovetJournalId),fieldnum(DeliveryWHTKPurchTable, JournalId)); QBDS_DeliveryWHTKPurchTable.joinMode(JoinMode::InnerJoin); QBDS_DeliveryWHTKPurchTable.fetchMode(0); Последний раз редактировалось Мышелов Федор; 11.10.2016 в 12:39. |
|
11.10.2016, 12:56 | #2 |
Участник
|
А почему у вас во втором случае InnerJoin?
В вашем случае fetchMode надо указывать так: X++: QBDS_DeliveryWHTKFactLine.fetchMode(QueryFetchMode::One2Many);
__________________
// no comments |
|
11.10.2016, 13:19 | #3 |
Участник
|
Всё верно на первый взгляд.
Расскажите какой результат вы получили? Фильтр скрыл не все что нужно или наоборот больше чем нужно? To dech: После Exists Join в соединениях следующего уровня уже не принципиально Inner или Exists. FetchMode должен быть всегда One2One Связывание источников данных в запросах |
|
11.10.2016, 15:05 | #4 |
Участник
|
он не реагирует на выбор поставщика
а на сервер отправил вот это SELECT ... FROM DELIVERYWHTKTABLE A WHERE (A.DATAAREAID='pan') AND EXISTS (SELECT 'x' FROM DELIVERYWHTKFACTLINE B WHERE ((B.DATAAREAID='pan') AND (A.DELIVERYWHTKID=B.DELIVERYWHTKID))) ORDER BY A.DATAAREAID DESC,A.DELIVERYWHTKID DESC OPTION(FAST 1) Последний раз редактировалось Мышелов Федор; 11.10.2016 в 15:10. |
|
11.10.2016, 15:08 | #5 |
Участник
|
Цитата:
Сообщение от S.Kuskov
FetchMode должен быть всегда One2One Связывание источников данных в запросах
__________________
// no comments |
|
11.10.2016, 15:11 | #6 |
Участник
|
В приведенном вами запросе нет выбора поставщика.
Еще смущает строка QBDS_DeliveryWHTKTable = this.query().addDataSource(tableNum(DeliveryWHTKTable)); В ней не указано, как связывается добавленный датасорс с исходным квери, или исходный был пустым?
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
11.10.2016, 15:20 | #7 |
Участник
|
внес исправления но результат не изменился
X++: QBDS_DeliveryWHTKFactLine = this.query().dataSourceTable(tableNum(DeliveryWHTKTable)).addDataSource(tableNum(DeliveryWHTKFactLine)); QBDS_DeliveryWHTKFactLine.addLink(fieldNum(DeliveryWHTKTable, DeliveryWHTKId), fieldNum(DeliveryWHTKFactLine, DeliveryWHTKId)); QBDS_DeliveryWHTKFactLine.joinMode(joinMode::ExistsJoin); QBDS_DeliveryWHTKFactLine.fetchMode(QueryFetchMode::One2Many); QBDS_DeliveryWHTKPurchTable = QBDS_DeliveryWHTKFactLine.addDataSource(tableNum(DeliveryWHTKPurchTable)); QBDS_DeliveryWHTKPurchTable.addLink(fieldNum(DeliveryWHTKFactLine, MovetJournalId), fieldNum(DeliveryWHTKPurchTable, JournalId)); QBDS_DeliveryWHTKPurchTable.joinMode(joinMode::ExistsJoin); QBDS_DeliveryWHTKPurchTable.fetchMode(QueryFetchMode::One2Many); QBR_VendAccount = QBDS_DeliveryWHTKPurchTable.addRange(fieldNum(DeliveryWHTKPurchTable, VendAccount)); |
|
11.10.2016, 15:22 | #8 |
Участник
|
А Value для добавленного Range где-то задаётся? Какой запрос теперь уходит на сервер?
И замените всё-таки One2Many на One2One. |
|
11.10.2016, 15:35 | #9 |
Участник
|
прошу меня извинить это я тестовую версию с One2Many скинул
это в методе init datasources DeliveryWHTKTable X++: QBDS_DeliveryWHTKFactLine = this.query().dataSourceTable(tableNum(DeliveryWHTKTable)).addDataSource(tableNum(DeliveryWHTKFactLine)); QBDS_DeliveryWHTKFactLine.addLink(fieldNum(DeliveryWHTKTable, DeliveryWHTKId), fieldNum(DeliveryWHTKFactLine, DeliveryWHTKId)); QBDS_DeliveryWHTKFactLine.joinMode(joinMode::ExistsJoin); QBDS_DeliveryWHTKFactLine.fetchMode(QueryFetchMode::One2One); QBDS_DeliveryWHTKPurchTable = QBDS_DeliveryWHTKFactLine.addDataSource(tableNum(DeliveryWHTKPurchTable)); QBDS_DeliveryWHTKPurchTable.addLink(fieldNum(DeliveryWHTKFactLine, MovetJournalId), fieldNum(DeliveryWHTKPurchTable, JournalId)); QBDS_DeliveryWHTKPurchTable.joinMode(joinMode::ExistsJoin); QBDS_DeliveryWHTKPurchTable.fetchMode(QueryFetchMode::One2One); QBR_VendAccount = QBDS_DeliveryWHTKPurchTable.addRange(fieldNum(DeliveryWHTKPurchTable, VendAccount)); QBDS_DeliveryWHTKPurchTable.enabled(false); X++: switch (VendAccountSelect.valueStr()) { case '': QBDS_DeliveryWHTKPurchTable.enabled(false); break; default: QBDS_DeliveryWHTKPurchTable.enabled(true); QBR_VendAccount.value(VendAccountSelect.valueStr()); } |
|
11.10.2016, 15:36 | #10 |
Участник
|
ну и запрос к базе
SELECT ... FROM DELIVERYWHTKTABLE A WHERE (A.DATAAREAID='pan') AND EXISTS (SELECT 'x' FROM DELIVERYWHTKFACTLINE B WHERE ((B.DATAAREAID='pan') AND (A.DELIVERYWHTKID=B.DELIVERYWHTKID))) ORDER BY A.DATAAREAID DESC,A.DELIVERYWHTKID DESC OPTION(FAST 1) |
|
12.10.2016, 07:32 | #11 |
Участник
|
Т.е. как будто-бы последний датасурс на который и накладывается фильтр так и не активировался.
У вас точно выполняется строчка кода X++: QBDS_DeliveryWHTKPurchTable.enabled(true); Можно временно убрать все enabled(false), что бы понять в них ли дело или нет? |
|
12.10.2016, 09:56 | #12 |
Участник
|
Еще вопрос, QBDS_DeliveryWHTKPurchTable.enabled(true); выполняется до super() в executeQuery или после?
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет. |
|
12.10.2016, 10:15 | #13 |
Участник
|
Ещё может быть полезно скопировать запрос в джоб и убедиться что оно работает там. Потом добавить enabled и убедиться что оно работает.
Кроме того, в executeQuery можно попробовать подобную конструкцию вместо Вашей: ( X++: findOrCreateRange_W(this.queryRun().query(), fieldNum(...), VendAccount.value()); |
|
12.10.2016, 10:18 | #14 |
Участник
|
Мне кажется, что использовать QBR_VendAccount может быть неправильно, поскольку он содержится в исходном запросе.
|
|
|
Похожие темы | ||||
Тема | Ответов | |||
Вызов формы с заранее заданым фильтром. | 22 | |||
Проблемы отображение новой Веб-формы на портале | 0 | |||
Создание Lookup формы | 9 | |||
Русская локализация Axapta 3 ? | 59 | |||
Динамические Lookup формы. | 0 |
|