Miklix

Brug af en forespørgsel i en SysOperation-datakontraktklasse i Dynamics AX 2012

Udgivet: 16. februar 2025 kl. 01.21.39 UTC
Sidst opdateret: 12. januar 2026 kl. 08.47.05 UTC

Denne artikel gennemgår detaljerne om, hvordan man tilføjer en brugerkonfigurerbar og filtrerbar forespørgsel til en SysOperation-datakontraktklasse i Dynamics AX 2012 (og Dynamics 365 for Operations).


Denne side er blevet maskinoversat fra engelsk for at gøre den tilgængelig for så mange mennesker som muligt. Desværre er maskinoversættelse endnu ikke en perfekt teknologi, så der kan forekomme fejl. Hvis du foretrækker det, kan du se den originale engelske version her:

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. De er muligvis ikke gyldige for andre versioner. (Opdatering: Jeg kan bekræfte, at dette også fungerer på Dynamics 365 for Operations)

Jeg glemmer altid detaljerne om, hvordan man specificerer og initialiserer en forespørgsel i SysOperation-frameworket. Jeg gætter på, at de fleste af de batchjob, 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.

Først gemmes forespørgslen pakket i en streng i datakontraktklassen. Dens parm-metode skal dekoreres med attributten AifQueryTypeAttribute, således (i dette eksempel har jeg brugt SalesUpdate-forespørgslen, men du kan erstatte denne med enhver AOT-forespørgsel):

[
    DataMemberAttribute,
    AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
    ;

    packedQuery = _packedQuery;
    return packedQuery;
}

Hvis du ønsker, at forespørgslen i stedet 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 alligevel bør implementere for din egen bekvemmelighed, når du har brug for at få adgang til forespørgslen):

public Query getQuery()
{
    ;

    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 intervaller), skal du implementere en initQuery-metode:

public void initQuery()
{
    Query queryLocal = this.getQuery();
    ;

    // add ranges, etc...

    this.setQuery(queryLocal);
}

Du skal sørge for at kalde denne metode fra controller-klassen.

Yderligere læsning

Hvis du kunne lide dette indlæg, kan du måske også lide disse forslag:


Del på BlueskyDel på FacebookDel på LinkedInDel på TumblrDel på XDel på LinkedInFastgør på Pinterest

Mikkel Christensen

Om forfatteren

Mikkel Christensen
Mikkel er skaberen og ejeren af miklix.com. Han har over 20 års erfaring som professionel computerprogrammør/softwareudvikler og er i øjeblikket fuldtidsansat i en stor europæisk IT-virksomhed. Når han ikke blogger, bruger han sin fritid på en lang række interesser, hobbyer og aktiviteter, som i et vist omfang afspejles i de mange forskellige emner, der dækkes på dette websted.