Buscar en este blog

domingo, 25 de noviembre de 2012

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 -->>





sábado, 20 de octubre de 2012

Introducción al ambiente de Desarrollo Dynamics Ax 2012


Poco a poco vamos entrando en materia. En este post, veamos el ambiente de desarrollo de Ax 2012.

Antes que nada, para poder desarrollar, programar, modificar o como sea que le llamen a esa tarea de tirar tecla, debo decirles que es necesario tener la licencia de desarrollo para Ax, de otra forma no se puede.

Ahora, la versión 2012 a diferencia de la 2009, presume de tener dos ambientes de desarrollo. El primero que es el de toda la vida MorphX IDE, que es propio de Ax y la forma rápida de entrar es presionando Ctrl + D. Y el otro ambiente es Visual Studio, así como lo leen.

Empezando, MorphX IDE nos ofrece la posibilidad de ver todos los objetos dentro de un Application Object Tree (AOT), esto va a ser su pan de cada día, el AOT. Dentro podemos ver Tablas, Datos extendidos, enumeradores, clases, formularios, menus y proyectos de visual studio, además de muchos elementos mas.



Nuestro ambiente de desarrollo cuenta con:
- X++ Editor de código, donde podemos programar
- Debugger, para trazabilidad de código
- Herramienta de ingeniería inversa, para visualizar clases en Ax creadas por UML
- Explorador de tablas, donde visualizamos campos, datos , relaciones, indices, etc de tablas.

Finalmente, para desarrollar, tenemos algunas opciones para "poner" nuestro código, estas opciones son las CAPAS o LAYERS de Ax. Este es punto importante, y aunque parece mucha paja es indispensable que conozcamos estas capas.

Cuántas capas son? 16 capas!!! si, son muchas, pero todas tienen su razón de ser, ya voy explicando.

Para qué sirven las capas? de modo rápido te diré que sirven para que no arruines con tu programación funcionalidad estándar de Ax. Esto es, que no puedes modificar las líneas que están en las capas mas bajas, puedes "cambiar" la forma en que se maneja la información en las capas superiores y Ax siempre hará caso a lo que se encuentre programado en la capa mas alta, pero siempre habrá un modo de regresar a lo que venia de fabrica.

Por qué no podemos programar en todas las capas? Por la simple razón de que cada capa esta destinada para algo (o algunos) y aunque tengas licencia para desarrollar solo podrás meterle mano a las últimas capas.

Es decir, existe un equipo de desarrollo de Ax directo de Microsoft, que tienen una primera versión de Ax (esta es la que se vende), esta versión estándar se encuentra en las 6 primeras capas. A estas capas no les puedes meter mano.

CapaDescripción
SYS, SYPCapa de sistema: La aplicación estándar es desarrollada en esta capa. Esto incluye el core y la configuración de la mayoría de los países.
GLS, GLPCapa de globalización: Incluye características desarrolladas para algunos países.
FPK, FPPCapa Feature Pack: Incluye paquetes de características de sectores industriales y son controlados por Microsoft.

Las siguientes 6 capas, solo están disponibles para poder desarrollar sobre ellas para partners e ISVs. Obvio, tampoco modificas estas capas (a menos que seas parte de algún partner)

CapaDescripción
SLN, SLPCapa de solución: Incluye soluciones de Microsoft avaladas por algún sector.
ISV, ISPCapa de proveedores de software independientes: Incluye verticales desarrolladas por ISVs.
VAR, VAPCapa de valor agregado de revendedores: Incluye personalizaciones desarrolladas por VAR's.

Las últimas 4 capas ahora si son las que puedes modificar, en las que puedes desarrollar funcionalidad nueva, etc. Estas últimas 4 capas están destinadas a partners y clientes obvio que tengan licencia de desarrollo.

CapaDescripción
CUS, CUPCapa de clientes: Incluye funcionalidad especifica del cliente.
USR, USPCapa de usuario: Incluye funcionalidad especifica y personalizaciones.

En el siguiente post, ahora si viene algo de acción para empezar a programar.

Lo olvidaba, todas las imágenes pertenecen a Microsoft.


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 - Niveles Ax                                                               Siguiente - Elementos básicos -->>






jueves, 18 de octubre de 2012

Niveles en Dynamics Ax 2012


Como les comente en el post anterior, ahora viene la Arquitectura por capas con la que cuenta Dynamics Ax 2012.

Esta compuesta de TRES NIVELES: base de datos, servidor y cliente. Si, asi de fácil, ahora, qué viene en cada nivel? Pues eso es lo interesante.

NIVEL 1 - Base de datos
Pues claro, como es de imaginarse, tiene los datos pero además tiene los elementos de aplicación. Es una base de datos transaccional de procesamiento en línea (OLTP).

NIVEL 2 - Servidor
Aquí corre la lógica de negocio y tenemos el muy conocido AOS (Application Objetc Server) que no es otra cosa mas que el servicio bajo el que corre dynamics. La forma de "verlo" es como todos los servicios de windows (Herramientas administrativas -> Servicios). El AOS es el servidor de aplicaciones, donde se ejecuta la mayor parte de la lógica de negocio y entre sus tareas esta correr el código X++ que es el lenguaje de Ax, maneja la seguridad de acceso a los datos, administra las sesiones de los clientes.

Un punto importante, es que pueden instalarse varios AOS's para dispersar la carga de clientes entre múltiples servidores, esto es de mucha utilidad al realizar implementaciones muuuuuy grandes.

NIVEL 3 - Cliente
Eso, lo que todos los clientes ven en sus escritorios, la interfaz a traves de la cual interactuan con Dynamics. 

Otros "clientes" de Ax son: Enterprise Portal (bajo licencia) donde es posible visualizar páginas mediante un navegador web y es posible contar con la funcionalidad de reportes, otro cliente del que presume Ax es Office, así es, que en teoria pueden ser usados accesar a Ax aplicaciones y datos. Otro cliente es el .Net Business Connector, este cliente no tiene interfaz pero funciona para interactuar con Ax desde aplicaciones desarrolladas por nosotros mismos.

Listo, así están los niveles de Dynamics Ax 2012, la siguiente sesión todavía es un poco de paja, empiezo a ver el ambiente de desarrollo, pero poco a poco entramos en materia.


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 AX                                                    Siguiente - Introducción al desarrollo con Ax -->>



                                                        <<<<<     Menú inicial del tutorial     >>>>>



miércoles, 17 de octubre de 2012

Introducción Microsoft Dynamics Ax 2012


Bueno, pues el futuro nos alcanzo y llego Dynamics 2012, así que ni modo, a escribir sobre esta versión. Y como el objetivo próximo es hacer la certificación de desarrollo pues aquí va la info que voy aprendiendo y sacando de los libros oficiales de dynamics Ax 2012.

Características funcionales
- Una base de datos es usada para todas las compañías de la organización
- Alta integridad entre todas las áreas funcionales como planeación, ventas, producción.
- Todos los módulos basados en dimensiones
- Características avanzadas disponibles como planeación maestra y forcasting
- Multi-moneda y multi-lenguaje

Características de desarrollo (esto es lo que nos interesa!!!)
- Ambiente de desarrollo integrado AX MorphX (esto en lo visual dista de la realidad, porque es una ventana aparte, no como en la versión anterior).
- Visual Studio es una alternativa de desarrollo para web, reportes y administración de código ("dicen" yo no lo he probado)
- Árbol de objetos de aplicación (AOT) nos da una vista compacta de todo el repositorio (o casi todo)
- Funcionalidad drag and drop es soportado en casi todas las tareas
- Organización de proyectos para personalizar funcionalidades propias

Y bueno, en lo visual, el cambio es ahora como les muestro en la siguiente imagen, esta es la vista Content Pane.


Y la vista List Page


Listo, es todo. La siguiente parte es la Arquitectura por capas. 

Ah olvidaba decirlo... todas las imágenes son propiedad de Microsoft.



                                                                                      Siguiente - Niveles  >>>>





jueves, 9 de febrero de 2012

Exportar datos a Excel con Dynamics Ax 2009

Pues eso, el siguiente ejemplo muestra cómo enviar los datos de una consulta a un archivo de excel desde Dynamics Ax 2009. Esto es necesario en el caso en que tenemos algún usuario quisquilloso que necesita información de su área muy detallada y que en Ax no se encuentra en ningun reporte, a veces es mas fácil hacer la consulta y mandarla a un excel.
En el siguiente ejemplo, se muestra cómo pasar el resultado de una consulta a un excel y que al correr el código se abra en automático la hoja que se genero. La consulta calcula el saldo de cuentas contables referentes a los conjuntos de artículos.


static void SaldosCuentasExcel(Args _args)
{
    LedgerTable ledgerTable;
    ItemGroupId itemGroupId;
    InventPosting inventPosting;
    InventItemGroup inventItemGroup;
    AmountMST balance;


    TransDate fromDate,todate;
    LedgerBalanceSum_CurrentMST ledgerBalanceSum_CurrentMST_SaldoMes;


    CustTable custTable;
    SysExcelApplication application;
    SysExcelWorkBooks    workbooks;
    SysExcelWorkBook     workbook;
    SysExcelWorksheets  worksheets;
    sysExcelWorksheet   worksheet;
    SysExcelCells       cells;
    SysExcelCell        cell;
    int                 row;
    ;
    application = SysExcelApplication::construct();
    workbooks = application.workbooks();
    workbook = workbooks.add();
    worksheets = workbook.worksheets();
    worksheet = worksheets.itemFromNum(1);
    cells = worksheet.cells();
    cells.range('A:A').numberFormat('@');


    fromdate = str2date("01/01/2011",123);
    todate = str2date("08/02/2012",123);
    ledgerBalanceSum_CurrentMST_SaldoMes = new LedgerBalanceSum_CurrentMST(fromdate,todate);


    while select ItemRelation, LedgerAccountId, InventAccountType from inventPosting
    join inventItemGroup
    order by inventItemGroup.Name
    where inventPosting.ItemRelation == inventItemGroup.ItemGroupId
    {
        balance = ledgerBalanceSum_CurrentMST_SaldoMes.balance(inventPosting.LedgerAccountId);
        row++;
        cell = cells.item(row,1);
        cell.value(inventItemGroup.Name);
        cell = cells.item(row,2);
        cell.value(inventPosting.LedgerAccountId);
        cell = cells.item(row,3);
        cell.value(enum2str(inventPosting.InventAccountType));
        cell = cells.item(row,4);
        cell.value(balance);
    }
    application.visible(true);
}


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.




miércoles, 8 de febrero de 2012

Saldo de cuenta contable en Dynamics Ax

Pues aquí un tip chiquito, algunas veces para efectos de verificar cómo se van afectando los saldos de las cuentas contables de acuerdo a las compras, ventas y traslados en Ax es necesario saber los saldos de las cuentas en un solo paso, en vez de estar dando clic a cada cuenta y despues en el botón de "Saldo".
Así que por código, les muestro cómo calcular el saldo de las cuentas que estan asignadas a los grupos de artículos. Espero les sirva.

static void yc_jobs(Args _args)
{
    LedgerTable ledgerTable;
    ItemGroupId itemGroupId;
    InventPosting inventPosting;
    InventItemGroup inventItemGroup;
    AmountMST balance;    
    TransDate fromDate,todate; 
    LedgerBalanceSum_CurrentMST ledgerBalanceSum_CurrentMST_SaldoMes;
    ;
    fromdate = str2date("01/01/2011",123);
    todate = str2date("08/02/2012",123);
    ledgerBalanceSum_CurrentMST_SaldoMes = new LedgerBalanceSum_CurrentMST(fromdate,todate);
            
    while select ItemRelation, LedgerAccountId, InventAccountType from inventPosting
    join inventItemGroup 
    order by inventItemGroup.Name
    where inventPosting.ItemRelation == inventItemGroup.ItemGroupId
    {
        balance = ledgerBalanceSum_CurrentMST_SaldoMes.balance(inventPosting.LedgerAccountId);
        info(strfmt("%1, %2, %3, %4", inventItemGroup.Name, inventPosting.LedgerAccountId,
        inventPosting.InventAccountType, balance));
    }
}

viernes, 20 de enero de 2012

Leer Exel con Dynamics Ax 2009

Saliendo un poco de la línea del blog, les dejo cómo leer un archivo excel desde un Job de Dynamics Ax 2009, no lo explico a detalle porque la codificación es muy simple, es un ejemplo probado, así que basta con que lo copien, modfiquen la ruta de su archivo de excel y listo!!
Espero les sea útil...



static void LeeExcel(Args _args)
{
    SysExcelApplication application;
    SysExcelWorkbooks workbooks;
    SysExcelWorkbook workbook;
    SysExcelWorksheets worksheets;
    SysExcelWorksheet worksheet;
    SysExcelCells cells;
    COMVariantType type;
    int filaInicial;
    int row;
    ItemId itemid;
    UnitID unitID;
    PriceUnit priceUnit;
    FileName nombreArchivo;
    ;
    application = SysExcelApplication::construct();
    workbooks = application.workbooks();
    nombreArchivo = "C:\\PlantillaPrecios.xls";
    try
    {
        workbooks.open(nombreArchivo);
        filaInicial = 1;
        workbook = workbooks.item(1);
        worksheets = workbook.worksheets();
        worksheet = worksheets.itemFromNum(1);
        cells = worksheet.cells();
        row = filaInicial;
        do
        {
            row++;
            itemId = cells.item(row, 1).value().bStr();
            unitID = cells.item(row, 2).value().bStr();
            priceUnit = cells.item(row, 3).value().double();
            info(strfmt('%1 - %2 - $%3', itemId, unitID, priceUnit));
            type = cells.item(row+1, 1).value().variantType();
        }
        while (type != COMVariantType::VT_EMPTY);
        application.quit();
    }
    catch (Exception::Error)
    {
        throw error("El archivo no abrio correctamente, intente de nuevo.");
    }
}

viernes, 19 de agosto de 2011

Comercio y Logística en Dynamics Ax 2009 - 2. Grupos de artículos


Como ya les había comentado en el post anterior, el inventario es lo básico para comenzar con la logística en Dynamics Ax 2009. Todo lo configurado para los artículos repercute directamente en la compras, ventas, gestión de almacenes, gestión de calidad, los diarios de inventario, la producción y los proyectos.

Entonces, aguas con este tema y tómenlo muuuy en serio que es la columna vertebral, sobro todo porque la forma en que repercute una mala configuración de este módulo es en perdida de visibilidad de los dineros del patrón, y yo creo que si el patrón no sabe dónde está su dinero... pues quizá los de sistemas tengamos que buscar un lugar alejado del mundo y claro otra chamba.

Ahora, todos los artículos deben tener como mínimo: código de artículo, grupo de artículos, tipo de artículo, grupo de modelo de inventario y grupo de dimensiones. Estos puntos son los obligatorios para exista un artículo pero hay varios mas para una correcta configuración.

Vamos empezando por Grupo de artículos. Esto se usa para registrar cada grupo a las diferentes cuentas de contabilidad (como les decía... dineros), también se usa para saber datos de ventas y de compras (mas dineros) y para crear informes financieros.

Cómo configurar estos grupos? Pues bien, te vas al módulo de Gestión del inventario -> Configurar -> Grupo de artículos
Y ahí tenemos que ir metiendo todos nuestros grupos de artículos de la forma:

  • en el campo "Conjunto de artículos" ponemos un identificador del grupo
  • en el campo "Nombre" ponemos el nombre descriptivo del grupo, por ejemplo, nombre utilizado en los informes

En este ejemplo, puse como identificador "B" y nombre "Cuadernos", al dar "enter" me pasa de inmediato a la pestaña de "Orden de venta". En esta pestaña y en el resto se deben poner las cuentas contable de cada uno de los conceptos que dicen ahí. Que es esto? pues simplemente le indicamos al Dynamics a que cuenta contable le tiene que sumar o restar dependiendo de la transacción que se realice.

Esto de las cuentas contables se debe revisar con la parte financiera para que nos indique en qué cuenta contable quiere que se reflejen esos movimientos.

El resto de las pestañas (orden de compra, inventario, producción) se refieren a lo mismo, a definir las cuentas contables referentes a cada movimiento que se vaya presentado en el grupo de artículos que estamos dando de alta. Si necesitan una descripción más detallada de los movimientos de cada pestaña escríbanme, yo les paso un doc donde viene una descripción corta de lo que ven en esas pestañas.
Aunque seamos realistas, pocas veces tenemos la oportunidad de empezar a configurar un sistema desde cero, generalmente cuando las empresas adquieren un ERP o WMS (warehouse managment system = administrador de almacenes) es cuando la empresa ya esta consolidada y ya le alcanza para hacer una inversión de ese tamaño. En estos casos si la empresa ya tiene definidos sus grupos de artículos, lo que tendríamos que hacer es una importación de datos hacía el Dynamics Ax. Y esto... lo veremos en el próximo post.

Ojo con las cuentas contables porque esto es la base de la configuración de sus artículos.

Comercio y Logística en Dynamics Ax 2009 - 1. Introducción



Para empezar, logística se define como el proceso de planificación, implementación y control de flujo rentable y eficaz, y el almacenamiento de artículos. Es decir, todo lo que se "mueve" y almacena en la empresa, enfocado a productos que se fabrican o comercializan. La logística es muy amplia y va desde el manejo de materias primas en empresas manufactureras, la producción, envío a almacenamiento, acomodo en almacén, definición de la manera más eficiente de "pasar" los productos de un lugar a otro hasta la salida del almacén, el traspaso a algún otro almacén y el cómo se distribuye o transporta a los diferentes lugares donde sea necesario. Todo lo anterior, con el único objetivo de contar con la trazabilidad de los movimientos de productos en la empresa y obviamente los dineros, cuánto le cuesta a la empresa producir, comprar, almacenar y distribuir sus productos eficazmente.

En Dynamics, todo el proceso inicia con la configuración de los artículos  para tener definido nuestro inventario, primero que nada debemos tener una visión suficientemente clara de saber qué vende la empresa y como se va a querer visualizar el dinero que se maneja con lo que se vende.

(Les tengo que aclarar por si no leíste bien el título que este es el inicio de la logística, por esto, doy por sentado que la parte financiera está completamente configurada.)

Entonces, como iba diciendo, la configuración de los artículos es la parte clave para los inventarios ya que vamos a tener una parte física y una financiera. Quiero pensar que los nombres son lo bastante explícitos, pero por si no: el inventario físico se refiere básicamente a cuánto tenemos de cada cosa y en dónde está, y la parte financiera se refiere a cuánto cuesta todo eso que tenemos.

En esta parte de la logística debemos tener en cuenta que en Dynamics no es solo un módulo al que se le tienen que meter datos y va a empezar a funcionar por arte de magia, tooooodo lo contrario, es más de un módulo ya que el inventario está relacionado con 8 importantes áreas: clientes, proveedores, planificación maestra, producción, configurador de productos, recursos humanos, proyectos y contabilidad general.

La imagen siguiente ilustra todo lo que acabo de "tratar" de explicar.
(Imagen obtenida de: http://tobalinaconsulting.blogspot.com/2008/10/reduccin-de-costes-en-logstica-coste.html)



Interfaz de Dynamics Ax 2009


Vamos entrando en materia. Si se leyeron el post anterior ya deberían saber a grandes rasgos qué es y qué hace Dynamics. Sino pues les comento rápidamente que Dynamics Ax 2009 es un ERP de Microsoft, para los que no saben: ERP = Enterprise Resource Planning, formalmente "es un conjunto de sistemas de información gerencial que permite la integración de ciertas operaciones de una empresa" y en palabras simples, es un software que 'intenta' manejar todas las áreas de una empresa, desde recursos humanos, contabilidad, inventarios, ventas hasta producción de artículos, planeación, compras, mercadotecnia y todo lo que se les ocurra sobre procesos internos de una empresa.
Así que primero lo primero, les presento a Dynamics Ax.


Para ver esta pantalla su máquina debe tener instalado el cliente de Dynamics Ax. Algunas veces al acceso a Dynamics en algunas empresas lo hacen a través de un escritorio remoto o una máquina virtual, pero aquí se explica el inicio de Dynamics desde el cliente instalado en su máquina. Ya que lo tengan instalado se tiene que dar click en Inicio -> Microsoft Dynamics AX 2009 -> Microsoft Dynamics AX 2009, como se ve a continuación.


Distribución de la pantalla de Dynamics
Tenemos una barra de título que nos muestra la información de: nombre de la aplicación, instancia del espacio de trabajo, nombre de la licencia, nombre del servidor y los clásicos botones de windows para minimizar, maximizar o restaurar y cerrar.


Debajo de la barra de título tenemos la barra de ruta de navegación (en inglés mejor conocida como BCB). Consta de dos partes, los botones de desplazamiento del lado izquierdo, donde podemos ir hacia atrás (para ver una de las 40 páginas visitas durante la sesión actual) y hacia adelante igual que en un explorador de internet.


La otra parte de la BCB es una barra de direcciones que nos dice dónde estamos parados en el sistema, y tres íconos del lado derecho:
  • Ventanas. Para pasar de un formulario a otro de los que hemos dejado abiertos y que no los tenemos visualmente localizados.
  • Ver. Para mostrar o ocultar los distintos módulos que estamos viendo en pantalla, p. ej. ocultar los favoritos o el panel de exploración.
  • Ayuda. Pues eso, la ayuda a nivel conceptual o ayuda para programadores.

Después, debajo de la barra de ruta de navegación, tenemos la barra de herramientas. Nos facilita tareas como el filtrado, la búsqueda de datos, acceso a las alertas y además acceso a una característica de Ax importantísima que se llama 'árbol de objetos de aplicación (AOT)' y a otra que son los proyectos de desarrollo, son los últimos dos botones de esta barra.


Y debajo de la barra de herramientas, está el menú de Dynamics. Contiene submenus que dejan ver funcionalidades que se usan en todo el sistema y es cosa de que se vayan familiarizando con estas opciones.


Después tenemos el panel de exploración, que esta divido en "Mis favoritos", "Lugares", "Formularios" y "Botones de módulo", este panel es totalmente configurable, podemos poner lo que queramos y quitar lo que no nos sea útil.

En la sección de "Mis favoritos" se puede personalizar los vínculos a los que queremos un acceso directo rápido para tener un acceso como en el explorador de windows. En "Lugares" están elementos del menú que hayamos seleccionado, por ejemplo "Gestión de Inventarios" o cualquier otro, en "Formularios" hay una vista en árbol de la estructura del menú que hayamos seleccionado. Y la última parte que son los "Botones de módulo" nos permite tener un acceso rápido a los distintos módulos que maneja Dynamics.

Después viene el famoso panel de contenido, que tiene 3 tipos: áreas de trabajo, páginas de lista y páginas de área. El primer tipo no lo ilustro aquí, pero básicamente es la página de inicio predeterminada de Dynamics. Los otros dos tipos, aquí están:

Pagina De Lista

Pagina De área

Y finalmente!!!! la barra de estado, es la que esta hasta abajo de la interfaz de Dynamics y nos muestra varias cosas como la divisa, la empresa, la fecha y hora, algunos botones, campos y menús que actualmente se están visualizando en el panel de contenido.


Así es, aquí brevemente explicada la interfaz de Dynamics. Hay mas info, sobre como configurar los favoritos, mostrar u ocultar botones del panel de exploración, el uso de las áreas de trabajo y cosas así un tanto visuales, pero les sugiero que se pongan a jugar con la interfaz para que la vayan conociendo, sino nunca se van a familiarizar con ella.

De cualquier forma, si necesitan más info sobre lo que les comento, ustedes solo pidan, ya dependerá de mi si se los mando o no jajaja, pero con pedir no se pierde nada.