Miklix

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

Vydáno: 16. února 2025 v 1:21:38 UTC
Poslední aktualizace: 12. ledna 2026 v 8:47:04 UTC

Tento článek podrobně popisuje, jak přidat uživatelem konfigurovatelný a filtrovatelný dotaz do třídy datových kontraktů 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 aplikaci Dynamics AX 2012 R3. Pro jiné verze mohou, ale nemusí být platné. (Aktualizace: Mohu potvrdit, že to funguje i v aplikaci Dynamics 365 for Operations.)

Vždycky si jakoby zapomínám na detaily, jak specifikovat a inicializovat dotaz v frameworku 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 čas od času potřebuji takovou dávkovou úlohu vytvořit, takže tento příspěvek je také pro mou vlastní informaci.

Nejprve bude dotaz ve třídě datového kontraktu uložen zabalený v řetězci. Jeho metoda parm musí být doplněna atributem AifQueryTypeAttribute, například takto (v tomto příkladu jsem použil dotaz SalesUpdate, ale můžete jej nahradit libovolným dotazem AOT):

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

    packedQuery = _packedQuery;
    return packedQuery;
}

Pokud chcete, aby o dotazu rozhodovala třída kontroleru, můžete také použít prázdný řetězec. V takovém případě je také třeba implementovat několik pomocných metod (které byste pravděpodobně měli implementovat pro vaše vlastní pohodlí, když potřebujete k dotazu přistupovat):

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 z třídy kontroleru.

Další čtení

Pokud se vám tento příspěvek líbil, mohly by se vám líbit i tyto návrhy:


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

Mikkel Christensen

O autorovi

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