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.
{
Ahora cuando seleccionemos nuestra propiedad query ya no nos mostrará las queries de ax sino las clases de tipo DataProvider
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.
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.
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.
Nos crearemos un proyecto con visual
Le
asignaremos un nombre a nuestro proyecto en visual (Este nombre será el mismo
que veremos en ax).
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
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.
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
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
Publicar un comentario