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
|
|
|
|
|
|
Ein neues Feature von Dynamics AX 2012 ist, daß man nun bei einem Query auch eine HAVING-Clause hinzufügen kann.
Diese Bedingung dient dazu, berechnete Werte einer GROUP BY-Clause in der WHERE-Clause berücksichtigen zu können. Dieses Feature habe ich in der Vergangenheit vor allem dazu gerne verwendet, wenn es darum ging über eine SQL-Abfrage doppelte (bzw. vielfache) Datensätze in einer Tabelle zu finden. In den bisherigen Versionen von Dynamics AX war dieses Unterfangen über X++ nur etwas umständlich abzubilden.
Microsoft hat dies scheinbar eingesehen, und stellt nun bei der Verwendung von Queries die Methode addHavingFilter zur Verfügung.
Im folgenden Beispiel möchte ich mir z.B. alle Kundengruppen ausgeben lassen, die bei mehr als nur einem Kunden hinterlegt sind.
{
query query;
QueryRun QueryRun;
QueryBuildDataSource QueryBuildDataSource;
CustTable custTable;
;
setPrefix(funcName());
// Build query
query = new query();
QueryBuildDataSource = query.addDataSource(tableNum(CustTable));
// Add fields to query
QueryBuildDataSource.addGroupByField(fieldNum(CustTable, CustGroup));
QueryBuildDataSource.addSelectionField(fieldNum(custTable, recId), SelectionField::Count);
// Add having filter to query
query.addHavingFilter(QueryBuildDataSource, "recId", AggregateFunction::Count).value(">1");
// Run query
QueryRun = new QueryRun(query);
while(QueryRun.next())
{
custTable = QueryRun.get(tableNum(custTable));
info(strFmt("Custgroup %1: %2 records", custTable.CustGroup, custTable.RecId));
}
}
Das Ergebnis der oben stehenden Abfrage ohne addHavingFilter würde wie folgt aussehen:
Mit addHavingFilter ändert sich das Ergebnis/Infolog:
Natürlich kann man dieses neue Feature auch bei einem im AOT definierten Query einsetzen. Dazu gibt es einen neuen, entsprechend benannten Knoten: