Orden de Parámetros de informes SSRS en Dynamics 365

 En Dynamics AX

Según la documentación de Microsoft’s, el orden de los parámetros en el diálogo de parámetros al ejecutar un informe está definido por el orden definido en el fichero rdl del informe que se construye con el diseñador de informes de Visual Studio.

El problema de ordenación

Nuestros tests muestran que no es el caso. El orden de parámetros se fija en dos pasos:
Primero los parámetros se agrupan por tipo. Por ejemplo: un grupo tiene los parámetros provenientes de un data provider (relacionados con los parámetros de su data contract) y otro grupo contiene los parámetros puramente del informe rdl.
Con esto, el diálogo muestra primero los parámetros “rdl” en orden alfabético (no en el orden definido en el rdl) y después muestra los parámetros del data provider también en orden alfabético.

¿Cómo cambiar el orden?

Para asegurar que el orden es el esperado hay que modificar la clase controladora con la que se ejecuta el informe y utilizar algunas clases de ayuda para manipular data contracts.

La forma ortodoxa de hacerlo sería sobre-escribir el método prePromptModifyContract en la clase controladora. Se puede obtener el mismo resultado en el método main antes de la llamada a startOperation() (este es el caso mostrado en el ejemplo).

class MyReportController extends SrsReportRunController
{
    public static void main(Args _args)
    {
        const str designName = 'MyReport.MyPrecisionDesign';
        
        // Nuestros nombres de parámetros (en el orden deseado en el diálogo)
        const container rdlParmNames = [
                                         'customer',
                                         'year',
                                         'month',
                                         'invoiceFilter'
                                        ];

        MyReportController controller = new MyReportController();
        
        controller.parmArgs(_args);

        controller.parmReportName(designName);
        
        // Aquí empieza la diversión.
        // El informe tendrá 3 "contracts". 1 para el "data provider", 1 para el "rdl" y otro para contenerlos.
        SrsReportDataContract contract = controller.parmReportContract();  // "Contract" contenedor
        SrsReportRdlDataContract rdlContract = contract.parmRdlContract(); // "Contract" del "rdl" (aquí están nuestros parámetros)
        // En este ejemplo no nos interesan parámetros del "data provider".

        for (int i=1; i
Últimas entradas

Dejar un comentario