Miklix

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)


Questa pagina è stata tradotta automaticamente dall'inglese per renderla accessibile al maggior numero di persone possibile. Purtroppo, la traduzione automatica non è ancora una tecnologia perfezionata, quindi possono verificarsi degli errori. Se preferite, potete consultare la versione originale in inglese qui:

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):

public Query getQuery()
{
    ;

    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:

public void initQuery()
{
    Query queryLocal = this.getQuery();
    ;

    // add ranges, etc...

    this.setQuery(queryLocal);
}

Bisogna assicurarsi di chiamare questo metodo dalla classe controller.

Condividi su BlueskyCondividi su FacebookCondividi su LinkedInCondividi su TumblrCondividi su XCondividi su LinkedInAggiungi su Pinterest

Mikkel Bang Christensen

Sull'autore

Mikkel Bang Christensen
Mikkel è il creatore e proprietario di miklix.com. Ha oltre 20 anni di esperienza come programmatore di computer/sviluppatore di software ed è attualmente impiegato a tempo pieno in una grande azienda IT europea. Quando non scrive sul blog, dedica il suo tempo libero a una vasta gamma di interessi, hobby e attività, che in qualche modo si riflettono nella varietà di argomenti trattati in questo sito.