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
Ultimo aggiornamento: 12 gennaio 2026 alle ore 08:47:10 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 contenute in questo post si basano su Dynamics AX 2012 R3. Potrebbero essere valide anche per altre versioni. (Aggiornamento: posso confermare che funziona anche su Dynamics 365 for Operations)
Mi sembra sempre di dimenticare i dettagli su come specificare e inizializzare una query nel framework SysOperation. Immagino che la maggior parte dei batch job che ho creato non si basino su query configurabili dall'utente, ma ogni tanto mi capita di dover creare un batch job di questo tipo, quindi questo post è anche per mio riferimento.
Innanzitutto, nella classe del contratto dati, la query verrà memorizzata 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 è possibile sostituirla con qualsiasi query AOT):
DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
;
packedQuery = _packedQuery;
return packedQuery;
}
Se si desidera che la query venga decisa dalla classe controller, è possibile utilizzare anche una stringa vuota. In tal caso, è necessario implementare anche un paio di metodi helper (che probabilmente è consigliabile implementare comunque per comodità quando si ha 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);
}
È necessario assicurarsi di chiamare questo metodo dalla classe controller.
Ulteriori letture
Se ti è piaciuto questo post, potrebbero piacerti anche questi suggerimenti:
- La differenza tra data() e buf2Buf() in Dynamics AX 2012
- Come scorrere gli elementi di un enum dal codice X++ in Dynamics AX 2012
- Formattazione stringa con macro e strFmt in Dynamics AX 2012
