Buscar en este blog

domingo, 25 de noviembre de 2012

Filtrar reportes en Dynamics Ax 2012 SSRS basado en query con un parámetro especifico


Muchas veces necesitamos filtrar los reportes por un parámetro especifico, algunas veces queremos que el usuario elija su propio filtro y otras veces queremos pasarle al reporte un parámetro por código. En este post, explico el primer escenario.

En este caso, voy a tomar como base el reporte que hicimos en el post pasado. Pero aplica igual a cualquier reporte realizado en base a un query.

Lo único que debemos hacer es dentro del query, en el datasource al que queramos aplicar el filtro, en la sección de "ranges" agregar un campo de la tabla (datasource) y listo!

En este caso, mi query anterior era para consultar todos los clientes, pero quiero que mi usuario elija sólo un cliente especifico, entonces voy agregar el campo al "Range" de mi datasource CustTable como se ve en la imagen.
Salvamos y compilamos. Para saber cómo se ve el filtro, abrimos el output de nuestro reporte (sino lo hemos creado, checar el final del post anterior). Al abrir el reporte, lo primero que aparece es el filtro que acabamos de crear:
Hacemos clic en el boton "Select" para darle un valor a nuestro filtro, aparece la ventana donde debemos poner el criterio, en este caso el "Customer account"
Clic en "ok", y despues en la ventana de filtro ya nos muestra el "criterio" bajo el cual vamos a filtrar nuestro reporte, clic en "ok" y listo! veremos ahora nuestro reporte:
En otro post veremos cómo se hace esto de pasar el parametro por código x++ usando clases.


Aquí te puedes descargar el proyecto de Ax: http://adf.ly/tTIrL

Y aquí la explicación en video ya disponible en YouTube: http://adf.ly/tTLXc


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.


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


Reportes SQL Reporting services (SSRS) en Microsoft Dynamics Ax 2012


En este post vamos a ver lo básico de los reportes:
1. Verificar instalación
2. Editar reportes
3. Crear reportes (AutoDesing)

Antes de crear reportes SQL Reporting Services (SSRS) con Dynamics, lo primero es tener instalados los componentes de BI y Visual Studio Tools. Esto se realiza cuando se instala Ax como se muestra en la siguiente pantalla.
Para verificar que se instalaron correctamente los BI Componentes y el Visual Studio tool, y que el servidor de reporte esta correctamente configurado debemos ir a Herramientas -> Herramientas BI -> Servidores de reportes. Nos debe mostrar la siguiente pantalla:
Aquí debemos verificar que los valores estén llenos y que el nombre del servidor sea el de nuestra maquina.


Una vez hecho esto, cuando abramos el visual studio 2010 y creemos un nuevo proyecto, nos debe aparecer el tipo de proyecto: Microsoft Dynamics AX. No se necesita un tools adicional o librería adicional, simplemente con que hayamos hecho lo de los párrafos de arriba ya Visual Studio se integra con AX.

Editar reportes SSRS 

Lo primero que vamos a ver es cómo editar un reporte existente.
Vamos al AOT de Ax -> Visual Studio Projects -> Dynamics AX Model Projects. En este nodo vamos a encontrar soluciones de visual studio y proyectosque han sido desarrollados usando claro visual studio.

Para editar una solución de las que tenemos en el nodo de Dynamics AX Model, hacemos clic derecho en el que queramos modificar y seleccionamos "Editar". Esto abre el Visual Studio con esa solución y los reportes que contenga.

Después de hacer las modificaciones en el proyecto, guardamos, compilamos y  seleccionamos el proyecto en el explorador de solución, clic derecho sobre el proyecto,  seleccionamos la opción "Implementar" y esto agregará los cambios en Dynamics.

Si no se vieran reflejados, solo hacemos clic en "actualizar" y después en compilar el elemento en el AOT y listo.


Importante: Cuando estamos modificando un reporte en Visual Studio, debemos tener cuidado con la opción "Delete" del menú emergente cuando hacemos clic derecho sobre el reporte. Si hacemos clic en esta opción el reporte sera borrado el AOT de la capa actual donde el usuario este loggeado, si este reporte existe en capas mas bajas lo que pasara es que este reporte sera reestablecido a la capa previa. Ojo con esta opción, esa opción "Delete" NO solo es borrarlo del proyecto de visual studio. Para esto, mejor ocupen "Excluir del proyecto".


Crea reportes SSRS con Query

Para crear un reporte, abrimos Visual Studio 2010 y seleccionamos "nuevo proyecto", en el tipo seleccionamos "Microsoft Dynamics Ax" y en la plantilla seleccionamos "Report Model".
Los reportes necesitan una fuente de datos (datasource), esta puede ser de tres tipos:
- Query
- RDP (report data provider)
- Business logic

Cuando se usa un query como datasource para el reporte SSRS entonces el reporte es llamado "query based report".

Ahora, veamos cómo se hace un reporte basado en Query.

Antes que otra cosa, necesitamos un query creado. Para este ejemplo, vamos a mostrar todos los registros de la tabla CustTable, que es la tabla de clientes de Ax. 

Para crear el query, en el AOT, en la división de "query" hacemos clic derecho y seleccionamos "nuevo query", le ponemos nombre, en este caso "QueryEjemplo".

Arrastramos al DataSources del query la tabla CustTable. Con esto incluimos todos los campos de la CustTable al query. Y en la propiedad "Dynamic" de los campos lo cambiamos a "yes", esto es para que se agreguen al query todos los campos de la tabla CustTable.

Abrimos Visual Studio -> nuevo proyecto -> microsoft dynamics Ax -> Report Model. Con el nombre: PruebaReporteSSR

La solución del proyecto se verá así:
Esto solo nos da el tipo de solución, ahora necesitamos agregar un nuevo reporte, clic derecho sobre la solución y seleccionamos "agregar" y luego "nuevo reporte", le damos nombre y nuestra solución debe verse así:
Nota: Se pueden agregar cuantos reportes necesitemos, ya que cada reporte agregado en VS es un reporte en el AOT, así que pongamos nombres mas específicos que yo uso para el ejemplo.

Hacemos doble clic sobre el reporte creado y veremos los elementos del reporte del lado izquierdo.
Los elementos que se muestran son:
Datasets: Todos los campos disponibles en el query que podemos referenciar en el reporte.
Designs: El diseño mismo del reporte.
Images: Cualquier imagen que queramos mostrar en el reporte.
Data Methods: logica de negocio escrita en C#. Esto no es muy recomendado.
Parameters: Parametros que serán vistos en el reporte o para filtros de usuario para el reporte.

Ahora, necesitamos referenciar el query que creamos dentro del AOT de dynamics. Para esto, hacemos clic derecho en "DataSets" y "Add Dataset". Le podemos cambiar el nombre como queramos.

Y en las propiedades del DataSet creado, esta la propiedad "Query", hacemos clic ahi y nos aparece una ventana con todos los querys.
Hacemos clic en "Next" y seleccionamos lo que queramos mostrar en el reporte "All fields", "All Field Group", "All Display Methods". Podemos seleccionar todos los campos, un grupo de campos especifico y algunos metodos display.
Ahora viene lo bueno... el diseño!!!!!! En el nodo de Designs clic derecho "Add", existen dos opciones, "Auto Design" y "Precision Design", el primero es si solo quieres un reporte rápido, sin diseño personalizado.

Por el contrario, si quieres darle forma tu mism@ elegimos "Precision". Vamos a irnos PRIMERO por Auto Design y después por el tipo de Precision.

Como en todo lo anterior, podemos renombrarlo. Se recomienda que sea llamado "Report" o "Desing", yo le voy a poner ReporteAutoDesing.

Ahora arrastramos el query hacia nuestro diseño de reporte, en mi caso, hacia ReporteAutoDesing.
Con esta acción, indicamos que todos los campos del query se mostraran en nuestro reporte en el mismo orden que como aparecen en la tabla que se agrego a nuestro diseño al arrastrar el query.

Ahora veamos la vista previa, con click derecho sobre el diseño y "preview"
El reporte va a aparecer comos sigue:
Es recomendable por supuesto filtrar los datos para que la generación del reporte no sea muy tardada. Esta forma es muy sencilla pero como se puede ver es muuuuuy fea porque no tiene ningun diseño, en el reporte solo se escupen los datos sin ningun orden especifico.

Eso de ponerlo bonito lo veremos en el siguiente post. Finalmente, cómo enviarlo hacia Ax para poder usarlo? Sencillo:

1. Guarda todo
2. Compila la solución completa
3. Sobre la solución, clic derecho y "Add tuSolucion to AOT"
4. Igual sobre la solucón, clic derecho y "Deploy" o "Implementar"
5. Listo!!!! ya esta en el AOT para que lo uses
Y en Ax veriamos en al AOT:
Cómo ver el reporte en Ax?, una forma es desde el servidor de reportes, o sea http://localhost/Reports, otra forma es crear un Output con el reporte y visualizarlo y la última es llamarlo desde código con x++.

Después veremos cómo usar parametros y un diseño personalizado (PrecisionDesing) y no el automático que propone Ax.


Aquí te puedes descargar el proyecto de Ax: http://adf.ly/tTIrL

Y aquí la explicación en video ya disponible en YouTube: http://adf.ly/tTLXc



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.

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





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



Diferencia entre fechas Dynamics Ax 2012 con X++

Cómo sacar la diferencia entre dos fechas con X++?, sencillo, aquí les dejo un job para saber la diferencia en segundos, minutos, horas y días usando DateTimeUtil.


static void grwJobTest(Args _args)
{
    utcDateTime fecha1;
    utcDateTime fecha2;
    int64 diferencia;
    ;
    fecha1 = 2012-01-01T16:00:00;
    fecha2 = 2012-01-01T15:00:00;
   
    info( datetime2str(fecha1));
    info( datetime2str(fecha2));
   
    diferencia = DateTimeUtil::getDifference(fecha1, fecha2);
   
    info( strFmt("segundos: %1" ,diferencia));
    info( strFmt("minutos: %1" ,diferencia/60));
    info( strFmt("horas: %1" ,diferencia/(60* 60)));
    info( strFmt("dias: %1" ,diferencia/(60* 60*24 )));
}



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.



sábado, 10 de noviembre de 2012

Elementos básicos para desarrollo en Dynamics Ax 2012

En este post, les voy a comentar los elementos básicos que usa Ax para el desarrollo. Lo primero es saber cómo entro al entorno de desarrollo, dentro de Ax en la parte superior derecha esta la opción de "Nuevo ambiente de desarrollo" como lo muestro en la siguiente imagen ó Ctrl + D ó Ctrl + Shift + W ó mediante ax32.exe desde la línea de comandos.
Y se abre el ambiente de desarrollo con el AOT integrado:
El AOT es una vista de árbol de todos los elementos de aplicación con los que cuenta Ax. Cada nodo contiene distintos tipos. Dentro del AOT podemos modificar elementos existentes, crear o desarrollar nuevos. Solo como un tip, este AOT soporta la funcionalidad drag and drop.

Además, en cada elemento del AOT es posible dar click derecho para conocer las distintas opciones que nos ofrece Ax. Algo importante cuando se desarrolla, es la opción "abrir en nueva ventana", por ejemplo en la creación de formularios es necesario arrastrar grupos de campos o campos únicos de alguna tabla, la funcionalidad "abrir en nueva ventana" nos ayuda a visualizar en una ventana solo la tabla con sus campos y en otra ventana un formulario donde quisiéramos arrastrar campos de la tabla.
Todos estos elementos pueden ser exportados como archivos .xpo, este el único tipo que Ax reconoce para importaciones dentro del AOT.

Elementos en el Data Dictionary
El primero nodo del AOT es el Data Dictionary, dentro tenemos varios elementos "base" que se usan para el desarrollo: Tablas, Mapas, Vistas, Datos extendidos, Enumeradores, Códigos de licencia, Llaves de configuración, Llaves de seguridad (que desapareceran en la próxima versión de Ax), Colecciones de tablas y Perspectivas.

Todos estos elementos los iré describiendo poco a poco. De momento empezamos con las tablas.

Todas las tablas guardarán datos de acuerdo con la compañía configurada de transacciones, inventario, libro mayor, diarios, etc.

Existen tablas de sistema y tablas de aplicación. Un ejemplo de las tablas de aplicación serían:
CustTable: Información básica de clientes
VendTable: Información básica de proveedores
InventTable: Catálogo general de inventario
PurchTable: Información de creación de ordenes de compra

Las tablas de sistema se diferencian de las de aplicación por el prefijo "Sys"
Estructura de tablas
Una tabla en Ax se diferencia de una tabla en SQL porque tiene múltiples elementos que la definen. Son siete categorías  Campos, Grupos de campos, Indices, Indices full text, Relaciones, Acciones de borrado y métodos. Todas las tablas de Ax sin excepción cuentan con la capacidad de tener elementos como los mencionados y se ven de la siguiente forma:
Campos
Lo primero son los campos. Esto es fácil, son las columnas que pertenecen a la tabla. Solo debemos tener cuidado en manipular estos campos, ya que cualquier creación, borrado o modificación de algún en el AOT se refleja directamente en la base de datos física. Y claro que cada campo es de cierto tipo ya sea entero, string, fecha, enumerador, etc.

Grupo de campos
El nombre lo dice todo, son grupos que vamos organizando de forma lógica para ser usados después es formularios y reportes con solo arrastrar el grupo y no campo por campo. Ojo: Cualquier modificación a un grupo de campos se verá reflejada en todos los lugares donde es usada. Buena práctica: Todos los campos mostrados en un formulario debe pertenecer a un grupo.

Indices
Básicamente sirven para acelerar las búsquedas. Cuando se crean también existen físicamente en la base de datos.

Indices full text
Sirven para tener indices pero no sobre campos específicos de una tabla, sino para tener cadenas de texto sobre campos. Esto eficienta búsquedas y las hace más rápidas.

Relaciones
Ax usa base de datos relacional, lo que significa que entre las tablas se crean relaciones entre sus datos.

Acciones de borrado
Son acciones que se crean en la tabla "padre" y que definen eventos que se llevaran a cabo al momento de enviar una instrucción de borrado. Existen cuatro tipos:
- None: Solo se borra la fila de la tabla padre sin ningun efecto secundario
- Cascade: La fila en la tabla es borrada y todos sus datos relacionados también son borrados. Esto nos asegura no dejar registros hijos sin padre.
- Restricted: Solo nos permite borrar la línea siempre y cuando no existan registros relacionados en la tabla especificada.
- Cascade + restricted: Se comporta igualito que el Restricted.

Métodos
Son funciones que se crean para datos de la tabla en especifico. Por ejemplo: datos para lookups (combos) de otras tablas basados en la información de nuestra tabla principal o manipulación de datos durante eventos específicos.

Herencia (Inheritance)
Una tabla puede extender de otra especificandolo en la propiedad "Extend". Esto significa que nuestra tabla hereda todos los campos, métodos y propiedades de la tabla que extiende. Pueden agregarse nuevos campos, métodos  etc, obvio lo nuevo no es visto por la tabla de la que se extendio.



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 - Introducción al desarrollo                                                            Siguiente - Modelos -->>