Verwenden einer Abfrage in einer SysOperation-Datenvertragsklasse in Dynamics AX 2012
Veröffentlicht: 16. Februar 2025 um 01:21:39 UTC
In diesem Artikel erfahren Sie, wie Sie einer SysOperation-Datenvertragsklasse in Dynamics AX 2012 (und Dynamics 365 for Operations) eine benutzerkonfigurierbare und filterbare Abfrage hinzufügen.
Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012
Die Informationen in diesem Beitrag basieren auf Dynamics AX 2012 R3. Sie können für andere Versionen gültig sein oder nicht. (Update: Ich kann bestätigen, dass dies auch mit Dynamics 365 for Operations funktioniert)
Ich scheine immer die Details zu vergessen, wie man eine Abfrage im SysOperation-Framework angibt und initialisiert. Ich vermute, dass die meisten Batch-Jobs, die ich erstellt habe, nicht auf benutzerkonfigurierbaren Abfragen basieren, aber ab und zu muss ich einen solchen Batch-Job erstellen, daher dient dieser Beitrag auch zu meiner eigenen Referenz.
Zunächst wird die Abfrage in der Datenvertragsklasse in einem String gepackt gespeichert. Dessen parm-Methode muss mit dem Attribut AifQueryTypeAttribute dekoriert werden, wie folgt (in diesem Beispiel habe ich die SalesUpdate-Abfrage verwendet, aber Sie können diese durch jede beliebige AOT-Abfrage ersetzen):
DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
;
packedQuery = _packedQuery;
return packedQuery;
}
Wenn Sie möchten, dass die Abfrage stattdessen von der Controller-Klasse entschieden wird, können Sie auch eine leere Zeichenfolge verwenden. In diesem Fall müssen Sie auch einige Hilfsmethoden implementieren (die Sie wahrscheinlich sowieso implementieren sollten, wenn Sie auf die Abfrage zugreifen müssen):
{
;
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
public void setQuery(Query _query)
{
;
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
Wenn Sie die Abfrage initialisieren müssen (z. B. Bereiche hinzufügen), sollten Sie eine initQuery-Methode implementieren:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Sie müssen sicherstellen, dass diese Methode von der Controllerklasse aus aufgerufen wird.