Orden de Parámetros de informes SSRS en Dynamics 365

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<=conlen(rdlParmNames); i++)
        {
            str parName = conPeek(rdlParmNames, i);

            if (rdlContract.parameterExists(parName)) // Nos aseguramos de que el parámetro existe
            {
                // Recogemos el parámetro
                SRSReportParameter parameter = rdlContract.getParameter(parName);
                
                // Damos orden al parámetro. El orden parece numérico, pero es alfabético,
                // así que el ejemplo suma 10 al contador del bucle para evitar problemas como 1,10,11,2,3
                // Esto nos permite usar parámetros del 1 al 89, que debería ser suficiente.
                parameter.displayOrderKey(int2Str(i+10)); 
            }
        }
        controller.startOperation();
    }
}
Últimas entradas