Utilização de uma consulta numa classe de contrato de dados SysOperation no Dynamics AX 2012
Publicado: 16 de fevereiro de 2025 às 01:23:03 UTC
Este artigo aborda os detalhes sobre como adicionar uma consulta configurável pelo utilizador e filtrável a uma classe de contrato de dados SysOperation no Dynamics AX 2012 (e Dynamics 365 for Operations)
Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012
As informações neste post são baseadas no Dynamics AX 2012 R3. Pode ou não ser válido para outras versões. (Actualização: Posso confirmar que isto também funciona no Dynamics 365 for Operations)
Parece que me esqueço sempre dos detalhes sobre como especificar e inicializar uma consulta na estrutura SysOperation. Penso que a maioria dos trabalhos em lote que tenho feito não são baseados em consultas configuráveis pelo utilizador, mas de vez em quando preciso de fazer um trabalho em lote, pelo que este post também é para minha própria referência.
Primeiro, na classe de contrato de dados, a consulta será armazenada numa string. O seu método parm deve ser decorado com o atributo AifQueryTypeAttribute, assim (neste exemplo utilizei a consulta SalesUpdate, mas pode substituí-la por qualquer consulta AOT):
DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
;
packedQuery = _packedQuery;
return packedQuery;
}
Se pretender que a consulta seja decidida pela classe do controlador, também pode utilizar uma string vazia. Nesse caso, também precisa de implementar alguns métodos auxiliares (que provavelmente deve implementar de qualquer forma para sua própria conveniência quando precisar de aceder à consulta):
{
;
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
public void setQuery(Query _query)
{
;
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
Se precisar de inicializar a consulta (por exemplo, adicionar intervalos), deve implementar um método initQuery:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Precisa de ter a certeza de chamar este método da classe do controlador.