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
Este artigo aborda os detalhes sobre como adicionar uma consulta configurável pelo usuário 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. 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 esqueço os detalhes sobre como especificar e inicializar uma consulta no framework SysOperation. Acho que a maioria dos trabalhos em lote que tenho feito não são baseados em consultas configuráveis pelo usuário, mas de vez em quando preciso fazer um trabalho em lote, então este post também é para minha própria referência.
Primeiro, na classe de contrato de dados, a consulta será armazenada em uma string. Seu método parm deve ser decorado com o atributo AifQueryTypeAttribute, assim (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 você quiser que a consulta seja decidida pela classe do controlador, você também pode usar uma string vazia. Nesse caso, você também precisa implementar alguns métodos auxiliares (que você provavelmente deve implementar de qualquer maneira 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 ter certeza de chamar esse método da classe do controlador.