AX 2012: AddQueryFilter

In Dynamics AX 2012 verfügt das Query-Objekt nun über eine neue Methode addQueryFilter, mit dessen Hilfe man die Datenbank anweisen kann, Filterkriterien zur WHERE-Clause statt wie in bisherigen Versionen zur ON-Clause einer OUTER-JOIN-Verknüpfung hinzuzufügen. Dies wiederum bewirkt, daß keine "leeren" Datensätze verarbeitet werden.

Mit folgendem Beispiel möchte ich die Anwendung dieser neuen Methode demonstrieren.

Aufgabenstellung: Es sollen alle Aufträge des Kunden 1102 ausgegeben werden, bei denen zumindest eine Auftragsposition existiert, bei der die bestellte Menge größer 1 ist.

Die Datenbank enthält im Beispiel folgende Auftragsköpfe und die zugehörigen Positionen. Der Auftrag 00000011_050 besitzt keine Positionen (und ist somit ein Auftrag, der nicht ausgegeben werden soll).

SalesId SalesName CustAccount
00000002_050 Adventure Works 1102
00000010_050 Adventure Works 1102
00000011_050 Adventure Works 1102
     
SalesId ItemId QtyOrdered
00000002_050 1290 10
00000010_050 1291 20

Ohne die Methode addQueryFilter würde der nachstehende Job alle Aufträge ausgeben, bei denen dies zutrifft. Es würden aber auch alle Auftragsköpfe ohne Auftragspositionen ausgegeben.

static void ax2012_addQueryFilter(Args _args)
{
    Query query;
    QueryRun queryRun;
    QueryBuildDataSource qbs_SalesTable;
    QueryBuildDataSource qbs_SalesLine;
    SalesTable salesTable;
    SalesLine salesLine;
    ;
    query = new Query();
    qbs_SalesTable = query.addDataSource(tableNum(SalesTable));
    qbs_SalesLine = qbs_SalesTable.addDataSource(tableNum(SalesLine));
    qbs_SalesLine.joinMode(JoinMode::OuterJoin); 

    qbs_SalesLine.addLink(fieldNum(SalesTable, SalesId), fieldNum(SalesLine, SalesId));

    SysQuery::findOrCreateRange(qbs_SalesTable, fieldNum(SalesTable, CustAccount)).value('1102');

    SysQuery::findOrCreateRange(qbs_SalesLine, fieldNum(salesLine, QtyOrdered)).value('1..');

    queryRun = new QueryRun(query);

    while(queryRun.next())
    {
        salesTable = queryRun.get(tableNum(SalesTable));
        salesLine = queryRun.get(tableNum(SalesLine));

        info(strFmt("Sales order %1: %2", salesTable.SalesId, salesLine.QtyOrdered));
    }
}

Resultierendes SQL-Statement

SELECT * FROM SalesTable(SalesTable_1)
WHERE ((CustAccount = N'1102'))
OUTER JOIN * FROM SalesLine(SalesLine_1) 
     ON SalesTable.SalesId = SalesLine.SalesId AND ((QtyOrdered>=1.E0))

Ergebnis

Info Meldung (18:39:50) Sales order 00000002_050: 10,00
Info Meldung (18:39:50) Sales order 00000010_050: 20,00
Info Meldung (18:39:50) Sales order 00000011_050: 0,00

Bei Verwendung von addQueryFilter werden nur noch jene Aufträge ausgegeben, die eine Position mit der gewünschten Menge enthalten. Aufträge ohne Positionen werden allerdings nicht verarbeitet.

static void ax2012_addQueryFilter(Args _args)
{
    Query query;
    QueryRun queryRun;
    QueryBuildDataSource qbs_SalesTable;
    QueryBuildDataSource qbs_SalesLine;
    SalesTable salesTable;
    SalesLine salesLine;
    ;
    query = new Query();
    qbs_SalesTable = query.addDataSource(tableNum(SalesTable));
    qbs_SalesLine = qbs_SalesTable.addDataSource(tableNum(SalesLine));
    qbs_SalesLine.joinMode(JoinMode::OuterJoin);

    qbs_SalesLine.addLink(fieldNum(SalesTable, SalesId), fieldNum(SalesLine, SalesId));

    SysQuery::findOrCreateRange(qbs_SalesTable, fieldNum(SalesTable, CustAccount)).value('1102');

    query.addQueryFilter(qbs_SalesLine, identifierStr(QtyOrdered)).value("1..");
    
    queryRun = new QueryRun(query);

    while(queryRun.next())
    {
        salesTable = queryRun.get(tableNum(SalesTable));
        salesLine = queryRun.get(tableNum(SalesLine));

        info(strFmt("Sales order %1: %2", salesTable.SalesId, salesLine.QtyOrdered));
    }
}

Resultierendes SQL-Statement

SELECT * FROM SalesTable(SalesTable_1)
WHERE ((CustAccount = N'1102'))
OUTER JOIN * FROM SalesLine(SalesLine_1)
       ON SalesTable.SalesId = SalesLine.SalesId
       WHERE ((SalesLine(SalesLine_1).QtyOrdered>=1.E0))

Ergebnis

Info Meldung (18:41:05) Sales order 00000002_050: 10,00
Info Meldung (18:41:05) Sales order 00000010_050: 20,00

Der Auftrag 00000011_050 wird nicht mehr aufgeführt.
 

Dieser Beitrag bezieht sich auf die Version:
Dynamics AX 2012

Kommentar hinzufügen
 
 

 

Dies ist ein Beitrag aus der Serie »Dynamics AX 2012 - What's new«

Dynamics AX 2012 steht vor der Tür. Zeit also, sich einige der neuen Features mal etwas näher anzusehen.

Alle Beiträge dieser Serie anzeigen

RSS-Feed dieser Blogserie


 

 
 
 
Beiträge des aktuellen Monats
April 2024
MoDiMiDoFrSaSo
1234567
891011121314
15161718192021
22232425262728
2930 
 
© 2006-2024 Heinz Schweda | Impressum | Kontakt | English version | Mobile Version
Diese Webseite verwendet Cookies, um Benutzern einen besseren Service anzubieten. Wenn Sie weiterhin auf der Seite bleiben, stimmen Sie der Verwendung von Cookies zu.  Mehr dazu