Bruke en spørring i en SysOperation-datakontraktklasse i Dynamics AX 2012
Publisert: 16. februar 2025 kl. 01:22:56 UTC
Denne artikkelen går over detaljene om hvordan du legger til en brukerkonfigurerbar og filtrerbar spørring i 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
Informasjonen i dette innlegget er basert på Dynamics AX 2012 R3. Det kan være eller ikke være gyldig for andre versjoner. (Oppdatering: Jeg kan bekrefte at dette også fungerer på Dynamics 365 for Operations)
Jeg ser alltid ut til å glemme detaljene om hvordan du spesifiserer og initialiserer en spørring i SysOperation-rammeverket. Jeg antar at de fleste batchjobbene jeg har laget ikke er basert på brukerkonfigurerbare spørringer, men nå og da trenger jeg å lage en slik batchjobb, så dette innlegget er også for min egen referanse.
For det første, i datakontraktklassen, vil spørringen bli lagret pakket i en streng. Parm-metoden må være dekorert med AifQueryTypeAttribute-attributtet, på samme måte (i dette eksemplet har jeg brukt SalesUpdate-spørringen, men du kan erstatte denne med en hvilken som helst AOT-spørring):
DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
;
packedQuery = _packedQuery;
return packedQuery;
}
Hvis du vil at spørringen skal bestemmes av kontrollerklassen i stedet, kan du også bruke en tom streng. I så fall må du også implementere et par hjelpemetoder (som du sannsynligvis bør implementere uansett for din egen bekvemmelighet når du trenger å få tilgang til spørringen):
{
;
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
public void setQuery(Query _query)
{
;
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
Hvis du trenger å initialisere spørringen (for eksempel legge til områder), bør du implementere en initQuery-metode:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Du må sørge for å kalle denne metoden fra kontrollerklassen.