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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.01.2009, 13:54   #1  
rkorchagin is offline
rkorchagin
Участник
 
81 / 69 (3) ++++
Регистрация: 26.09.2006
? Как сделать AND между двумя датасорсами на одном уровне в query
Возникла проблема - как сделать AND между двумя несвязанными датасорсами в query, по умолчанию Axapta делает OR.

X++:
   Query   query = new query();
    QueryBuildDataSource qbds, qbds1, qbds2;
    ;

    qbds = query.addDataSource(tablenum(VendInvoiceJour));

    qbds1 = qbds.addDataSource(tablenum(VendTrans));
    qbds1.relations(true);
    
    qbds2 = qbds.addDataSource(tablenum(VendInvoiceTrans));
    qbds2.relations(true);
Надо чтобы между VendInvoiceTrans (qbds1) и VendTrans (qbds2) был AND. Пользователи в качестве критерия хотят выбирать разные поля из этих таблиц.
В вышеприведённом примере получается OR.

P.S. VendInvoiceTrans и VendTrans между собой несвязаны....

Старый 15.01.2009, 14:18   #2  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от rkorchagin Посмотреть сообщение
Возникла проблема - как сделать AND между двумя несвязанными датасорсами в query, по умолчанию Axapta делает OR.

X++:
   Query   query = new query();
    QueryBuildDataSource qbds, qbds1, qbds2;
    ;

    qbds = query.addDataSource(tablenum(VendInvoiceJour));

    qbds1 = qbds.addDataSource(tablenum(VendTrans));
    qbds1.relations(true);
    
    qbds2 = qbds.addDataSource(tablenum(VendInvoiceTrans));
    qbds2.relations(true);
Надо чтобы между VendInvoiceTrans (qbds1) и VendTrans (qbds2) был AND. Пользователи в качестве критерия хотят выбирать разные поля из этих таблиц.
В вышеприведённом примере получается OR.

P.S. VendInvoiceTrans и VendTrans между собой несвязаны....

Уточните, какой вы хотите получить запрос? можно на SQL.
__________________
Zhirenkov Vitaly
Старый 15.01.2009, 14:33   #3  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
?
У меня в таком виде как у вас кверя вообще строится отказывается, насколько я понимаю, датасорсы должны цепляться последовательно, а не на один уровень. По крайней мере а АОТ-Query так.
А ваш пример (пробовал и на 3-ке и на 4-ке) на выходе даёт, к сожалению:
PHP код:
SELECT FROM VendInvoiceJour 
Поэтому я не совсем понимаю, где у вас на данный момент OR и откуда вы хотите его убрать?
__________________
Zhirenkov Vitaly
Старый 15.01.2009, 15:32   #4  
rkorchagin is offline
rkorchagin
Участник
 
81 / 69 (3) ++++
Регистрация: 26.09.2006
Ну как бы решил....
надо получается на каждом датасорсе что на одном уровне ставить
fetchMode(QueryFetchMode::One2One);

только потом сделать Map и проверять уже выведен ли vendInvoiceJour или нет - а то так получается что печатается столько раз сколько VendTrans (vendInvoiceTrans)


X++:
//TE-rko
static void testDatasource(Args _args)
{


    Query   query = new query();
    QueryBuildDataSource qbds, qbds1, qbds2;
    querybuildrange qbr;
    QueryRun qr;
    VendInvoiceJour VendInvoiceJour;
    ;

    qbds = query.addDataSource(tablenum(VendInvoiceJour));

    qbds1 = qbds.addDataSource(tablenum(VendTrans));
    qbds1.relations(true);
    qbds1.fetchMode(QueryFetchMode::One2One);

    qbr = qbds1.addRange(fieldnum(VendTrans,Recid));
//    qbr.value(strfmt("%1",1));//-2082064522));



    qbds2 = qbds.addDataSource(tablenum(VendInvoiceTrans));
    qbds2.relations(true);
    qbds2.fetchMode(QueryFetchMode::One2One);

    qbr = qbds2.addRange(fieldnum(VendInvoiceTrans,InvoiceId));

  //  qbr.value("TI00005951");
  qbr.value("RV300654228");

     qr = new QueryRun(query);
     while (qr.next())
     {
        if (qr.changed(tablenum(VendInvoiceJour)))
        {
            VendInvoiceJour = qr.get(tablenum(VendInvoiceJour));
            info(VendInvoiceJour.InvoiceId);
        }

     
     }




}
Цитата:
Поэтому я не совсем понимаю, где у вас на данный момент OR и откуда вы хотите его убрать?
OR по умолчанию в аксапте между датасорсами на одном уровне. А когда ставишь fetchMode(QueryFetchMode::One2One); на каждом датасоурсе - то получается именно AND.
Старый 15.01.2009, 15:46   #5  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Цитата:
Сообщение от rkorchagin Посмотреть сообщение
OR по умолчанию в аксапте между датасорсами на одном уровне. А когда ставишь fetchMode(QueryFetchMode::One2One); на каждом датасоурсе - то получается именно AND.
Можно для тех, кто в танке, как я, помедленнее и поподробнее? Что такое OR и AND относительно датасорсов?
Старый 15.01.2009, 15:46   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от rkorchagin Посмотреть сообщение
OR по умолчанию в аксапте между датасорсами на одном уровне. А когда ставишь fetchMode(QueryFetchMode::One2One); на каждом датасоурсе - то получается именно AND.
У вас какая-то интересная своя терминология, мне не совсем понятная...
Что вы вообще подразумеваете под понятием "OR между датасорсами"?

Повторюсь, попробуйте посмотреть запрос который уходит к БД в обоих случаях (с fetchMode и без), или просто info(qbds.toString());. И вы увидите что в исходном варианте (без fetchMode) вообще не происходит джоина никакого, идёт просто
X++:
SELECT * FROM VendInvoiceJour
а с fetchMode действительно получается нормальный джоин всех трёх таблиц. (вы это называете "AND между датасорсами"?)
__________________
Zhirenkov Vitaly
Старый 15.01.2009, 16:00   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от coolibin Посмотреть сообщение
Что такое OR и AND относительно датасорсов?
Цитата:
Сообщение от ZVV Посмотреть сообщение
Что вы вообще подразумеваете под понятием "OR между датасорсами"?
+1
Тоже с удовольствием послушаю новое (или пропущенное?) в логическо-реляционном образовании
Старый 15.01.2009, 16:16   #8  
rkorchagin is offline
rkorchagin
Участник
 
81 / 69 (3) ++++
Регистрация: 26.09.2006
Ну в общем имел в виду

X++:
    while select VendInvoiceJour join vendTrans join  vendInvoiceTrans where
         VendInvoiceJour.PurchId == vendInvoiceTrans.PurchID &&
         VendInvoiceJour.InvoiceId == vendInvoiceTrans.InvoiceId &&
         VendInvoiceJour.InvoiceDate == vendInvoiceTrans.InvoiceDate &&
         VendInvoiceJour.numberSequenceGroup == vendInvoiceTrans.numberSequenceGroup
                                     &&
         vendInvoiceJour.LedgerVoucher == vendTrans.Voucher &&
         vendInvoiceJour.InvoiceAccount == vendTrans.AccountNum &&
         vendInvoiceJour.InvoiceDate == vendTrans.TransDate
                                &&
            vendInvoiceTrans.InvoiceId == "RV300654228" //&&
//            vendTrans. //range on vendTrans

    
    {
        info(VendInvoiceJour.InvoiceId);
    }

То есть AND между результатами выборки из VendinvoiceTrans и vendTrans.
Старый 15.01.2009, 16:22   #9  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от rkorchagin Посмотреть сообщение
То есть AND между результатами выборки из VendinvoiceTrans и vendTrans.
ммм... т.е. что-то типа UNION ?
Старый 15.01.2009, 16:30   #10  
rkorchagin is offline
rkorchagin
Участник
 
81 / 69 (3) ++++
Регистрация: 26.09.2006
Цитата:
т.е. что-то типа UNION ?
Да!!!
Старый 15.01.2009, 16:36   #11  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от rkorchagin Посмотреть сообщение
Ну в общем имел в виду

X++:
    while select VendInvoiceJour join vendTrans join  vendInvoiceTrans where
         VendInvoiceJour.PurchId == vendInvoiceTrans.PurchID &&
         VendInvoiceJour.InvoiceId == vendInvoiceTrans.InvoiceId &&
         VendInvoiceJour.InvoiceDate == vendInvoiceTrans.InvoiceDate &&
         VendInvoiceJour.numberSequenceGroup == vendInvoiceTrans.numberSequenceGroup
                                     &&
         vendInvoiceJour.LedgerVoucher == vendTrans.Voucher &&
         vendInvoiceJour.InvoiceAccount == vendTrans.AccountNum &&
         vendInvoiceJour.InvoiceDate == vendTrans.TransDate
                                &&
            vendInvoiceTrans.InvoiceId == "RV300654228" //&&
//            vendTrans. //range on vendTrans

    
    {
        info(VendInvoiceJour.InvoiceId);
    }

То есть AND между результатами выборки из VendinvoiceTrans и vendTrans.
Я правильно понимаю, что вам нужно найти все VendInvoiceJour, по которым есть записи и в vendInvoiceTrans, удовлетворяющие "пользовательским" условиям, и в vendTrans, удовлетворяющие "пользовательским" условиям. Одновременно...

Тогда возможно вам есть смысл добавить
Цитата:
qbds1.joinMode(JoinMode::ExistsJoin);
qbds2.joinMode(JoinMode::ExistsJoin);
Чтоб не перебирать всё подряд..
__________________
Zhirenkov Vitaly
Старый 15.01.2009, 16:38   #12  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от rkorchagin Посмотреть сообщение
Да!!!
Мне кажется UNION - это не совсем то, что вы хотите, по крайней мере добились вы явно не его...
UNION в Аксапте, к сожалению, не имеется... Также как и ещё многие фичи SQL.
__________________
Zhirenkov Vitaly
Старый 15.01.2009, 16:50   #13  
rkorchagin is offline
rkorchagin
Участник
 
81 / 69 (3) ++++
Регистрация: 26.09.2006
Цитата:
Я правильно понимаю, что вам нужно найти все VendInvoiceJour, по которым есть записи и в vendInvoiceTrans, удовлетворяющие "пользовательским" условиям, и в vendTrans, удовлетворяющие "пользовательским" условиям. Одновременно...
Именно!

Да - это не совсем UNION - a ПЕРЕСЕЧЕНИЕ результатов выборок из vendInvoiceTrans и vendTrans.

А existJoin поставлю только на vendTrans так как данные из vendInvoiceTrans нужны
Старый 15.01.2009, 16:54   #14  
rkorchagin is offline
rkorchagin
Участник
 
81 / 69 (3) ++++
Регистрация: 26.09.2006
Я сделаю как написал ранее -
Как сделать AND между двумя датасорсами на одном уровне в query

Такой query вроде работает правильно....
Старый 15.01.2009, 17:12   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от ZVV Посмотреть сообщение
UNION в Аксапте, к сожалению, не имеется...
В Ax2009 есть
За это сообщение автора поблагодарили: ZVV (1).
Старый 15.01.2009, 17:42   #16  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от belugin Посмотреть сообщение
В Ax2009 есть
Да, действительно: http://msdn.microsoft.com/en-us/library/cc605991.aspx
Хоть просто почитать пока...
Кстати, сразу бросилось в глаза:
Цитата:
Union queries can only be created in the AOT. You cannot use X++ to create a union query.
Теги
datasource, query, несвязанные датасорсы, датасорс (datasource)

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Пересчет между двумя единицами измерения на уровне партии Андре DAX: Функционал 15 22.10.2013 00:26
Как в динамическом запросе использовать исловие OR между двумя полями? yooshi DAX: Программирование 12 07.08.2009 16:34
Включение и отключение relation между двумя таблицами? Hidden DAX: Программирование 2 08.02.2007 17:20
дизайн отчета (как сделать его с разделителями между столбцами?) puz DAX: Программирование 7 02.09.2003 08:50
Cвязь данных между двумя формами Artild DAX: Программирование 11 24.06.2003 10:45

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:45.