Miklix

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)


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. 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):

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 områder), 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 controllerklassen.

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

Mikkel Bang Christensen

Om forfatteren

Mikkel Bang 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.