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
Última atualização: 12 de janeiro de 2026 às 08:47:17 UTC
Este artigo aborda os detalhes sobre como adicionar uma consulta configurável e filtrável pelo utilizador a uma classe de contrato de dados SysOperation no Dynamics AX 2012 (e no Dynamics 365 for Operations)
Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012
A informação neste artigo baseia-se no Dynamics AX 2012 R3. Pode ou não ser válida para outras versões. (Atualização: Posso confirmar que isto também funciona no Dynamics 365 para Operações)
Parece que me esqueço sempre dos detalhes sobre como especificar e inicializar uma consulta no framework SysOperation. Acho que a maioria dos trabalhos em lote que tenho feito não se baseiam em consultas configuráveis pelo utilizador, mas de vez em quando preciso mesmo de fazer um trabalho em lote, por isso este post é também para minha própria referência.
Primeiro, na classe de contrato de dados, a consulta será armazenada numa cadeia de caracteres. O seu método parm deve ser decorado com o atributo AifQueryTypeAttribute, assim (neste exemplo usei 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 quiseres que a consulta seja decidida pela classe controller, também podes usar uma string vazia. Nesse caso, também precisas de implementar alguns métodos auxiliares (que provavelmente deves implementar na mesma para tua conveniência quando precisares de aceder à consulta):
{
;
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
public void setQuery(Query _query)
{
;
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
Se precisares de inicializar a consulta (por exemplo, adicionar intervalos), deves implementar um método initQuery:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Tens de garantir que chamas este método a partir da classe controlador.
Leitura adicional
Se gostou deste post, também pode gostar destas sugestões:
- Como iterar sobre os elementos de um Enum a partir do código X++ no Dynamics AX 2012
- Visão geral rápida do Dynamics AX 2012 SysOperation Framework
- Utilização do SysExtension Framework para descobrir qual a subclasse a instanciar no Dynamics AX 2012
