Conectar a servicios externos mediante HTTPS desde Microsoft Dynamics AX 2012

Hace ya bastante tiempo publiqué el código necesario para consumir servicios web externos desde Microsoft Dynamics AX 2012 utilizando únicamente X++. Este código se puede encontrar fácilmente en muchos sitios ya que es básicamente el mismo para casi cualquier servicio WCF, pero a veces necesitamos ajustar algunas propiedades de la conexión, por ejemplo, para conectar a extremos HTTPS.

Según la documentación de MSDN (aquí), en C# el cambio sería muy sencillo, simplemente modificando un par de propiedades del binding durante la conexión:

Leer más
Thumbnail image

Control del código fuente con TFS en Microsoft Dynamics AX 2012 (ALM-VI)

En anteriores capítulos de esta serie ya hablamos de cómo instalar y/o configurar nuestra instancia de Microsoft Team Foundation Server, y también sobre cómo usarlo para gestionar nuestras tareas y requerimientos. Este artículo es la última parte acerca de la funcionalidad básica de la integración entre Microsoft Dynamics AX 2012 y TFS, para poder empezar en los siguientes post con temas más avanzados.

En este artículo veremos como trabajar con TFS para la gestión de versiones del código fuente (VCS), que es el primer paso para poder utilizar las funcionalidades más avanzadas del sistema en cuanto a sus capacidades de ALM. Básicamente, el control de versiones pretende que cualquier cambio realizado sobre los objetos del sistema quede registrado, así como la fecha, el autor de dichos cambios, qué otros objetos se modificaron a la vez y por qué (mediante los comentarios en durante el check-in). Esto nos permite revertir los cambios, volver a una versión anterior, comparar el estado actual de un objeto con una versión anterior, revisar los cambios realizados un determinado día por un desarrollador (para realizar revisiones de código), asociar los cambios a una determinada tarea para ver todos los cambios que ha requerido finalizarla, y un largo etcétera. Las tres operaciones más evidentes que requiere cualquier control de versiones son: añadir nuevos objetos, check-in y check-out (traducidas en AX como Proteger y Desproteger respectivamente) y Sincronizar.

Leer más

Microsoft Dynamics AX 2012 R3 CU9 Demo VM V1

Microsoft Dynamics AX 2012 R3

Ya se ha publicado la máquina virtual demo actualizada con el último paquete Microsoft Dynamics AX 2012 R3 CU9. Esta máquina virtual viene, como de costumbre, actualizada con las últimas versiones de todo el software y con datos de prueba de las nuevas funcionalidades:

Links interesantes:

Recordar que estas máquinas virtuales se pueden desplegar directamente en Azure desde Lifecycle Services (LCS).

HOWTO: Depurar desde Visual Studio código X++ que se ejecuta en el servidor AX 2012

Gran parte del código X++ que desarrollamos en clases se ejecuta en la capa del servidor (Data Providers en informes, procesos Batch, SysOperation, …), lo que resulta un poco incómodo a la hora de depurar. Si ponemos un breakpoint desde el editor de X++ en MorphX en código que se ejecuta en el servidor, veremos como el depurador integrado nunca se detiene en este punto.

Preparar el entorno de desarrollo para poder depurar código del servidor desde Visual Studio (incluso el código X++, que en el servidor siempre se ejecuta como código CIL) nos obliga a tener en cuenta unos cuantos pre-requisitos, así que los voy a enumerar aquí para tenerlos a mano cuando nos hagan falta:

Leer más

Cumulative Update 9 para Microsoft Dynamics AX 2012 R3

Microsoft Dynamics

Ya está disponible la siguiente actualización acumulativa para Microsoft Dynamics AX 2012 R3, la CU9 (6.3.2000.326). Esta actualización está disponible para instalación mediante el módulo Updates de Lifecycle Services, como viene siendo habitual desde la revisión R3. Información sobre las mejoras sobre el proceso de instalación se puede encontrar en la guía de instalación enlazada más abajo.

También se enlaza la página de TechNet que detalla los cambios de esta revisión. A nivel técnico no hay cambios significativos ya que los CU sólo incluyen pequeños cambios funcionales y necesidades específicas para la regulación de cada país. El caso de España, en este parche se incluyen cambios para la emisión de facturas electrónicas a la administración (formato FacturaE, más información aquí), y algunos cambios en el modelo 347 (más información).

Leer más

Microsoft Dynamics 'AX 7' / Rainier

La noticia de que existe una próxima versión de Microsoft Dynamics AX (versión 7) y que ésta va a ser una revolución en cuanto a la tecnología que la mueve y la experiencia de usuario no es nueva, lo comentábamos aquí ya en Agosto de 2013. Microsoft lleva comentando el proyecto Rainier varios años en diferentes eventos, pero las noticias interesantes siguen bajo NDA por lo que no se pueden publicar todavía.

Leer más

AX TIP: Ejecutar código X++ externo

Siguiendo con el hilo de mi anterior artículo, otro truco parecido consiste en la posibilidad de utilizar la clase XppCompiler para ejecutar manualmente un fragmento de código almacenado de forma externa, ya sea en la base de datos, en una variable, en ficheros de texto, etc.

Para ello podemos utilizar una sintaxis parecida a la siguiente:

static void JAEE_XppCompilerCode(Args _args)
{
    XppCompiler comp;
    
    Source codigo = 
        "InventLocationId findLocation(InventDimId _inventDimId)" +
        "{" +
        "    return InventDim::find(_inventDimId).InventLocationId;" +
        "}";
    
    InventDimId         inventDimId = "1879356425";
    InventLocationId    result;
    
    new ExecutePermission().assert();
    
    comp = new XppCompiler();
    
    if (!comp.compile(codigo))
        throw error("Código no válido.");
    
    result = runBuf(codigo, inventDimId);
    
    CodeAccessPermission::revertAssert();
    
    info(strFmt("Resultado: %1", result));
}

Tal como decía en el artículo anterior, utilizar manualmente este tipo de API es peligroso y debe ser asegurado. En aquel capítulo incluía algunos enlaces de interés para desarrollar código seguro.

Leer más

AX TIP: Ejecutar una expresión matemática desde X++

Un truco antiguo, pero muy útil en algunos casos, es la posibilidad de utilizar el compilador de X++ para calcular expresiones matemáticas. Una simplificación de este interprete matemático está implementada en todos los campos numéricos de la aplicación, donde, en vez de un número, se puede introducir una expresión sencilla. Por ejemplo: +15+7-10/3

El compilador va un poco mas ayá y nos permite utilizar funciones matemáticas más complejas. La lista completa de funciones, según la documentación, es: abs, acos, asin, atan, corrFlagGet, corrFlagSet, cos, cosh, decRound, exp, exp10, frac, log10, logN, power, round, sin, sinh, tan, tanh y trunc, aunque probablemente haya más, la lista de funciones en MSDN no ha sido nunca totalmente completa.

Leer más

HOWTO: Eventos en AX 2012 para minimizar conflictos

Como se puede adivinar de algunos de mis anteriores post,  soy un fiel defensor de uno de los grandes olvidados de AX 2012: Los eventos

En mi afán de evangelizar a favor de uso, he dado con un ejemplo muy evidente de sus ventajas. A estas alturas supongo que casi todo el mundo conoce la posibilidad de añadir nuevas opciones al menú Add-Ins del entorno de desarrollo de AX 2012 y anteriores. Es realmente fácil, sólo hay que crear una nueva clase con un método main al uso, un menú ítem que apunte a esa clase, y añadir el menú ítem al menú estándar SysContextMenu. Con esto conseguimos que nuestro menú ítem se muestre al hacer click-derecho sobre los elementos del AOT, por ejemplo (Startup Project es el nuevo add-in): SysContextMenu Add-In Sin embargo, para hacerlo realmente bien es necesario alguna modificación más. En mi ejemplo, el nuevo add-in sirve para convertir el proyecto seleccionado en el proyecto de inicio para el usuario actual. Es simple, pero nos sirve como ejemplo de un add-in que solo debe mostrarse cuando hacemos click derecho en un proyecto, y no en cualquier otro tipo de elemento del AOT. Para eso, como muestra la documentación, debemos modificar el método verifyItem de la clase SysContextMenu, que es un infierno de if-else in switches para determinar si el elemento debe mostrarse o no, dependiendo de la clase que lo llama, el tipo de elemento y un larguísimo y desastroso etcétera. Pero nosotros somos programadores elegantes de forma que, para no contribuir a empeorar ese desastre, en vez de modificar el método vamos a añadir un manejador de eventos (Event Handler) haciendo click-derecho en el método. Event Handler Ajustamos las propiedades del nuevo manejador de eventos para que apunten a una nueva clase que hemos creado para nuestro add-in: Event Handler - Propiedades El código que maneja el evento, más o menos el mismo código que hubiéramos incluido en el método original, es el siguiente: /// /// Event-Handler that will decide if the menuitem is shown or not. /// /// /// IdentifierName menuItemName /// MenuItemType menuItemType /// /// /// Is important not to break here the behaviour of the original method /// public static void verifyItem_EventHandler(XppPrePostArgs _args) { JAEESysContextmenu_DefaultProject defaultProjectClass; SysContextMenu contextMenu = _args.getThis(); // Argumentos del método original IdentifierName menuItemName = _args.getArgNum(1); MenuItemType menuItemType = _args.getArgNum(2); if (menuItemType == MenuItemType::Action && menuItemName == menuitemActionStr(JAEESysContextmenu_DefaultProject)) { // No permitimos seleccionar varios proyectos if (contextMenu.selectionCount() == 1) { defaultProjectClass = JAEESysContextmenu_DefaultProject::construct(contextMenu); // Modifico el valor devuelto por el método original _args.setReturnValue(defaultProjectClass.isProjectMenu() ? 1 : 0); } else { _args.setReturnValue(0); } } } De esta forma nuestro manejador de eventos se ejecuta después de que se haya ejecutado el verifyItem original, permitiéndonos modificar el valor devuelto pero, como se puede ver en la imagen anterior, NO se ha modificado la clase original que sigue en la capa sys y el modelo Foundation y, por tanto, no va a afectar a futuras actualizaciones del producto. Hemos modificado la funcionalidad de la clase estándar sin causar ningún impacto sobre ella. El proyecto que contiene el add-in totalmente funcional se puede descargar del enlace al final de este post, lo que hace lo podríamos resumir en estos métodos: El método main se llama al hacer click sobre el menú ítem, es el punto de inicio del add-in. Lo que hace es verificar que efectivamente se ha llamado desde un elemento de tipo Proyecto y de ser así actualiza el usuario asignando este proyecto como proyecto de inicio en las opciones: static void main(Args _args) { JAEESysContextmenu_DefaultProject defaultProjectClass; if (!_args) throw error(Error::wrongUseOfFunction(funcname())); if (SysContextMenu::startedFrom(_args)) { defaultProjectClass = JAEESysContextmenu_DefaultProject::construct(_args.parmObject()); // Sólo se permite lla llamada a esta función desde Proyectos if (defaultProjectClass.isProjectMenu()) defaultProjectClass.updateStartupProject(); else throw error(Error::wrongUseOfFunction(funcname())); } } Para comprobar si el elemento que ha llamado a esta clase e sun proyecto utilizo mi función isProjectMenu. Esta lógica se puede obtener mirando los métodos existentes de la clase estándar SysContextMenu: private boolean isProjectMenu() { TreeNode firstNode = sysContextMenu.first(); if (firstNode.handle() == classnum(ProjectNode)) return true; return false; } La actualización final para asignar el proyecto de inicio es muy sencilla: private void updateStartupProject() { UserInfo userInfo; ttsBegin;

Leer más
Thumbnail image

Introducción a PowerShell para desarrolladores Dynamics AX 2012 (PS-I)

PowerShell (lo abreviaremos PS en lo sucesivo) es una herramienta impresionante, entre otras cosas, para la administración de nuestros servidores y aplicaciones, y eso incluye, por supuesto, nuestro Microsoft Dynamics AX 2012. Con esta versión se incluye un módulo propio de PS al que llama “Microsoft Dynamics AX 2012 Management Shell” con algunos comandos que veremos en sucesivas entregas. Estos comandos son muy útiles, pero podemos sacar provecho también de la funcionalidad estándar de PowerShell para muchas tareas.

Leer más