Miklix

Använda en fråga i en SysOperation-datakontraktsklass i Dynamics AX 2012

Publicerad: 16 februari 2025 kl. 01:23:08 UTC

Den här artikeln går igenom detaljerna om hur du lägger till en användarkonfigurerbar och filtrerbar fråga till en SysOperation-datakontraktsklass i Dynamics AX 2012 (och Dynamics 365 for Operations)


Denna sida har maskinöversatts från engelska för att göra den tillgänglig för så många som möjligt. Tyvärr är maskinöversättning ännu inte en fulländad teknik, så fel kan uppstå. Om du föredrar det kan du se den engelska originalversionen här:

Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012

Informationen i det här inlägget är baserad på Dynamics AX 2012 R3. Det kan eller kanske inte är giltigt för andra versioner. (Uppdatering: Jag kan bekräfta att detta också fungerar på Dynamics 365 for Operations)

Jag verkar alltid glömma detaljerna om hur man specificerar och initierar en fråga i SysOperation-ramverket. Jag antar att de flesta av de batchjobb jag har gjort inte är baserade på användarkonfigurerbara frågor, men då och då behöver jag göra ett sådant batchjobb, så det här inlägget är också för min egen referens.

Först, i datakontraktsklassen, kommer frågan att lagras packad i en sträng. Dess parm-metod måste dekoreras med attributet AifQueryTypeAttribute, som så (i det här exemplet har jag använt SalesUpdate-frågan, men du kan ersätta denna med vilken AOT-fråga som helst):

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

    packedQuery = _packedQuery;
    return packedQuery;
}

Om du istället vill att frågan ska avgöras av controllerklassen kan du också använda en tom sträng. I så fall behöver du också implementera ett par hjälpmetoder (som du förmodligen borde implementera ändå för din egen bekvämlighet när du behöver komma åt frågan):

public Query getQuery()
{
    ;

    return new Query(SysOperationHelper::base64Decode(packedQuery));
}

public void setQuery(Query _query)
{
    ;

    packedQuery = SysOperationHelper::base64Encode(_query.pack());
}

Om du behöver initiera frågan (till exempel lägga till intervall), bör du implementera en initQuery-metod:

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

    // add ranges, etc...

    this.setQuery(queryLocal);
}

Du måste se till att anropa denna metod från controllerklassen.

Dela på BlueskyDela på FacebookDela på LinkedInDela på TumblrDela på XDela på LinkedInFäst på Pinterest

Mikkel Bang Christensen

Om författaren

Mikkel Bang Christensen
Mikkel är skaparen och ägaren av miklix.com. Han har över 20 års erfarenhet som professionell datorprogrammerare/mjukvaruutvecklare och är för närvarande heltidsanställd på ett stort europeiskt IT-bolag. När han inte bloggar ägnar han sin fritid åt en mängd olika intressen, hobbies och aktiviteter, vilket i viss mån kan återspeglas i de olika ämnen som behandlas på den här webbplatsen.