AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 15.01.2009, 13:54   #1  
rkorchagin ist offline
rkorchagin
Участник
 
81 / 69 (3) ++++
Registriert seit: 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 между собой несвязаны....

Alt 15.01.2009, 14:18   #2  
ZVV ist offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1.006 / 246 (11) ++++++
Registriert seit: 13.02.2004
Ort: Минск
->
Zitat:
Zitat von rkorchagin Beitrag anzeigen
Возникла проблема - как сделать 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
Alt 15.01.2009, 14:33   #3  
ZVV ist offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1.006 / 246 (11) ++++++
Registriert seit: 13.02.2004
Ort: Минск
?
У меня в таком виде как у вас кверя вообще строится отказывается, насколько я понимаю, датасорсы должны цепляться последовательно, а не на один уровень. По крайней мере а АОТ-Query так.
А ваш пример (пробовал и на 3-ке и на 4-ке) на выходе даёт, к сожалению:
PHP-Code:
SELECT FROM VendInvoiceJour 
Поэтому я не совсем понимаю, где у вас на данный момент OR и откуда вы хотите его убрать?
__________________
Zhirenkov Vitaly
Alt 15.01.2009, 15:32   #4  
rkorchagin ist offline
rkorchagin
Участник
 
81 / 69 (3) ++++
Registriert seit: 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);
        }

     
     }




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

Повторюсь, попробуйте посмотреть запрос который уходит к БД в обоих случаях (с fetchMode и без), или просто info(qbds.toString());. И вы увидите что в исходном варианте (без fetchMode) вообще не происходит джоина никакого, идёт просто
X++:
SELECT * FROM VendInvoiceJour
а с fetchMode действительно получается нормальный джоин всех трёх таблиц. (вы это называете "AND между датасорсами"?)
__________________
Zhirenkov Vitaly
Alt 15.01.2009, 16:00   #7  
Gustav ist offline
Gustav
Moderator
Benutzerbild von Gustav
SAP
Лучший по профессии 2009
 
1.858 / 1152 (42) ++++++++
Registriert seit: 24.01.2006
Ort: Санкт-Петербург
Blog-Einträge: 19
Zitat:
Zitat von coolibin Beitrag anzeigen
Что такое OR и AND относительно датасорсов?
Zitat:
Zitat von ZVV Beitrag anzeigen
Что вы вообще подразумеваете под понятием "OR между датасорсами"?
+1
Тоже с удовольствием послушаю новое (или пропущенное?) в логическо-реляционном образовании
Alt 15.01.2009, 16:16   #8  
rkorchagin ist offline
rkorchagin
Участник
 
81 / 69 (3) ++++
Registriert seit: 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.
Alt 15.01.2009, 16:22   #9  
Gustav ist offline
Gustav
Moderator
Benutzerbild von Gustav
SAP
Лучший по профессии 2009
 
1.858 / 1152 (42) ++++++++
Registriert seit: 24.01.2006
Ort: Санкт-Петербург
Blog-Einträge: 19
Zitat:
Zitat von rkorchagin Beitrag anzeigen
То есть AND между результатами выборки из VendinvoiceTrans и vendTrans.
ммм... т.е. что-то типа UNION ?
Alt 15.01.2009, 16:30   #10  
rkorchagin ist offline
rkorchagin
Участник
 
81 / 69 (3) ++++
Registriert seit: 26.09.2006
Zitat:
т.е. что-то типа UNION ?
Да!!!
Alt 15.01.2009, 16:36   #11  
ZVV ist offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1.006 / 246 (11) ++++++
Registriert seit: 13.02.2004
Ort: Минск
->
Zitat:
Zitat von rkorchagin Beitrag anzeigen
Ну в общем имел в виду

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, удовлетворяющие "пользовательским" условиям. Одновременно...

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

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

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

Такой query вроде работает правильно....
Alt 15.01.2009, 17:12   #15  
belugin ist offline
belugin
Участник
Benutzerbild von belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4.622 / 2925 (107) +++++++++
Registriert seit: 16.01.2004
Blog-Einträge: 5
Zitat:
Zitat von ZVV Beitrag anzeigen
UNION в Аксапте, к сожалению, не имеется...
В Ax2009 есть
This post has been rated by: ZVV (1).
Alt 15.01.2009, 17:42   #16  
Gustav ist offline
Gustav
Moderator
Benutzerbild von Gustav
SAP
Лучший по профессии 2009
 
1.858 / 1152 (42) ++++++++
Registriert seit: 24.01.2006
Ort: Санкт-Петербург
Blog-Einträge: 19
Zitat:
Zitat von belugin Beitrag anzeigen
В Ax2009 есть
Да, действительно: http://msdn.microsoft.com/en-us/library/cc605991.aspx
Хоть просто почитать пока...
Кстати, сразу бросилось в глаза:
Zitat:
Union queries can only be created in the AOT. You cannot use X++ to create a union query.
Stichworte
datasource, query, несвязанные датасорсы, датасорс (datasource)

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Пересчет между двумя единицами измерения на уровне партии Андре 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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 12:19 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.