Buscar en este blog

lunes, 29 de diciembre de 2014

Teclas rápidas en Microsoft Dynamics Ax 2012


Esta vez les quiero compartir las teclas rápidas mas comunes que se manejan con Ax 2012, esta imagen no esta completa, solo es demostrativa, pero pueden descargar el pdf tanto de ax 3.0, 4.0, 2009 y 2012 desde el link:

http://greenlightbts.com/resources/dynamics-ax-keyboard-shortcuts.asp



Y por cierto, acuerdate de darle click a algún anuncio si el post te sirvio 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. 


miércoles, 24 de diciembre de 2014

Repetir encabezado de tabla en todas las hojas - Reportes SSRS AX 2012


Muchas veces nos encontramos con el detalle que en los reportes de Ax necesitamos repetir el encabezado de las tablas en todas las hojas donde se impriman los resultados.

Por ejemplo, una factura de una orden de venta que tiene muchos artículo y que abarca mas de una hoja, en este caso Ax lo que hace es seguir imprimiendo el detalle de los artículos pero ya no imprime el encabezado de la tabla y aunque exista la opción en las propiedades del tablix de RepetColumnHeaders generalmente esto no funciona.


La solución es ir a la opción de "Grupos de columnas" y seleccionar "Modo avanzado"


Con esto nos aparece la sección "Estático" en los grupos de filas y es a ese elemento al que le decimos en sus propiedades que queremos que se repita en todas las hojas. Las propiedades que debemos cambiar son:

RepeatOnNewPage = True
KeepWithGroup = After



Listo, cambiado esto, salvamos e implementamos el reporte y ya podremos ver los cambios.


Y por cierto, acuerdate de darle click a algún anuncio si el post te sirvio 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. 




<<    Anterior - Visualizar reportes por código....



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



viernes, 19 de diciembre de 2014

Cumulative Update 8 para Microsoft Dynamics AX 2012 R3

Aquí les comparto un post de otro blog donde reúnen las nuevas características de Dynamics AX R3 CU8.



Cumulative Update 8 (CU8) para Dynamics AX 2012 R3 está disponible para descargar en CustomerSource y PartnerSource. CU8 incluye algunas nuevas características ademas de varias actualizaciones y hotfix.

Novedades y hotfix en CU8
  • Nuevas funciones: CU8 incluye varias actualizaciones y mejoras en varios modulos de AX2012R3. La lista completa de características las podéis encontrar aquí, What's new in Microsoft Dynamics AX 2012 R3 cumulative update 8. Como desarrollador destacaría que ya podemos utilizar Visual Studio 2013, gracias a "Microsoft Dynamics AX developer tools for Visual Studio 2013".
  • Application hotfixex: CU8 incluye mas de mil revisiones. Para ver la lista completa de hotfix, ver CU8 download page.
  • Binary hotfixes: CU8 incluye mas de cien Binary hotfixes. Para ver la lista completa, CU8 download page.
  • Actualizaciones especificas para países: CU8 incluye varias actualizaciones especificas para paises y regiones. Para ver la lista completa, ver CU8 download page. Destacar aquí varias mejoras referentes a la normativa SEPA (reports, batch process...)
Como instalar CU8
  1. Revisar los requisitos del sistema aquí System Requirements para comprobar que soportamos la CU8.
  2. Descargar el CU8 desde la sección Hotfix Download Available en CU8 download page.
  3. Instalar la actualización siguiendo la siguiente guía: Installation Guide for Microsoft Dynamics AX 2012 R3 Cumulative Update
Para ayudar mejor a entender la instalacion CU8 podemos ver estos vídeos:

Otros recursos de ayuda
La documentación de producto para AX 2012 (incluyendo todas las versiones y CU) está disponible en el TechNet.
Para mas información sobre todas las versiones de AX2012::

Problemas conocidos
Los problemas conocidos o "Known issues" en CU8 podemos buscarlos usando la herramienta Issue search en Lifecycle Services. Nos logueamos en Lifecycle Services usando nuestra cuenta CustomerSource o PartnerSource, y después en el campo de búsqueda Issue search, introducimos CU8 Known issues.


Aquí el link del post original.



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. 




miércoles, 17 de diciembre de 2014

Crear secuencia personalizada en Microsoft Dynamics Ax 2012 R2

Hola a todos, el siguiente post es para explicar cómo se crea una secuencia personalizada en Dynamics AX 2012 y que ésta se asigne a un campo de una de nuestras tablas.

Pasos
1. Crear EDT. Lo primero es decirle a Ax cuál tipo de dato va a estar definido por una secuencia. Por ejemplo, existe en Ax los PurchId que son los identificadores de ordenes de compra y que estos pueden ocuparse en una secuencia, un tipo así necesitamos pero creado por nosotros.
En este caso, voy a crear un campo que se va a llamar PlanProduccionId.


2. Después necesitamos identificar el módulo al que va a pertenecer nuestra secuencia, en este caso, el módulo donde quiero esta secuencia es en Planeación Maestra, así que en la clase de NumberSequenceModuleMasterPlanning, en el método loadmodule() hasta abajo, insertamos las líneas que van a identificar nuestra secuencia:

     datatype.parmDatatypeId(extendedTypeNum(GRWPlanProduccionId));
     datatype.parmReferenceLabel(literalStr("Clave única del Id de Plan"));
     datatype.parmReferenceHelp(literalStr("Número para los planes de producción."));
     datatype.parmWizardIsManual(NoYes::No);
     datatype.parmWizardIsChangeDownAllowed(NoYes::No);
     datatype.parmWizardIsChangeUpAllowed(NoYes::No);
     datatype.parmWizardHighest(999999);
     datatype.parmSortField(20);
     datatype.addParameterType(NumberSeqParameterType::DataArea, truefalse);
     this.create(datatype);

3. Escribimos un nuevo método en la tabla de los parámetros de la planeación maestra que es ReqParameters, de dónde sacamos el nombre de esta tabla? pues vamos al módulo de planeación maestra > Configuración > Parámetros de la planeación, en cualquier módulo va a existir una opción similar.

client server static NumberSequenceReference numRefPlanProduccionId()
{
     return NumberSeqReference::findReference(extendedTypeNum(GRWPlanProduccionId));
}

4. Escribimos el siguiente job y lo corremos, esto va a mandar a llamar nuestro loadmodule que modificamos en el paso 2

static void Carid(Args _args)
{
    NumberSeqMasterPlanning numberSeqModuleMasterPlanning = new NumberSeqMasterPlanning();
    ;
    numberSeqModuleMasterPlanning.load();
}

Con esto ya podemos ver en los parámetros de la planeación maestra nuestra secuencia incluida con el parmReferenceHelp que le asignamos en el paso 2.


5. Después vamos a correr el wizard desde la ruta: Administración de la organización > Comun > NumberSequence >
  

Se corre el asistente, ahi no hay ciencia, es siguiente - siguiente - siguiente.

6. Ahora tenemos que verificar que esta correctamente creada y funciona bien, para eso usamos el siguiente job, para que nos genere una secuencia y podamos
static void number(Args _args)
{
    NumberSeq  numberSeq;
    CarId num;
    ;
    numberSeq = NumberSeq::newGetNum(ProjParameters::numRefcarId());
    num = numberSeq.num();
    info(num);
}










Listo!!!!

Con esto ya tenemos generada nuestra secuencia, ahora, como generalmente estas secuencias no se usan solo desde código sino generalmente desde una pantalla de usuario, vamos a integrarlo a un form nuevo.... pero eso será en el siguiente post.



Y por cierto, acuerdate de darle click a algún anuncio si el post te sirvio 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. 





lunes, 15 de diciembre de 2014

Lookup para dimensiones financieras personalizadas - Microsoft Dynamics Ax 2012 R2

Aquí se expone el código para cuando necesitemos exponer en un combo (lookup) los valores de las dimensiones financieras separadas por nombre. Esto aplica para cualquier escenario en cualquier formulario que maneje dimensiones financieras personalizadas distintas a las de organización.


Lo primero es identificar el campo que queremos que sea lookup y sobreescribir el método lookup con las siguientes líneas:



public void lookup()
{
    super();

    TablaEjemploDimensiones::lookupCentroCosto(this);
}

Donde lookupCentroCosto es el método que vamos a crear en la tabla donde se va a guardar el valor que el usuario seleccione.

public client static void lookupCentroCosto(FormStringControl _ctrl)
{
    DimensionAttribute                  dimensionAttribute;
    DimensionAttributeDirCategory       dimAttributeDirCategory;
    SysTableLookup                      sysTableLookup;
    Query                               query = new Query();

    // Nombre de la dimensión de la que se van a mostrar los valores
    dimensionAttribute = DimensionAttribute::findByName( "CentroDeCosto");

    if (dimensionAttribute.Type == DimensionAttributeType::CustomList)
    {
        select firstonly DirCategory from dimAttributeDirCategory where dimAttributeDirCategory.DimensionAttribute == dimensionAttribute.RecId;

        sysTableLookup = SysTableLookup::newParameters( tableNum(DimensionFinancialTag), _ctrl);

        // En el lookup se va a presentar el valor y la descripción
        sysTableLookup.addLookupfield( fieldNum(DimensionFinancialTag, Value));
        sysTableLookup.addLookupfield( fieldNum(DimensionFinancialTag, Description));

        query = new Query();
        query.addDataSource( tableNum(DimensionFinancialTag)).

        addRange( fieldNum(DimensionFinancialTag, FinancialTagCategory)).
        value(queryValue(dimAttributeDirCategory.DirCategory));

        sysTableLookup.parmQuery(query);
       
        sysTableLookup.performFormLookup();
    }
}


Post relacionados:
Lookup para dimensiones financieras de organización
Consultas en tablas con ValidTimeState
Crear lookup en clase dialog



Y por cierto, acuerdate de darle click a algún anuncio si el post te sirvio 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. 




viernes, 31 de octubre de 2014

Consultas en tablas con ValidTimeState en Ax 2012

Aquí un tip para cuando es necesario consultar registros en tablas que tienen los campos ValidTo y ValidFrom.


Existe la propiedad ValidTimeStateFieldType para las tablas, cuando nosotros ponemos esta propiedad = UTCDateTime como por ejemplo en la tabla de empleados HCMEmployment (la tabla de empleados) Ax en automático agrega los campos ValidFrom y ValidTo, que son las fechas donde los empleados son válidos, quiere decir que esa tabla va a tener trazabilidad en fechas y que al hacer una consulta  de un select normalito solo te va a mostrar campos validos a la fecha que estés realizando la consulta, por ejemplo, si estas haciendo la consulta hoy 31 de Octubre del 2014 y existe un empleado que "caduco" el 30 de Octubre del 2014, tu consulta no te va a mostrar ese empleado, esto es práctico en algunas consultas, pero algunas veces necesitamos la consulta de toooodos los registros, entonces debemos poner en nuestra consulta el parámetro de validTimeState.

Aquí el ejemplo:



Post relacionados:
Lookup para dimensiones financieras personalizadas



Y por cierto, acuerdate de darle click a algún anuncio si el post te sirvio 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. 


jueves, 30 de octubre de 2014

Compilación paralela en Dynamics Ax 2012 R2 CU7

Desde que salio el CU7 para AX 2012 R2, se incluyo la funcionalidad del AxBuild que nos ayuda a que la compilación pueda hacerse en menos tiempo. En versiones anteriores, la compilación se realizaba en... 3 o 4 horas aprox, dependiendo del servidor. Pero con la llegada de AxBuild este tiempo se reduce considerablemente, ahora tarda entre 25 y 50 minutos!!! Muy bueno no?

Pues bien, los requisitos para ejecutar esta compilación son:
- Tener acceso al servidor donde esta instalado el server de Ax
- Poder ejecutar la consola de comandos (cmd) con permisos de administrador
- Tener acceso al configuration utility, no importa si es solo en modo lectura

Comenzamos:
1. Lo primero es abrir nuestro configuration utility e identificar cuál AOS es que el queremos compilar, como se muestra a continuación:

Así que este número de AOS nos lo apuntamos en algún notepad porque lo vamos a necesitar para los parámetros de compilación.

2. Buscamos la carpeta bin del SERVIDORde ax, que generalmente esta en esta ruta: 
C:\Program Files\Microsoft Dynamics Ax\60\Server\MicrosoftDynamicsAx\bin

De nuevo, nos la guardamos en el mismo notepad del paso anterior.

3. Buscamos la carpeta bin del CLIENTE de ax, que generalmente esta en esta ruta: 
C:\Program Files(x86)\Microsoft Dynamics Ax\6.0\Client\Bin

De nuevo, nos la guardamos en el mismo notepad del paso anterior.

4. Abrimos un símbolo del sistema o consola de comandos o cmd, como sea que le conozcan pero con permisos de administrador.

5. Nos posicionamos en la ruta del Bin del servidor del punto 2 y ejecutamos el AxBuild como sigue:
axbuild.exe xppcompileall /S=01 /nocleanup /altbin="C:\Program Files(x86)\Microsoft Dynamics Ax\6.0\Client\Bin"

donde: 
S=01 es el AOS que vamos a compilar, el del punto 1
nocleanup es para no borrar los archivos con el detalle de la compilación
altbin es la ruta del bin del cliente, la del paso 3

Y aquí es donde comienza la magia, el servidor ocupa tantos trabajadores pueda, en este caso en mi servidor solo ocupo tres porque es chiquito y después de varios minutos (44:58.566192 exactamente)... la compilación termino!!! Aunque he hecho mas compilaciones en servidores mas potentes donde ha tardado hasta 20 minutos.


Listo, AOS compilado.

Y bueno, aquí el video: http://adf.ly/ta9M9

Nota importante: Cuando tenemos varios AOS, la compilación se debe realizar por cada uno de los AOS. Y aquí va un tip, para hacerlo mas rápido, lo mas recomendable es bajar los servicios de los AOS dependientes, borrar el contenido de la carpeta xppil de los AOS dependientes, compilar SOLO un AOS y cuando levantamos el resto de AOS estos van a volver a generar el contenido del xppil pero ya compilado, asi nos ahorramos tiempo de compilar cada AOS.

Si quieres la documentación oficial de microsoft, aquí la referencia:


Y por cierto, acuerdate de darle click a algún anuncio si el post te sirvio de algo (porque ya me di cuenta que nadie me va a donar ni un dolar para mi cafe y mi dona).


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 desarrolladores de Ax en nuestro idioma. 



<<< Anterior - Exportar ModelStore






martes, 28 de octubre de 2014

Exportar e importar ModelStore de Dynamics Ax 2012

En el post anterior vimos cómo exportar un modelo que se haya creado con un fin especifico por ejemplo para un desarrollo o todos los desarrollos de una empresa en particular. Ahora lo que voy a mostrar es cómo exportar e importar todo el modelo (modelstore) completo de ax de un AOS a otro mediante PowerShell, aclarando que existe otra opción de hacerlo mediante AxUtil.

Requisitos:
1. IP del AOS origen
2. IP del AOS destino
3. Usuario con privilegios y acceso a la consola porque vamos a compilar por comando
4. Acceso al SQL destino (por si acaso)

Lo primero es exportar el modelo del primer AOS, que en este caso es un servidor de consultoría y necesito que se mande todo el modelo hacia el ambiente que se esta haciendo de producción. Para eso te debes ubicar en el servidor donde esta instalado el AOS de donde se va a exportar el modelo y debemos asegurarnos que la configuración del Configuration Utility de Ax este apuntando al AOS origen como se muestra en la siguiente imagen.

En este momento no es necesario bajar el servicio de Ax.

Desde ese servidor ir a Inicio > Todos los programas > Herramientas administrativas > Microsoft Dynamics AX Management Shell

Y poner: Export-AXModelStore -File dax_cu7_consul -Details
En este caso dax_cu7_consul es el nombre que va a tener mi archivo de modelo y donde Ax va a guardar todo el modelo. El parámetro "-Details" es para que visualicemos en pantalla los datos de la exportación cuando este en proceso. Este proceso es un poco tardado, alrededor de 10 minutos y el resultado es como el que sigue:

Ya que se exportó el modelo, copiamos nuestro archivo que se haya generado a nuestro ambiente destino (en mi caso es producción) y comencemos con la importación!!!!

El archivo se debe copiar en C:\Windows\System32 ya que es desde esa ruta que se lee con el comando. Ya que lo tenemos en esa ruta, abrimos de nuevo el Magement Shell de Dynamics (Inicio > Todos los programas > Herramientas administrativas > Microsoft Dynamics AX Management Shell) y tecleamos el comando para realizar la importación: 

import-axmodelstore -file -dax_cu7_consul -idonflict:overwrite

He visto que al menos dos de cada tres veces, la importación presenta al menos un problema con una tabla llamada ModelOperationHistory como lo muestra la siguiente imagen:


En este caso, lo que se debe hacer es truncar esta tabla directo desde SQL con la instrucción:
TRUNCATE TABLE dbo.ModelOperationHistory

Después de esto se vuelve a hacer la importación y ahora si se importa sin problemas! (Claro que tarda otros 10 minutos). Y aqui el resultado de que ahora si se completo la importación!!!!


Una vez que termino, aun nos falta camino... debemos reiniciar el servicio de Ax, compilar todo!!! y sincronizar objetos!!, osea como una hora y media mas... pero como entiendo que el reinicio de servicios y la sincronización no tiene mayor problema, entonces vamonos a ver la compilación en paralelo! claro... en el siguiente post   :D



Por cierto, la novedad ahora, es que hay video de esto, por si no quieres leer claro, y si ya lo leiste y me vas a reclamar que porque no lo dije al principio... pues... igual ya lo leiste no? jajaja
Pero bueno, estoy viendo si esto de los videos funciona, y por cierto, acuerdate de darle click a algún anuncio si el post te sirvio de algo (porque ya me di cuenta que nadie me va a donar ni un dolar para mi cafe y mi dona).


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 desarrolladores de Ax en nuestro idioma. 



<<<<<     Anterior - Modelos en Ax                                      Compilación parela en Ax - Siguiente     >>>>







jueves, 23 de octubre de 2014

Calcular los impuestos de una línea de venta o de compra por código X++ en AX 2012

Aquí una manera rápida de calcular los impuestos totales de una línea de compra o de venta, siempre es de mucha utilidad.

Para una línea de orden de venta:

static void Job2(Args _args)
{
    real impuestosDeVenta;
    SalesLine   salesLine;
    ;
    select firstOnly salesLine;
 
    impuestosDeVenta = Tax::calcTaxAmount(Salesline.TaxGroup,
                                          Salesline.TaxItemGroup,
                                          Systemdateget(),
                                          Salesline.CurrencyCode,
                                          Salesline.LineAmount,
                                          TaxModuleType::Sales);

    info( strfmt("Impuestos: %1" , impuestosDeVenta));

}


Para una línea de factura de orden de compra:

static void Job2(Args _args)
{
    real impuestosDeVentaCompra;
    VendInvoiceTrans   vendInvoiceTrans;
    ;
    select firstOnly vendInvoiceTrans;
 
    impuestosDeVentaCompra = Tax::calcTaxAmount(vendInvoiceTrans.TaxGroup,
                                          vendInvoiceTrans.TaxItemGroup,
                                          Systemdateget(),
                                          vendInvoiceTrans.CurrencyCode,
                                          vendInvoiceTrans.LineAmount,
                                          TaxModuleType::Purch);

    info( strfmt("Impuestos: %1" , impuestosDeVentaCompra));

}

En Ax, para confirmar nuestro cálculo, podríamos consultarlo en un diario, por ejemplo este impuesto sale de una ventana como la siguiente:



Post relacionados:
Calcular impuestos en ordenes de venta facturadas y no facturadas
Reportes SQL Reporting services (SSRS) en Microsoft Dynamics Ax 2012
Particiones en Ax (un poco de teoría)


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.