Brug af en forespørgsel i en SysOperation-datakontraktklasse i Dynamics AX 2012
Udgivet: 16. februar 2025 kl. 01.21.39 UTC
Denne artikel gennemgår detaljerne om, hvordan du tilføjer en brugerkonfigurerbar og filtrerbar forespørgsel til en SysOperation-datakontraktklasse i Dynamics AX 2012 (og Dynamics 365 for Operations)
Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012
Oplysningerne i dette indlæg er baseret på Dynamics AX 2012 R3. Det er muligvis ikke gyldigt for andre versioner. (Opdatering: Jeg kan bekræfte, at dette også virker på Dynamics 365 for Operations)
Jeg synes altid at glemme detaljerne om, hvordan man specificerer og initialiserer en forespørgsel i SysOperation-rammen. Jeg gætter på, at de fleste af de batchjobs, jeg har lavet, ikke er baseret på brugerkonfigurerbare forespørgsler, men nu og da har jeg brug for at lave sådan et batchjob, så dette indlæg er også til min egen reference.
For det første vil forespørgslen i datakontraktklassen blive gemt pakket i en streng. Dens parm-metode skal være dekoreret med AifQueryTypeAttribute-attributten, som sådan (i dette eksempel har jeg brugt SalesUpdate-forespørgslen, men du kan erstatte denne med en hvilken som helst AOT-forespørgsel):
DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
;
packedQuery = _packedQuery;
return packedQuery;
}
Hvis du i stedet ønsker, at forespørgslen skal bestemmes af controllerklassen, kan du også bruge en tom streng. I så fald skal du også implementere et par hjælpemetoder (som du sandsynligvis bør implementere alligevel for din egen bekvemmelighed, når du skal have adgang til forespørgslen):
{
;
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
public void setQuery(Query _query)
{
;
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
Hvis du har brug for at initialisere forespørgslen (f.eks. tilføje områder), skal du implementere en initQuery-metode:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Du skal sørge for at kalde denne metode fra controllerklassen.