2.3.Introducción a la clase DataProvider.

Hoy vamos a crear un informe utilizando la clase DataProvider, aunque en principio se trata de un informe muy simple y del cual se podría sacar la información a través de una query, lo haremos de esta manera para que podáis entender el funcionamiento de las clases relacionadas con la DP.

Para realizar el ejemplo necesitaremos  una query de donde sacar los datos, una tabla temporal donde guardar los datos que mostraremos en el informe, una clase de tipo controller para lanzar el informe, una clase de tipo dataprovider que nos rellenará la tabla temporal

Empezaremos creando la query
Crearemos una query llamada CustInvoiceJourReport .


Agregaremos al nodo DataSources la tabla CustInvoiceJour.

En las propiedades del nodo fields del DataSource asignaremos a la propiedad Dynamic a “Yes”
Esto hará que todos los campos de la tabla CustInvoiceJour aparezcan en nuestras query.


Esta query tendrá todas las facturas de los clientes.
La tabla temporal.
Nos crearemos una tabla tmp que llamaremos CustInvoicejourReportTmp y agregaremos los siguientes campos.


Ya que esta tabla la podríamos utilizar en otro proceso sería una buena práctica que los campos que agregamos extiendan de sus correspondientes extendeds.

Recordad en ponerle el valor “InMemory” en la propiedad   tableType de la tabla.



Las clases

Empezaremos creándonos una clase de tipo controller

Class CustInvoiceJourReportController extends SrsReportRunController
{
}
Y un método main para la clase.
Public static void main(Args    _args)
{
               CustInvoiceJourReportController            controller = new CustInvoiceJourReportController();
               ;
                //controller.parmReportName(ssrsReportStr());
               controller.parmArgs(_args);
               controller.startOperation();
}

De momento comentaremos el método parmReportName ya que no tenemos creado el informe.

Recuerdo que el método parmArgs asigna los parámetros a la clase y el startOperation es el que iniciará el processo.
Ahora sí, crearemos nuestra clase DataProvider.
[SRSReportQueryAttribute(queryStr(CustinvoiceJourReportController))]
Class CustInvoiceJourReportDP extends SRSReportDataProviderBase
{

                CustinvoiceJourReportTmp        tmp;

}

Explicaremos un poco que acabamos de hacer.

Si os fijáis entre corchetes les estoy indicando a la clase la query que utilizará.

Y como veis extendernos de la clase SRSReportDataProviderBase y nos declaráramos una variable de la nuestra tabla tmp.


A continuación nos crearemos un método que se utilizara para rellenar la tabla tmp.


[SysEntryPointAttribute] //Esto le indica el punto de entrada al informe
Public void processReport()
{
                QueryRun         qr = new QueryRun(this.parmQuery()); //Recuperamos la query del informe
                CustInvoiceJour   custInvoiceJour;
                ;
                //Rellenaremos nuestra tabla temporal
               While (qr.next())
  {
              custInvoiceJour = qr.get(tablenum(CustInvoiceJour));
              tmp.clear();
                           tmp.CustGroup          = custInvoiceJour.custGroup;
                           tmp.DueDate              = custInvoiceJour.DueDate;
                           tmp.invoiceAccount  = custInvoiceJour.invoiceAccount;
                           tmp.InvoiceDate        = custInvoiceJour.invoiceDate;
                           tmp.InvoiceId             = custInvoiceJour.InvoiceId;
                           tmp.salesId                 = custInvoicejour.salesId;
                          tmp.insert();
}
}

Acabamos de crear un método por donde entrara nuestro informe para rellenar la tabla ,ahora solo nos falta un método que nos devuelva la tabla.

[SRSReportDataSetAttribute(tableStr(CustInvoiceJourReportTmp))] //indica que tabla devuelve
Public CustInvoiceJourReportTmp getCustInvoicejourReportTmp()
{
      Select tmp; //Fijaos que es la variable de nuestro classDeclaration
      Return tmp;
}

Nota: Sin este método, en nuestro informe no podremos seleccionar ningún campo a la hora de seleccionar la clase que devuelve los datos.
Si tuviéramos más de una tabla tmp en nuestra clase, deberemos crear tantos métodos como tablas tmp tengamos que devolver.

Recordad a cada cambio en las clases hacerle una compilación CIL.


Una vez tengamos nuestras clases y nuestra tabla preparada vamos a por el informe.
Esto ya está explicado pero lo repito.
Nos crearemos un proyecto con visual


Le asignaremos un nombre a nuestro proyecto en visual (Este nombre será el mismo que veremos en ax).




Agregaremos un report a nuestro proyecto.







Le daremos un nombre a nuestro informe y un título que se mostrará en la cabecera del informe.

Agregaremos un DataSet a nuestro informe

Modificaremos las propiedades de nuestro DataSet, le asignaremos un nombre .

Y aquí tenemos una novedad, hasta ahora en la propiedad DataSourceType le indicábamos que sacaríamos los datos de una Query, ahora le indicaremos que el tipo de dataSource es ReportDataprovider



Ahora cuando seleccionemos nuestra propiedad query ya no nos mostrará las queries de ax sino las clases de tipo DataProvider

Seleccionaremos la clase que creamos anteriormente.


Presionaremos el botón next y a continuación nos aparecerán los campos de nuestra tabla tmp


Nota: Si no habéis creado el método que devuelve la tabla temporal en la clase , esto lo veréis vacío.

Cuando presionemos el botón ok los campos seleccionados se agregaran a nuestro DataSet.
En caso de no verlos refrescad el dataset

 
A continuación crearemos un diseño para nuestro informe.

En este post no explicare todavía como crear un precisión Design , así que crearemos un diseño automatico.


Le cambiaremos el nombre al diseño autoDesign



Y le asignaremos una plantilla.
Le añadiremos a nuestro nodo report una tabla

En las propiedades del nodo table modificaremos la propiedad DataSet, asignándole el nuestro

Nota: Esto agregara automáticamente todos los campos que contiene el dataset, en caso de querer agregar solo unos pocos se deberá hacer manualmente, ya sea arrastrándolos del dataset o creandolos en el nodo data.



También le indicaremos una plantilla para el informe
Ya tenemos nuestro diseño solo nos falta implementar la solución




Si todo ha ido bien os deberá aparecer un mensaje como este.
Lo último que nos faltará es agregar el proyecto a AX.
 
Si habéis tenido éxito os aparecerá un mensaje como el que sigue.
Para probarlo le haremos un preview.


Y nos situaremos en la pestaña report.




Ya tenemos el informe acabado, nos faltará modificar alguna cosa en ax para poder probarlo.
En nuestro método main de la clase controller deberemos indicarle el nombre del report que antes había dejado comentado porque no estaba creado.

Controller.parmReportName(ssrsReportStr(CustInvoiceJourReport, report))

Recordad que a cada cambio que le hagamos a una clase deberemos ejecutarle el CIL de incremento.


Para probarlo en ax nos podemos situar encima de nuestra clase controller y le damos a abrir en el menu contextual







Si todo esta ok , podremos ver nuestro diseño ahora desde ax.













Comentarios