Buscar en este blog

jueves, 12 de diciembre de 2013

Consultar saldo de cuenta contable – Dynamics Ax 2012 en X++

Hola, pues este post es bastante rápido. Algunas veces necesitamos consultar el saldo una de una cuenta contable en Ax mediante código x++. Aquí les dejo las líneas para hacerlo de forma muy rápida.

static void JobEstadoCuenta(Args _args)
{
    LedgerBalanceMainAccountAmounts balance;
    MainAccountListPageBalanceParameters balanceParameters;
    MainAccount mainAccount;
    ;
    mainAccount = MainAccount::findByMainAccountId( "1101206001");
    balanceParameters = MainAccountListPageBalanceParameters::construct();
    balance = LedgerBalanceMainAccountAmounts::construct();
   
    balance.parmAccountingDateRange(balanceParameters.getStartDate(),balanceParameters.getEndDate());
    balance.parmPostingLayer(balanceParameters.getPostingLayer());
    balance.parmIncludeOpeningPeriod(balanceParameters.getIncludeOpeningPeriods());
    balance.parmIncludeRegularPeriod(balanceParameters.getIncludeOperatingPeriods());
    balance.parmIncludeClosingPeriod(balanceParameters.getIncludeClosingPeriods());
    balance.parmIncludeClosingPeriodBySystem(balanceParameters.getIncludeClosingPeriods());
    balance.calculateBalance(mainAccount);
    info(strFmt("%1", balance.getAccountingCurrencyBalance()));
}


Post relacionados:
Reportes SQL Reporting services (SSRS) en Microsoft Dynamics Ax 2012
Saldo de cuenta contable por dimension
Calcular impuestos en ordenes de venta
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. 

Reportes SSRS en Dynamics Ax 2012 basados en RDP (Report data provider)

 
Existen escenarios donde la consulta de un query no nos basta para sacar la información de ax y presentarla en un reporte, en esas ocasiones donde necesitamos procesar la información antes para ponerla de cierta forma en el reporte es cuando debemos usar en conjunto con el query una clase RDP que contenga la lógica; ya que tenemos la información como queremos la guardamos en una tabla temporal y esta tabla temporal es la que usamos como fuente de datos para nuestro reporte, sencillo no?
Bueno, yo se que a la primera no suena taaaan sencillo, así que vamos al ejemplo. 
En el primer post les mostré cómo crear un reporte, hicimos un query que consultaba todos los campos de la tabla de cliente "CustTable" con el parametro de Cust Account (código de cliente). Basandonos en ese query, anexemos al datasource la tabla CustTrans, entonces nuestro query debe verse así:

Image(11)

Y si dejamos unos segundos el cursor sobre la tabla "padre" que es CustTable podemos ver el query que ahora tenemos formado con CustTrans.
Y no olviden poner la propiedad Dynamic de los campos en Yes, igual que como se hizo con la tabla CustTable. Sino lo hacen les va a marcar error. (En este paso, piensen si requieren toooodos los campos de la tabla, si solo va a querer unos cuantos agréguenlos a mano y no modifiquen la propiedad Dynamic).

Image(12)
Ahora, como les mencione en el primer párrafo, los 3 elementos que necesitamos para hacer un reporte basado en RDP son:
  • Una clase RDP
  • Un query
  • Una tabla temporal
Como vamos a usar nuestro query del post anterior (sino lo tienes pues crealo, solo arrastrando las tablas CustTable y CustTrans a los datasources del query, igualito que como se ve en la imagen de arriba), entonces ahora nos falta crear la tabla y la clase RDP.
Imaginemos que nuestro reporte debe mostrar el monto de transacciones en pesos mexicanos únicamente cuando el cliente sea el 2121, entonces como todas las transacciones estan en dolares, nuestra lógica debe indicar que solo para el cliente 2121 el monto de transacciones debe multiplicarse por el tipo de cambio, en este caso tomaremos $13 pesos.

Vamos creando nuestra clase y la vamos a llamar: ClaseEjemploRDP, la vamos a extender de SRSReportDataProviderBase. Después necesitamos decirle con cuál query vamos a trabajar en conjunto, esto lo hacemos poniendo antes de la declaración el atributo : [SRSReportQueryAttribute(querystr(EjemploQueryClientes))]

Dentro de la declaración de la clase, vamos a declarar las variables que necesitamos guardar sus valores, o sea, que vamos a poner todos los campos que queremos que se muestren en nuestro reporte
Image(13)
La primera línea la comente porque aun no creamos nuestra tabla temporal, así que vamos a crearla y descomentamos la línea. La tabla la vamos a crear para guardar los datos que vamos a usar en el reporte, entonces debe tener todos los campos que vamos a usar en nuestro reporte. Muuuy importante: en la propiedad de TaleType seleccionar "InMemory".
Actualización: Para Ax R2, esta tabla si debe ser tabla regular.

Image(14)

No olviden poner los EDTs (Extended Data Type) a cada campo, son los mismos que los nombres de los campos de ejemplo.
Lo siguiente es descomentar la línea que dejamos comentada en la declaración de la clase y crearnos un método público en esa misma clase, que nos retorne toda la información de la tabla temporal, ponemos también el atributo SRSReportDataSetAttribute, con este atributo le indicamos a Ax cuál es nuestra tabla temporal con la que vamos a trabajar en conjunto. El método debe verse así:

Image(15)

En seguida vamos a crear un método para insertar los registros que vayamos formando en la lógica a nuestra tabla temporal. Nuestro método debe quedar:

Image(16)

En la imagen anterior solo falto la última línea que es la que hace la magia, o sea, tablaTemporalRDP.insert();
Luego, tenemos que crear la lógica que debe implementar la clase, esto lo vamos a hacer sobrescribiendo el método processReport o en nuestras versiones de Ax en español "cancelado el método processReport", ustedes me entienden. Por qué aquí? porque es el punto donde el proceso de reporte comienza, este método es llamado desde el framework de reporteo. Entonces, la lógica debe ser escrita aquí, para nuestro caso, este método debería quedar como sigue:

Image(17)

public void processReport()
{
    QueryRun        qr;    
    ;
   
    qr = new QueryRun(this.parmQuery());
   
    While (qr.next())
    {        
        custTable = qr.get( tableNum(custTable));
        custTrans = qr.get( tableNum(custTrans));
        amountCur = custTrans.Amount;
 voucher = custTrans.voucher;
 transDate = custTrans.transDate;

        this.insertTablaTemporlRDP();       
    }

}

Con esto ya tenemos nuestra fuente de datos que se va a usar en nuestro reporte, ahora si nos vamos a Visual Studio y creamos un nuevo proyecto del tipo Microsoft Dynamcs AX, lo llamamos ReporteBasadoEnRDP. Agregamos al proyecto un elemento del tipo "Report" y lo renombramos como ReportePruebaRDP. Creamos un nuevo DataSet (clic derecho en datasets -> nuevo) lo renombramos como DatosRDPDS y en la propiedad de este dataset llamada "Data Source Type" elegimos "Report Data Provider" y en la propiedad "Query" seleccionamos nuestra clase RDP (ClaseEjemploRDP) que creamos en Ax.
En este caso el processReport de este ejemplo:

Image(18)
Image(19) Image(20)
Image(21)
Solo nos falta el diseño, en la parte de "Designs" agregamos el AutoDesign y arrastramos nuestro dataset "DatosRDP" al diseño creado, debe verse así:
Image(22)
Listo!!! es todo!
Ahora solo agregamos el reporte al AOT, click derecho sobre el proyecto, elegimos "Add ReporteBasadoEnRDP to AOT" y despues implementamos, click derecho sobre proyecto y seleccionamos "Deploy" o "Implementar".
Image(23)
Para verlo en Ax, ahora solo creamos un objeto "Output" y en sus propiedades "ObjectType" seleccionamos "SSRSReport", en 2Object" seleccionamos nuestro reporte "ReportePruebaRDP", guardamos y hacemos clic derecho sobre el objeto Output, elegimos "Abrir" y veremos nuestro reporte!!!
Nota: Si no nos gusta como se ve nuestro reporte porque solo se ven las columnas sin ningún formato, le podemos aplicar un estilo para que al menos nos presente la fecha y hora de impresión, la compañía a la que pertenece y datos básicos. Esto lo hacemos en Visual Studio, eligiendo:
Image(24)
y en la tabla que se crea cuando arrastramos el dataset:
Image(25)
Con estos cambios tendríamos un reporte como este:
Image(26)
Resumen:
Diseñar nuestro reporte en papel para saber qué campos necesitamos
Crear nuestro query con los campos necesarios
Crear una clase que herede de SRSReportDataProviderBase
En la declaración de la clase poner el atributo SRSReportQueryAttribute indicando el nombre de nuestro query al que será enlazada la clase RDP
Crear la tabla temporal con todos los campos que vayamos a usar en el reporte
Crear el método que regrese toda la información de nuestra tabla temporal con el atributo SRSReportDataSetAttribute
Crear método en clase para insertar en nuestra tabla temporal
Sobreescribir el método processReport con la lógica y manejo de nuestros datos e insertar en nuestra tabla temporal



Y por cierto, acuerdate de darle click a algún anuncio si el post te sirvio de algo.

Por último, te invito a que te unas a la página de facebook recién creada para estar al día con las actualizaciones del blog y que podamos tener más comunicación. La meta? es hacer la comunidad de habla hispana mas grande sobre Dynamics Ax en cuestiones de desarrollo.





<< Anterior - Filtrar reportes                                         Siguente - Clase controladora (controller) >>


<<<<<     Indice de tutorial de Reportes SSRS....




Enterprise Portal Dynamics Ax 2012 - Implementar ListPage

 
Para implementar el ListPage en el Enterprise Portal es necesario:
1. Arrastrar nuestro ListPage a Menu Item > Display para crear el menu item.
2. Click derecho sobre el menuitem que se creo y  seleccionar Implementar en EP o Deploy to EP
Image(49)
3. Después, seleccionar el módulo donde se va a implementar:
Image(50)
Si todo salió bien, nos mostrara un aviso en infolog y esto creara una página en la lista de documentos del EP, creara también el link URL al menuitem de nuestro listpage.
Image(51)
Para ver el listPage en el EP, primero debemos agregar nuestra URL al módulo que seleccionamos, esto lo hacemos buscando el menu que corresponde a nuestro módulo, este nombre de Web Menu lo indica la propiedad QuickLaunch.
Image(52)
Buscamos este WebMenu y arrastramos nuestra URL
Image(53)
Para actualizar el EP y ver nuestro ListPage, vamos a Home y seleccionamos Actualizar AOD
Image(54)
ir al módulo que seleccionamos para que se implementara, en este caso Home\GRWTestModule y ahí veremos nuestra página implementada
Image(55)
Para ver el ListPage, hacemos click sobre la página
Image(56)


<<    Crear ListPage con PartPreview Pane                                 Crear DataSet     >>

Enterprise Portal Dynamics Ax 2012 – Crear List Pages y PartPreview Pane

 
Un ListPage es creado desde el AOT y puede ser visualizado tanto para el cliente de AX como para el Enterprise Portal. El procedimiento es el siguiente:
1. En el nodo de Forms del AOT click derecho y seleccionar Nuevo a partir de plantilla o en ingles New Form from template > List Page. Cabe mencionar que debe ser a partir del AOT directo porque si se creo un grupo del tipo Forms en nuestro proyecto esta opción no aparece.
Image(40)
2. En la propiedad Query del DataSource del formulario, seleccionamos nuestro query que creamos en Cues, que sirve para mostrar todas las ordenes de compra abiertas, con esto nos agrega en automático las tablas de las que esta compuesto nuestro query, en este caso solo PurchTable. A partir de estos datasources agregados en automático, arrastrar los campos que queramos en nuestro grid y que se vayan a mostrar en el ListPage. Y no olvidar poner en la propiedad DataSource del grid el nombre de la tabla de donde se estan consultando los datos, en este caso PurchTable.
Image(41)
Como nuestro ListPage fue creado a partir de una plantilla ya tiene un ActionPane con las funciones comunes de crear, editar, actualizar etc. Quitar las que no vayamos a usar y/o personalizar las que deseemos. Si abrimos nuestro form, aparecera así:
Image(42)

 


Crear el PartPreview Pane

1. En Parts > Info Parts crear un elemento nuevo y en las propiedades ponerle nombre.
2. En la propiedad Query seleccionar nuestro query que proveera de información al PartPreview
Image(43)
3. Crear un nuevo grupo en el subnodo Layout del InfoPart
Image(44)
4. Ponerle nombre al grupo y dentro del grupo crear los campos que queramos visualizar y que se encuentran dentro del query que seleccionamos al inicio.
Image(45)
5. Para agregar el InfoPart a nuestro ListPage lo que necesitamos es crear un MenuItem para el infoPart. En el AOT arrastramos nuestro InfoPart al nodo de MenuItems > Display.
Image(46)
Después, en nuestro ListPage, en la sección de Parts, click derecho y seleccionar New Part Reference. En las propiedades del elemento creado poner el nombre y en la propiedad MenuItemName seleccionar nuestro menu item que creamos para nuestro InfoPart, tambien cambiar la propiedad PartLocation a PreviewPane.
Ahora, para relacionar el datasource del ListPage con el previewPane debemos indicarle al part en la propiedad DAtaSourceRelation la opción SelfLink si el origen de datos es el mismo, en este caso, si es el mismo query.
Image(47)
Solo como anotación, en la propiedad DisplayTarget podemos seleccionar que solo se vea este preview en el EP o en Cliente de Ax o en ambos.
Si abrimos nuestro ListPage desde el AOT, puedo que nuestro PreviewPane se muestra como un factBox, pero esto cambiara en el EP, ya que al momento de implementarlo en el EP ya se vera como deseamos.
Image(48)


<<  Crear Cues en Enterprise Portal           Implementar List Page en Enterprise Portal >>

Enterprise Portal Dynamics Ax 2012 – Crear Cues

 
Esto solo sirve como indicativo, se usa para que visualmente un usuario pueda saber el número de registros sobre una consulta en particular.
Image(30)
Para crearlo:
1. Crear un query de acuerdo a la consulta que se requiera, por ejemplo, si se quieren mostrar todas las ordenes de compra abiertas
Image(31)
2. Crear un nuevo Menu Item > Display para el query, NO solo arrastrar, debe ser a partir de nuevo porque para que se pueda crear el Cue nuevo el MenuItem debe ser de tipo Form. Y en la propiedad llamada Query poner el nombre del query que se creo anteriormente.


3. Finalmente en Parts > Cues, crear un nuevo Cue y en la propiedad MenuItemName poner el nombre del menuItem que creamos en el paso anterior.
Image(32)
Con esto ya se creo el Cue nuevo, ahora falta implementarlo en el Enterprise Portal. Primero debemos entrar a la página donde queramos ponerlo y entrar en modo edición de la página, esto se hace con el botón Page y después en la opción Edit Page.
Image(33)
Image(34)
Después hacemos click en el WebPart donde se va a colocar, en la parte superior debemos elegir el tipo de webPart que vamos a insertar, que en este caso es un objeto del tipo Cue, o sea, Categories > Microsoft Dynamics AX > Cues > Add button
Image(35)
Image(36)
Una vez que se agrega la sección en la página, hacemos clic en Agregar pila o en ingles Add Cue. En la ventana emergente seleccionamos el nombre del Cue que creamos y listo.
Image(37)
 Image(38)
Listo! salimos del modo de edición de página con el boton Stop editing y podemos visualizar nuestro cambio y nuestro nuevo Cue.
Image(39)


Crear List Page con PartPreview Pane    >>