Ús d'una consulta en una classe de contracte de dades SysOperation al Dynamics AX 2012
Publicat: 5 de març del 2025, a les 19:30:08 UTC
Aquest article repassa els detalls sobre com afegir una consulta filtrable i configurable per l'usuari a una classe de contracte de dades SysOperation al Dynamics AX 2012 (i al Dynamics 365 for Operations)
Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012
La informació d'aquesta publicació es basa en Dynamics AX 2012 R3. Pot ser vàlid o no per a altres versions. (Actualització: puc confirmar que això també funciona al Dynamics 365 for Operations)
Sempre em sembla que oblido els detalls sobre com especificar i inicialitzar una consulta al marc SysOperation. Suposo que la majoria de treballs per lots que he estat fent no es basen en consultes configurables per l'usuari, però de tant en tant necessito fer un treball per lots, així que aquesta publicació també és per a la meva pròpia referència.
En primer lloc, a la classe de contracte de dades, la consulta s'emmagatzemarà empaquetada en una cadena. El seu mètode parm ha d'estar decorat amb l'atribut AifQueryTypeAttribute, així (en aquest exemple he utilitzat la consulta SalesUpdate, però podeu substituir-la per qualsevol consulta AOT):
DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
;
packedQuery = _packedQuery;
return packedQuery;
}
Si voleu que la consulta la decideixi la classe del controlador, també podeu utilitzar una cadena buida. En aquest cas, també haureu d'implementar un parell de mètodes d'ajuda (que probablement haureu d'implementar de totes maneres per a la vostra comoditat quan necessiteu accedir a la consulta):
{
;
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
public void setQuery(Query _query)
{
;
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
Si necessiteu inicialitzar la consulta (per exemple, afegir intervals), hauríeu d'implementar un mètode initQuery:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Heu d'assegurar-vos de cridar aquest mètode des de la classe del controlador.