Usando uma consulta em uma classe de contrato de dados SysOperation no Dynamics AX 2012
Publicado: 16 de fevereiro de 2025 às 01:23:02 UTC
Última atualização: 12 de janeiro de 2026 às 08:47:16 UTC
Este artigo detalha como adicionar uma consulta configurável e filtrável pelo usuário 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
As informações neste post são baseadas no Dynamics AX 2012 R3. Elas podem ou não ser válidas para outras versões. (Atualização: Posso confirmar que isso também funciona no Dynamics 365 for Operations)
Parece que sempre me esqueço dos detalhes sobre como especificar e inicializar uma consulta no framework SysOperation. Imagino que a maioria dos jobs em lote que tenho criado não se baseia em consultas configuráveis pelo usuário, mas de vez em quando preciso criar um job em lote desse tipo, então este post também serve como minha própria referência.
Primeiro, na classe de contrato de dados, a consulta será armazenada compactada em uma string. Seu método `parm` deve ser decorado com o atributo `AifQueryTypeAttribute`, como mostrado abaixo (neste exemplo, usei a consulta `SalesUpdate`, mas você pode substituí-la por qualquer consulta AOT):
DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
;
packedQuery = _packedQuery;
return packedQuery;
}
Se preferir que a consulta seja decidida pela classe controladora, você também pode usar uma string vazia. Nesse caso, você também precisará implementar alguns métodos auxiliares (que provavelmente você deveria implementar de qualquer forma para sua própria conveniência quando precisar acessar a consulta):
{
;
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
public void setQuery(Query _query)
{
;
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
Se você precisar inicializar a consulta (por exemplo, adicionar intervalos), você deve implementar um método initQuery:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Você precisa garantir que está chamando esse método a partir da classe controladora.
Leitura adicional
Se você gostou deste post, você também pode gostar destas sugestões:
- Chamando serviços de documentos AIF diretamente do X++ no Dynamics AX 2012
- Erro "Nenhuma classe de metadados definida para objeto de contrato de dados" no Dynamics AX 2012
- Usando o SysExtension Framework para descobrir qual subclasse instanciar no Dynamics AX 2012
