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)
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):
{
;
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:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Musíte se ujistit, že tuto metodu voláte ze třídy řadiče.