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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.04.2011, 15:15   #1  
Deepoint is offline
Deepoint
Участник
SAP
 
60 / 14 (1) ++
Регистрация: 01.04.2011
Записей в блоге: 1
? NoExistsJoin и addRange
Здравствуйте уважаемые.
Вот с такой проблемой столкнулся:
есть код
X++:
QueryBuildDataSource qbdsMain = query.dataSourceTable(tablenum(BankPaymentOrderJour_RU));
QueryBuildDataSource qbdsLedgerJoined;
qbdsLedgerJoined  = qbdsMain.addDataSource(tablenum(BankAccountTrans),'BankAccountTrans');
            if (bankPaymentOrderJourReport_RU.dimension())
            {
               qbdsLedgerJoined.addRange(fieldId2Ext(fieldnum(BankAccountTrans, Dimension),1)).value(bankPaymentOrderJourReport_RU.dimension());
            }
            qbdsLedgerJoined.relations(true);
            qbdsLedgerJoined.joinMode(JoinMode::NoExistsJoin);
Собственно в случае если bankPaymentOrderJourReport_RU.dimension() установлен запрос возвращает некорректные значения, а именно нет фильтра на этот самый dimension. Буду признателен за любой совет или помощь.
Старый 25.04.2011, 15:22   #2  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,486 / 408 (16) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
То, что нет фильтра - неудивительно. NotExistsJoin всего лишь позволяет отобрать те записи, которым нет соответствия в подчинённом датасоурсе. Никакие фильтры на него наложить не получится. Для этого нужен InnerJoin
__________________
С уважением,
Вячеслав
Старый 25.04.2011, 15:34   #3  
Deepoint is offline
Deepoint
Участник
SAP
 
60 / 14 (1) ++
Регистрация: 01.04.2011
Записей в блоге: 1
А какие варианты решения данной проблемы могут быть? Мне нужны записи из таблицы BankPaymentOrderJour_RU которых нет в BankAccountTrans и у которых, опять же, в BankAccountTrans есть заданный Dimension.
Старый 25.04.2011, 15:46   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Deepoint Посмотреть сообщение
Мне нужны записи из таблицы BankPaymentOrderJour_RU которых нет в BankAccountTrans и у которых, опять же, в BankAccountTrans есть заданный Dimension.
Ну вы и формулируете

Если я правильно понял задачу, то вы хотите отобрать все записи BankPaymentOrderJour_RU для которых в таблице BankAccountTrans нет записей с указанным Dimension.

Dimension - это масив? Коли так, то range нужно накладывать отдельно на каждый фильтруемый элемент масива
X++:
dimension = bankPaymentOrderJourReport_RU.dimension();
qbdsLedgerJoined.addRange(fieldId2Ext(fieldnum(BankAccountTrans, Dimension),1)).value(dimension[1])
Старый 25.04.2011, 16:39   #5  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,486 / 408 (16) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Думаю, что дело тут не в Range, а в
X++:
qbdsLedgerJoined.relations(true);
скорее всего связь идёт по номеру ваучера. А в данном контексте это неправильно. Надо убрать указанную строчку и добавить для qbdsLedgerJoined несколько addLink, по 1 на каждую финаналитику. А уж потом использовать NotExistsJoin
__________________
С уважением,
Вячеслав
Старый 25.04.2011, 17:09   #6  
Deepoint is offline
Deepoint
Участник
SAP
 
60 / 14 (1) ++
Регистрация: 01.04.2011
Записей в блоге: 1
Цитата:
Сообщение от pitersky Посмотреть сообщение
Думаю, что дело тут не в Range, а в
X++:
qbdsLedgerJoined.relations(true);
скорее всего связь идёт по номеру ваучера. А в данном контексте это неправильно. Надо убрать указанную строчку и добавить для qbdsLedgerJoined несколько addLink, по 1 на каждую финаналитику. А уж потом использовать NotExistsJoin
Опробовал Ваш вариант, к сожалению результат все тот же. Но все равно спасибо.
Старый 25.04.2011, 17:35   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
После формирования query, в качестве самоконтроля, можно вывести в инфолог текст получившегося SQL-запроса.
X++:
info(query.DataSourceNo(1).toString());
Посмотрев на него сразу станет понятно каких релейшинов или ранджей не хватает
Старый 03.07.2012, 08:59   #8  
Лиса-а-а is offline
Лиса-а-а
Участник
1C
 
16 / 10 (1) +
Регистрация: 19.03.2012
Адрес: Самара
! и снова я блондиню....:blush:
помогите перевести вот этот запрос с SQL в нечно красивейшее через QueryBuildDataSource

X++:
Select VendInvoiceJour.InvoiceDate,VSN_PURCHORDERJOUR.CENTERPROFIX,VendInvoiceTrans.ItemId   from VendInvoiceJour
inner join VendInvoiceTrans on VendInvoiceTrans.PurchId = VendInvoiceJour.PurchId
inner join PurchTable on PurchTable.PurchId  = VendInvoiceTrans.PurchId
inner join PurchLine on PurchLine.PurchId  = PurchTable.PurchId 
inner join VSN_PURCHORDERJOUR on VSN_PURCHORDERJOUR.ORDERID = PurchLine.VSN_PURCHORDERID
where VSN_PURCHORDERJOUR.CENTERPROFIX= '008-001' and
 VendInvoiceJour.InvoiceDate >= '2011/03/01'
and VendInvoiceJour.InvoiceDate <= '2011/03/20'
или может скиньте какой нить пример где больше 2х таблиц связывается
и может есть у кого нить ссылки на литературу по этому делу на русском языке?
__________________
Работа программиста и шамана имеют много общего!- Оба бормочут непонятные слова, совершают непонятные действия и не могут объяснить как оно работает....
Старый 03.07.2012, 09:14   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Нет никаких принципиальных отличий между добавлением второй таблицы и добавлением последующих. Лиса-а-а, вы попробуйте, если не получиться, то выложите свой код, кто-нибудь обязательно поможет и заодно раскажет в чём была проблема.

Получить готовое решение с нуля как-то не педагогично
Старый 03.07.2012, 10:31   #10  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,689 / 405 (17) +++++++
Регистрация: 23.03.2006
если вы пытались и у вас не получилось, то скорее всего у вас ошибка в fetchmode, нужно всем соединяемым таблицам задать:
X++:
    qbds.fetchMode(QueryFetchMode::One2One);
За это сообщение автора поблагодарили: Лиса-а-а (1).
Старый 03.07.2012, 10:47   #11  
Лиса-а-а is offline
Лиса-а-а
Участник
1C
 
16 / 10 (1) +
Регистрация: 19.03.2012
Адрес: Самара
!
такс.. начинаю с малого, но и тут засада
X++:
   Query                   query = this.queryRun().query();
    QueryBuildDataSource    
    dataSourceJourTest  = query.addDataSource(tableNum(VendInvoiceJour));

    dataSourceJourTest  = dataSourceJourTest.addDataSource(VendInvoiceTrans,'VendInvoiceTrans');
 
    dataSourceJourTest.addLink(fieldnum(VendInvoiceTrans, PurchId), fieldnum(VendInvoiceJour, PurchId));
   dataSourceJourTest.relations(true);
    dataSourceJourTest.joinMode(joinMode::ExistsJoin);
addLink ак будто вообще не видит соединяет автоматомм по всему на свети
если dataSourceJourTest.relations(true); убераю то вообще по каким то непонятным палям их цепляет
__________________
Работа программиста и шамана имеют много общего!- Оба бормочут непонятные слова, совершают непонятные действия и не могут объяснить как оно работает....
Старый 03.07.2012, 10:57   #12  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
365 / 542 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
X++:
dataSourceJourTest.addLink(fieldnum(VendInvoiceJour, PurchId), fieldnum(VendInvoiceTrans, PurchId));
ПС. Вообще, хорошие ссылки по книжкам и ресурсам есть на главной странице, раздел "Полезное". Иногда помогает поиск по AOT, по ключевым словам, поищите в классах addLink, найдете массу примеров как его использовать.
__________________
Sergey Nefedov

Последний раз редактировалось SRF; 03.07.2012 в 11:02.
За это сообщение автора поблагодарили: Лиса-а-а (1).
Старый 03.07.2012, 11:40   #13  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Лиса-а-а,

Во-первых, почему вы делаете joinMode(JoinMode::ExistsJoin), если в SQL запросе, который вы хотите получить, везде inner join?

Во-вторых, relations(true) автоматически загружает связи между таблицами из AOT. Соответственно, все те связи, что вы в явном виде определили заранее перед этим через addLink(), будут проигнорированы.

В-третьих, в addLink() первый параметр - fieldId поля из таблицы верхнего уровня, а второй - из таблицы текущего уровня. То есть, в вашем случае должно быть так:
X++:
dataSourceJourTest.addLink(fieldnum(VendInvoiceJour, PurchId), fieldnum(VendInvoiceTrans, PurchId));
В-четвёртых, не игнорируйте Developer Help (тот, который можно открыть из клиента AX). Его легко можно прочитать за день, и найти ответы на большинство интересующих вас вопросов.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
За это сообщение автора поблагодарили: Лиса-а-а (1).
Старый 03.07.2012, 11:42   #14  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Да, и в догонку - связывать VendInvoiceJour и VendInvoiceTrans только по PurchId неправильно. Задумайтесь о том, что будет, если по одной закупке будет проведено две накладных.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 03.07.2012, 11:48   #15  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
qbds = query.addDataSource(tableNum(VendInvoiceJour));
qbds.addRange(fieldnum(VendInvoiceJour, InvoiceDate)).value(QueryRange('2011/03/01','2011/03/20'));
qbds.addRange(fieldnum(VendInvoiceJour, CENTERPROFIX)).value(QueryValue('008-001'));

qbds = qbds.addDataSource(tableNum(VendInvoiceTrans));
qbds.relations(false);
qbds.joinMode(joinMode::InnerJoin);
qbds.addLink(fieldnum(VendInvoiceJour, PurchId), fieldnum(VendInvoiceTrans, PurchId));

qbds = qbds.addDataSource(tableNum(PurchTable));
qbds.relations(false);
qbds.joinMode(joinMode::InnerJoin);
qbds.addLink(fieldnum(VendInvoiceJour, PurchId), fieldnum(PurchTable, PurchId));

qbds = qbds.addDataSource(tableNum(PurchLine));
qbds.relations(false);
qbds.joinMode(joinMode::InnerJoin);
qbds.addLink(fieldnum(PurchTable, PurchId), fieldnum(PurchLine, PurchId));

qbds = qbds.addDataSource(tableNum(VSN_PURCHORDERJOUR));
qbds.relations(false);
qbds.joinMode(joinMode::InnerJoin);
qbds.addLink(fieldnum(PurchLine, VSN_PURCHORDERID), fieldnum(VSN_PURCHORDERJOUR, ORDERID));
qbds.addRange(fieldnum(VSN_PURCHORDERJOUR, CENTERPROFIX)).value(QueryValue('008-001'));


// правильнее

qbds = query.addDataSource(tableNum(VendInvoiceJour));
qbds.addRange(fieldnum(VendInvoiceJour, InvoiceDate)).value(QueryRange('2011/03/01','2011/03/20'));
qbds.addRange(fieldnum(VendInvoiceJour, CENTERPROFIX)).value(QueryValue('008-001'));

qbds = qbds.addDataSource(tableNum(VendInvoiceTrans));
qbds.relations(false);
qbds.joinMode(joinMode::InnerJoin);
qbds.addLink(fieldnum(VendInvoiceJour, PurchId), fieldnum(VendInvoiceTrans, PurchId));
qbds.addLink(fieldnum(VendInvoiceJour, PurchId), fieldnum(VendInvoiceTrans, PurchId));
qbds.addLink(fieldnum(VendInvoiceJour, InvoiceId), fieldnum(VendInvoiceTrans, InvoiceId));
qbds.addLink(fieldnum(VendInvoiceJour, InvoiceDate), fieldnum(VendInvoiceTrans, InvoiceDate));
qbds.addLink(fieldnum(VendInvoiceJour, numberSequenceGroup), fieldnum(VendInvoiceTrans, numberSequenceGroup));
qbds.addLink(fieldnum(VendInvoiceJour, InternalInvoiceId), fieldnum(VendInvoiceTrans, InternalInvoiceId));

qbds = qbds.addDataSource(tableNum(PurchLine));
qbds.relations(false);
qbds.joinMode(joinMode::InnerJoin);
qbds.addLink(fieldnum(VendInvoiceTrans, InventTransId), fieldnum(PurchLine, InventTransId));

qbds = qbds.addDataSource(tableNum(VSN_PURCHORDERJOUR));
qbds.relations(false);
qbds.joinMode(joinMode::InnerJoin);
qbds.addLink(fieldnum(PurchLine, VSN_PURCHORDERID), fieldnum(VSN_PURCHORDERJOUR, ORDERID));
qbds.addRange(fieldnum(VSN_PURCHORDERJOUR, CENTERPROFIX)).value(QueryValue('008-001'));
За это сообщение автора поблагодарили: Лиса-а-а (1).
Старый 04.07.2012, 11:11   #16  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Deepoint Посмотреть сообщение
qbdsLedgerJoined.addRange(fieldId2Ext(fieldnum(BankAccountTrans, Dimension),1)).value(bankPaymentOrderJourReport_RU.dimension());
Не совсем понял, разобрались тут уже во всём или нет...
но возможно причина просто в том, что ваш параметр аналитики (bankPaymentOrderJourReport_RU.dimension()) - пустой?

Тогда как я понимаю при такой записи рэндж действительно не добавится.
Надо добавить queryValue() видимо...
__________________
Zhirenkov Vitaly
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AddRange не фильтрует Ихъ бин программикеер DAX: Программирование 6 01.09.2006 14:27
Расширенный AddRange и OuterJoin Russland DAX: Программирование 0 04.07.2006 16:36
Расширенный AddRange Russland DAX: Программирование 3 04.07.2006 10:49
addRange TDima DAX: Программирование 7 30.05.2006 11:07
Можно ли редактировать форму, если на нее наложен addRange? Hans DAX: Программирование 10 22.05.2006 16:35

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

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

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