Miklix

Použití dotazu v třídě SysOperation Data Contract v Dynamics AX 2012

Vydáno: 16. února 2025 v 1:21:38 UTC

Tento článek popisuje podrobnosti o tom, jak přidat uživatelsky konfigurovatelný a filtrovatelný dotaz do třídy smlouvy dat SysOperation v Dynamics AX 2012 (a Dynamics 365 for Operations)


Tato stránka byla strojově přeložena z angličtiny, aby byla přístupná co největšímu počtu lidí. Strojový překlad bohužel ještě není dokonalá technologie, takže může dojít k chybám. Pokud si přejete, můžete si prohlédnout původní anglickou verzi zde:

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

Informace v tomto příspěvku jsou založeny na Dynamics AX 2012 R3. Může a nemusí platit pro jiné verze. (Aktualizace: Mohu potvrdit, že to funguje také na Dynamics 365 for Operations)

Vždy se mi zdá, že zapomínám na podrobnosti o tom, jak zadat a inicializovat dotaz v rámci SysOperation. Myslím, že většina dávkových úloh, které jsem dělal, není založena na uživatelsky konfigurovatelných dotazech, ale tu a tam potřebuji udělat takovou dávkovou úlohu, takže tento příspěvek je také pro mou vlastní referenci.

Za prvé, ve třídě datových kontraktů bude dotaz uložen zabalený do řetězce. Jeho metoda parm musí být ozdobena atributem AifQueryTypeAttribute, podobně (v tomto příkladu jsem použil dotaz SalesUpdate, ale můžete jej nahradit jakýmkoli dotazem AOT):

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

    packedQuery = _packedQuery;
    return packedQuery;
}

Pokud chcete, aby dotaz místo toho rozhodovala třída kontroleru, můžete také použít prázdný řetězec. V takovém případě musíte také implementovat několik pomocných metod (které byste pravděpodobně měli implementovat pro své vlastní pohodlí, když potřebujete získat přístup k dotazu):

public Query getQuery()
{
    ;

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

public void setQuery(Query _query)
{
    ;

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

Pokud potřebujete inicializovat dotaz (například přidat rozsahy), měli byste implementovat metodu initQuery:

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

    // add ranges, etc...

    this.setQuery(queryLocal);
}

Musíte se ujistit, že tuto metodu voláte ze třídy řadiče.

Sdílet na BlueskySdílejte na FacebookuSdílet na LinkedInSdílet na TumblrSdílet na XSdílet na LinkedInPřipnout na Pinterest

Mikkel Bang Christensen

O autorovi

Mikkel Bang Christensen
Mikkel je tvůrcem a majitelem webu miklix.com. Má více než 20 let zkušeností jako profesionální programátor/vývojář softwaru a v současné době pracuje na plný úvazek pro velkou evropskou IT společnost. Pokud zrovna nepíše blog, věnuje svůj volný čas široké škále zájmů, koníčků a aktivit, což se může do jisté míry odrážet v rozmanitosti témat na tomto webu.