AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.10.2016, 12:32   #1  
Мышелов Федор is offline
Мышелов Федор
Участник
 
26 / 10 (1) +
Регистрация: 26.02.2014
Проблемы с фильтром для формы
Уже второй день бьюсь над фильтром для формы. требуется выводить только журналы (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  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
А почему у вас во втором случае InnerJoin?
В вашем случае fetchMode надо указывать так:
X++:
QBDS_DeliveryWHTKFactLine.fetchMode(QueryFetchMode::One2Many);
__________________
// no comments
Старый 11.10.2016, 13:19   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Мышелов Федор Посмотреть сообщение
Помогите, что я не так написал!
Всё верно на первый взгляд.
Расскажите какой результат вы получили? Фильтр скрыл не все что нужно или наоборот больше чем нужно?



To dech:
Цитата:
Сообщение от dech Посмотреть сообщение
А почему у вас во втором случае InnerJoin?
После Exists Join в соединениях следующего уровня уже не принципиально Inner или Exists.

Цитата:
Сообщение от dech Посмотреть сообщение
В вашем случае fetchMode надо указывать так:
FetchMode должен быть всегда One2One Связывание источников данных в запросах
Старый 11.10.2016, 15:05   #4  
Мышелов Федор is offline
Мышелов Федор
Участник
 
26 / 10 (1) +
Регистрация: 26.02.2014
он не реагирует на выбор поставщика
а на сервер отправил вот это
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  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
FetchMode должен быть всегда One2One Связывание источников данных в запросах
Согласен.
__________________
// no comments
Старый 11.10.2016, 15:11   #6  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
В приведенном вами запросе нет выбора поставщика.
Еще смущает строка
QBDS_DeliveryWHTKTable = this.query().addDataSource(tableNum(DeliveryWHTKTable));
В ней не указано, как связывается добавленный датасорс с исходным квери, или исходный был пустым?
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 11.10.2016, 15:20   #7  
Мышелов Федор is offline
Мышелов Федор
Участник
 
26 / 10 (1) +
Регистрация: 26.02.2014
внес исправления но результат не изменился
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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А Value для добавленного Range где-то задаётся? Какой запрос теперь уходит на сервер?

И замените всё-таки One2Many на One2One.
Старый 11.10.2016, 15:35   #9  
Мышелов Федор is offline
Мышелов Федор
Участник
 
26 / 10 (1) +
Регистрация: 26.02.2014
прошу меня извинить это я тестовую версию с 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);
это его же executeQuery
X++:
switch (VendAccountSelect.valueStr()) {
   case '':
        QBDS_DeliveryWHTKPurchTable.enabled(false);
        break;
   default:
        QBDS_DeliveryWHTKPurchTable.enabled(true);
        QBR_VendAccount.value(VendAccountSelect.valueStr());
   }
вызов происходит по modified методу контрола
Старый 11.10.2016, 15:36   #10  
Мышелов Федор is offline
Мышелов Федор
Участник
 
26 / 10 (1) +
Регистрация: 26.02.2014
ну и запрос к базе
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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Мышелов Федор Посмотреть сообщение
ну и запрос к базе
Т.е. как будто-бы последний датасурс на который и накладывается фильтр так и не активировался.
У вас точно выполняется строчка кода
X++:
QBDS_DeliveryWHTKPurchTable.enabled(true);
?


Можно временно убрать все enabled(false), что бы понять в них ли дело или нет?
Старый 12.10.2016, 09:56   #12  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
Еще вопрос, QBDS_DeliveryWHTKPurchTable.enabled(true); выполняется до super() в executeQuery или после?
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
Старый 12.10.2016, 10:15   #13  
VORP is offline
VORP
Участник
Аватар для VORP
 
146 / 95 (4) ++++
Регистрация: 26.05.2006
Ещё может быть полезно скопировать запрос в джоб и убедиться что оно работает там. Потом добавить enabled и убедиться что оно работает.
Кроме того, в executeQuery можно попробовать подобную конструкцию вместо Вашей:

(
X++:
findOrCreateRange_W(this.queryRun().query(), fieldNum(...), VendAccount.value());
Разница в том что если запрос исполнялся править, наверное, надо query в уже созданном queryRun, а не query, по которому он был создан.
Старый 12.10.2016, 10:18   #14  
VORP is offline
VORP
Участник
Аватар для VORP
 
146 / 95 (4) ++++
Регистрация: 26.05.2006
Мне кажется, что использовать QBR_VendAccount может быть неправильно, поскольку он содержится в исходном запросе.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вызов формы с заранее заданым фильтром. Dima_Dima DAX: Программирование 22 03.03.2009 17:34
Проблемы отображение новой Веб-формы на портале IvanS DAX: Программирование 0 02.04.2008 12:08
Создание Lookup формы Maxim Gorbunov DAX: База знаний и проекты 9 26.06.2007 16:44
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Динамические Lookup формы. Андрей Василюк DAX: База знаний и проекты 0 07.12.2001 07:07
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:02.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.