Utilizzo di una query in una classe di contratto dati SysOperation in Dynamics AX 2012
Pubblicato: 16 febbraio 2025 alle ore 01:22:26 UTC
Questo articolo illustra nei dettagli come aggiungere una query filtrabile e configurabile dall'utente a una classe di contratto dati SysOperation in Dynamics AX 2012 (e Dynamics 365 for Operations)
Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012
Le informazioni in questo post si basano su Dynamics AX 2012 R3. Potrebbero essere valide o meno per altre versioni. (Aggiornamento: posso confermare che funziona anche su Dynamics 365 for Operations)
Sembra che io dimentichi sempre i dettagli su come specificare e inizializzare una query nel framework SysOperation. Immagino che la maggior parte dei batch job che ho creato non siano basati su query configurabili dall'utente, ma ogni tanto ho bisogno di creare un batch job del genere, quindi questo post è anche per mio riferimento.
Innanzitutto, nella classe del contratto dati, la query verrà archiviata compressa in una stringa. Il suo metodo parm deve essere decorato con l'attributo AifQueryTypeAttribute, in questo modo (in questo esempio ho utilizzato la query SalesUpdate, ma puoi sostituirla con qualsiasi query AOT):
DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
;
packedQuery = _packedQuery;
return packedQuery;
}
Se invece vuoi che la query venga decisa dalla classe controller, puoi anche usare una stringa vuota. In quel caso, devi anche implementare un paio di metodi helper (che probabilmente dovresti comunque implementare per la tua comodità quando hai bisogno di accedere alla query):
{
;
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
public void setQuery(Query _query)
{
;
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
Se è necessario inizializzare la query (ad esempio, aggiungere intervalli), è necessario implementare un metodo initQuery:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Bisogna assicurarsi di chiamare questo metodo dalla classe controller.