Uso de una consulta en una clase de contrato de datos de SysOperation en Dynamics AX 2012
Publicado: 16 de febrero de 2025, 1:22:18 UTC
Este artículo analiza los detalles sobre cómo agregar una consulta filtrable y configurable por el usuario a una clase de contrato de datos SysOperation en Dynamics AX 2012 (y Dynamics 365 for Operations)
Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012
La información de esta publicación se basa en Dynamics AX 2012 R3. Puede que sea válida o no para otras versiones. (Actualización: puedo confirmar que esto también funciona en Dynamics 365 for Operations)
Siempre olvido los detalles sobre cómo especificar e inicializar una consulta en el marco SysOperation. Supongo que la mayoría de los trabajos por lotes que he estado realizando no se basan en consultas configurables por el usuario, pero de vez en cuando necesito realizar un trabajo por lotes de este tipo, por lo que esta publicación también es para mi propia referencia.
En primer lugar, en la clase de contrato de datos, la consulta se almacenará empaquetada en una cadena. Su método parm debe estar decorado con el atributo AifQueryTypeAttribute, de la siguiente manera (en este ejemplo, he utilizado la consulta SalesUpdate, pero puede reemplazarla con cualquier consulta AOT):
DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
;
packedQuery = _packedQuery;
return packedQuery;
}
Si desea que la consulta la decida la clase del controlador, también puede utilizar una cadena vacía. En ese caso, también debe implementar un par de métodos auxiliares (que probablemente debería implementar de todos modos para su propia conveniencia cuando necesite acceder a la consulta):
{
;
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
public void setQuery(Query _query)
{
;
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
Si necesita inicializar la consulta (por ejemplo, agregar rangos), debe implementar un método initQuery:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Debe asegurarse de llamar a este método desde la clase controlador.