Dieser Beitrag bezieht sich auf die Version:
Dynamics AX 2012
Dynamics AX 2012
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
|
|
|
|
|
|
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).
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.
{
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.
{
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.