Een query gebruiken in een SysOperation Data Contract-klasse in Dynamics AX 2012
Gepubliceerd: 16 februari 2025 om 01:23:00 UTC
In dit artikel worden de details besproken over het toevoegen van een door de gebruiker configureerbare en filterbare query aan een SysOperation-gegevenscontractklasse in Dynamics AX 2012 (en Dynamics 365 voor Operations)
Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012
De informatie in dit bericht is gebaseerd op Dynamics AX 2012 R3. Het kan wel of niet geldig zijn voor andere versies. (Update: ik kan bevestigen dat dit ook werkt op Dynamics 365 for Operations)
Ik lijk altijd de details te vergeten over hoe je een query specificeert en initialiseert in het SysOperation-framework. Ik denk dat de meeste batchjobs die ik heb gemaakt niet gebaseerd zijn op door de gebruiker configureerbare query's, maar af en toe moet ik zo'n batchjob maken, dus deze post is ook voor mijn eigen referentie.
Ten eerste wordt de query in de data contract class opgeslagen in een string. De parm methode moet worden gedecoreerd met het AifQueryTypeAttribute kenmerk, zoals hier (in dit voorbeeld heb ik de SalesUpdate query gebruikt, maar u kunt deze vervangen door elke AOT query):
DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
;
packedQuery = _packedQuery;
return packedQuery;
}
Als u wilt dat de query in plaats daarvan door de controllerklasse wordt bepaald, kunt u ook een lege string gebruiken. In dat geval moet u ook een aantal helpermethoden implementeren (die u waarschijnlijk toch zou moeten implementeren voor uw eigen gemak wanneer u de query nodig hebt):
{
;
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
public void setQuery(Query _query)
{
;
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
Als u de query moet initialiseren (bijvoorbeeld bereiken toevoegen), moet u een initQuery-methode implementeren:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Zorg ervoor dat u deze methode aanroept vanuit de controllerklasse.