Buscar en este blog

miércoles, 6 de mayo de 2015

Aplicar filtros a partir del llamador a un reporte SSRS por clase RDP en Dynamics Ax 2012

En algunos post pasados puse las instrucciones para hacer reportes RDP, que a su vez usaran una clase contrato para que apareciera una ventana de filtros y así el usuario seleccione los valores que requiera.

En este post quiero poner un ejemplo de cómo asignar un filtro a un reporte, que tome como parámetro el registro desde el formulario donde se manda llamar y que oculte los filtros al usuario, para ir directo a la visualización del reporte.

Para esto, necesitamos nuestra clase contrato donde voy a poner dos parámetros, uno que es el recId del registro que esta llamando mi reporte, y otro parámetro donde necesito saber quién lo esta llamando para definir la lógica de consulta de datos en cada caso.

[DataContractAttribute]
public class GRWMemoriaCalculoContract
{
    RefRecId    refRecId;
    str         menuItemCaller;
}


[DataMemberAttribute('RefRecId')]
public RefRecId parmRefRecId(RefRecId _refRecId = refRecId)
{
    refRecId = _refRecId;
    return refRecId;
}

[DataMemberAttribute('menuItemCaller')]
public str parmMenuItemCaller(str _menuItemCaller = menuItemCaller)
{
    menuItemCaller = _menuItemCaller;
    return menuItemCaller;
}

Ahora en la clase controller, lo que se va a hacer es que tome los argumentos que se están pasando, para asignarlos a la clase contrato. Esto lo hacemos con el método preRunModifyContract.

protected void preRunModifyContract()
{
    GRWMemoriaCalculoContract    contract= this.parmReportContract().parmRdpContract() as GRWMemoriaCalculoContract;
   
    //Validamos que los argumentos existan y cuál menu item nos esta llamando
    if (this.parmArgs() && this.parmArgs().record())
    {
        //Aquí se asigna el recId a nuestra clase contract
        //del registro del formulario que esta llamando el reporte
        contract.parmRefRecId(this.parmArgs().record().RecId);
       
        //Llamando desde facturas
        if (this.parmArgs().menuItemName() == menuitemActionStr(GRWMemoriaCalculoDiarioFactura))
            contract.parmMenuItemCaller( "GRWMemoriaCalculoDiarioFactura" );
       
        //Llamando desde facturas proforma
        if (this.parmArgs().menuItemName() == menuitemActionStr(GRWMemoriaCalculoFacturaProforma))
            contract.parmMenuItemCaller( "GRWMemoriaCalculoFacturaProforma" );
    }
    else
        super();      

}

Finalmente en el main de la clase controller, solo mandamos llamar nuestro reporte y la lógica que hayamos puesto en el processreport de la clase DP se encargará de buscar los datos del reporte y mostrarlos en base al filtro que usamos ya que al asignar los valores a nuestros parámetros del contrato, estos valores se van hasta la clase DP.

public static void main(Args args)
{
    SrsReportRunController ssrsController = new GRWMemoriaCalculoController();

    //Pasando los argumentos del llamados a la
    //nueva instancia de la clase controller
    ssrsController.parmArgs(args);

    //set the report name and report design to run
    ssrsController.parmReportName( ssrsReportStr(GRWMemoriaCalculoReport, Report));
   
    //Con esta instruccion indicamos que no se muestren los filtros
    //personalizados al usuario y que se visualice el reporte directamente
    ssrsController.parmShowDialog( false);
    ssrsController.startOperation();

}

Un ejemplo del método processReport de la clase DP es como el siguiente:

public void processReport()
{
    GRWMemoriaCalculoContract contract = this.parmDataContract() as GRWMemoriaCalculoContract;
   
    if (contract.parmMenuItemCaller() == "GRWMemoriaCalculoDiarioFactura" )
        this.setDiarioFactura(contract.parmRefRecId());
   
    if (contract.parmMenuItemCaller() == "GRWMemoriaCalculoFacturaProforma" )
        this.setFacturaProforma(contract.parmRefRecId());

}


Sin olvidar que en la declaración de la clase DP, debemos indicar el contracto
[SRSReportParameterAttribute(classStr(GRWMemoriaCalculoContract)]
public class GRWMemoriaCalculoDP extends SRSReportDataProviderBase
{
...



Tips:
Si en el diseño se necesita poner el nombre de la compañia, no es necesario llenar un campo en la tempora, esto se hace desde visual studio, a un label le podemos asignar este valor en su expresión y así obtenemos el nombre la empresa donde se esta generando el reporte. (estas líneas vienen de cómo un reporte autogenerado pone el nombre de la empresa)

=Microsoft.Dynamics.Framework.Reports.DataMethodUtility.PostDataMethodEvaluation(Microsoft.Dynamics.Framework.Reports.DataMethodUtility.UpdateAxContextPartition(Parameters!AX_CompanyName.Value, Parameters!AX_UserContext.Value, Parameters!AX_RenderingCulture.Value, Parameters!AX_PartitionKey.Value),Microsoft.Dynamics.Framework.Reports.DataMethodUtility.GetFullCompanyNameForUser(Parameters!AX_CompanyName.Value, Parameters!AX_UserContext.Value))

Para poner los número de página en cada hoja:

=System.String.Format(Labels!@SYS182566, "" & Globals!PageNumber & "" , "" & Globals!TotalPages & "" )


Post relacionados:
Reportes SQL Reporting services (SSRS) en Microsoft Dynamics Ax 2012
Filtrar reportes en Dynamics Ax 2012 SSRS basado en query con un parámetro especifico
Reportes SSRS en Dynamics Ax 2012 basados en RDP (Report data provider)
Crear reportes SSRS usando RDP (Report Data Provider) con clase controladora en Dynamics Ax 2012


Y por cierto, acuérdate de darle click a algún anuncio si el post te sirvió de algo.


No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma.




2 comentarios:

  1. Estimado, no pidas clic en el anuncio pues google te puede penalizar (claro, si es usas Adsense), eso me paso a mi. Borra este mensaje también.

    ResponderEliminar