j.a.estevan

Si no eres parte de la solución, eres parte del poblema

HOWTO: Ejecutar tu propio código .NET en Dynamics AX 2009

Aunque esto es algo que tiende a desaparecer en el próximo Microsoft Dynamics AX 2012, de momento es una funcionalidad muy útil en la versión 2009, ya que es la única manera de solventar algunas limitaciones técnicas.

Me estoy refiriendo a la posibilidad de utilizar el .NET CLR Interop para ejecutar desde nuestro código X++ librerías desarrolladas en .NET (ya sea C# o VB.NET). Esta integración también tiene sus propias limitaciones pero amplía de manera notable las posibilidades de desarrollo en AX 2009.

Voy a hacer un ejemplo paso a paso, y el primer paso es crear la propia librería desde Visual Studio. En mi caso voy a utilizar (el ya súper antiguo) Visual Studio 2005 para crear un nuevo proyecto “Biblioteca de clases”:

Dynamics AX 2009 DLL Interop

El código va a ser muy sencillo para no complicar la prueba, simplemente devolverá el nombre del equipo donde se ejecuta el código (esto se puede utilizar para comprender la ejecución de código en el cliente (devolverá la máquina local) o en el servidor (devolverá el AOS):

01 de noviembre de 2011 | hay 3 comentarios

HOWTO: Enviar emails desde X++

Email

Enviar correos desde Microsoft Dynamics AX mediante código X++ es muy sencillo, pero requiere de demasiado código si se quiere aplicar de manera reutilizable.

Para enviar un email utilizando la clase SysMailer estándar haremos algo parecido a esto:

 

 

SysMailer   sysMailer;

SysEmailParameters  sysEmailParameters      = SysEmailParameters::find();
InteropPermission   interopPermissionClr    = new InteropPermission(InteropKind::ClrInterop);
InteropPermission   interopPermissionCOM    = new InteropPermission(InteropKind::ComInterop);
Set                 permissionset           = new set(Types::Class);

#define.DefaultFromAddress("from@jaestevan.com")
;

try
{
    // Permisos
    permissionset.add(interopPermissionClr);
    permissionset.add(interopPermissionCOM);
    CodeAccessPermission::assertMultiple(permissionset);

    //Inicialización de los parámetros de correo electrónico.
    sysMailer = new SysMailer();

    if (sysEmailParameters.smtpRelayServerName)
    {
        sysMailer.SMTPRelayServer(sysEmailParameters.smtpRelayServerName,
                                  sysEmailParameters.smtpPortNumber,
                                  sysEmailParameters.smtpUserName,
                                  sysEmailParameters::password(),
                                  sysEmailParameters.ntlm);
    }
    else
    {
        sysMailer.SMTPRelayServer(sysEmailParameters.smtpServerIPAddress,
                                  sysEmailParameters.smtpPortNumber,
                                  sysEmailParameters.smtpUserName,
                                  SysEmailParameters::password(),
                                  sysEmailParameters.ntlm);
    }

    // Dirección de origen
    sysMailer.fromAddress(#DefaultFromAddress);
}
catch
{
    throw error("No se puede inicializar el envío de emails");
}

// OK! SysMailer inicializado con parámetros y dirección de origen

// Añadir destinatario
sysMailer.tos().appendAddress("test@jaestevan.com");

// Se pueden añadir destinatarios en copia (CC)
sysMailer.ccs().appendAddress("cc@jaestevan.com");

// Subject del mensaje
sysMailer.subject("Mensaje de prueba");

// Cuerpo del mensaje
sysMailer.htmlBody("<a href='http://www.jaestevan.com'>BODY de ejemplo en HTML!</a>");

// Hasta se pueden añadir ficheros adjuntos!
sysMailer.attachments().add("ficherodeejemplo.txt");

// Let's dance!
sysMailer.sendMail();

// Renuncia de los permisos
CodeAccessPermission::revertAssert();

28 de octubre de 2011 | hay 4 comentarios

HOWTO: Facturación selectiva de líneas en Dynamics AX

En Microsoft Dynamics AX, como en la gran mayoría de ERP’s, se pueden facturar líneas de forma parcial y agruparlas según diferentes criterios. El usuario puede elegir el número de líneas que desee:

PurchFormLetter | 1

y facturarlas completamente o en parte, dejando el resto pendiente de facturar o no, agrupandolas en facturas por clientes, por dirección, etc.:

PurchFormLetter | 2

05 de septiembre de 2011 | deja un comentario

HOWTO: Consultar el registro de base de datos mediante X++

Una característica muy interesante de Microsoft Dynamics AX es su capacidad para realizar auditoría de cualquier tabla que necesitemos de manera estándar y configurable mediante la funcionalidad “Registro de base de datos“.

Este registro es muy sencillo de configurar, se eligen las tablas y los campos que se desean auditar. Por ejemplo, en este caso queremos guardar un registro de las modificaciones en la tabla de proyectos:

SysDataBaseLog | 1

22 de julio de 2011 | deja un comentario

HOWTO: Consultar inventario disponible mediante X++

Consultar el nivel de inventario disponible de un artículo es mas complicado de lo que se suele suponer en un principio, aunque no tan complicado como se suele suponer la primera vez que se intenta :)

Para consultar cualquiera de los niveles de disponible que nos ofrece Microsoft Dynamics AX (Disponible físico, reservado, ordenado, etc. …) mediante código X++ debemos simular el funcionamiento del formulario estándar dedicado a ello:

  • En primer lugar podemos buscar el disponible por artículo o no. Depende de si queremos saber cuánto disponible hay de un determinado producto, o cuanto disponible hay en una ubicación de cualquier producto (por ejemplo).
  • Por otro lado tendremos que definir un nivel de “profundidad” en las dimensiones de inventario. Nos puede interesar cuánto disponible de un producto tenemos en una ubicación determinada, simplemente cuánto disponible hay en general o en un almacén, o sencillamente si hay disponible o no (en cualquier lugar).
  • Y por último tendremos que saber cuál de los niveles de disponible nos interesa. El inventario físico disponible, el físico reservado, ordenado, ordenado reservado, pedido … cada valor indica un dato que es importante en cada situación.

¿Cómo consultar todos estos casos mediante el estándar?

Microsoft Dynamics AX | Consulta de inventario disponible

22 de junio de 2011 | deja un comentario

HOWTO: Máquina virtual demo AX 2012 sin Hyper-V

Como sabemos, Microsoft lanzó la máquina virtual con la demo de la beta de Dynamics AX 2012 en Partner Source. El problema es que es una imagen de máquina virtual para Hyper-V que sólo puede ser lanzada “out-of-the-box” sobre un Windows Server 2008 R2, lo cual no es muy práctico para un equipo portátil o un PC de escritorio de trabajo normal. Microsoft no nos proporciona de forma nativa otras opciones así que para hacerlo funcionar se puede utilizar la solución de Oracle VM VirtualBox.

Todavía así siguen existiendo algunas limitaciones como, por ejemplo: para arrancar un sistema de 64 bits en VirtualBox (como es el caso de esta imagen que intentamos iniciar) necesitamos que el equipo sobre el que lo montemos soporte virtualización por hardware, lo que es común en sistemas modernos pero no tanto en equipos de hacer algunos años. En mi caso es un PC de escritorio con una placa Asus y procesador AMD Quad-Core y esta opción se puede activar en la BIOS:

Dynamics AX 2012 Demo VM 1

Dicho esto, lo primero será descargar la imagen de Partner Source (25 ficheros, 17 Gb en total) y como esto tardará un buen rato se puede descargar e instalar mientras tanto el VM VirtualBox de Oracle. Una vez descargados y descomprimidos todos los ficheros procedemos a montarlos de la siguiente manera:

  • Creamos una nueva máquina virtual, le damos un nombre cualquiera y elegimos como sistema huésped un Windows 2008 (64 bit). Es importante que sea 64 bits, si esta opción no está disponible es, probablemente, porque en el equipo que intentamos crearla, esta opción no se soporta:
    Leer el resto del artículo →

06 de junio de 2011 | hay 3 comentarios

Google Android vs Microsoft Dynamics AX (II)

Hace ya algún tiempo hice un pequeño experimento de conexión a un Dynamics AX 2009 de pruebas desde un terminal Android (emulado). Pues bien, con aquel experimento obtuve algunos progresos más aunque no había tenido tiempo todavía para publicarlos.

En el anterior post sobre este tema explicaba el entorno de desarrollo y un sencillo esquema de lo que pretendía conseguir:

Diseño básico de la Arquitectura en las pruebas

Es un entorno con tres capas muy bien diferenciadas, una instalación normal de Dynamics AX 2009 con el .NET Business Connector por un lado, un servicio web hecho en C#.NET en medio y un terminal Android al otro lado.

Sobre la instalación AX no hay nada que mencionar, es una instalación normal sin ninguna personalización y con los datos de prueba que facilita Microsoft, explicaré un poco las otras dos capas que son más interesantes:

31 de mayo de 2011 | deja un comentario

Google Android vs Microsoft Dynamics AX (I)

Desde hace algún tiempo tengo la inquietud personal de investigar una solución móvil para conectar a Microsoft Dynamics AX 2009. Lo aparentemente mas lógico sería intentarlo con Windows Phone 7 pero el entorno Android me parece muy interesante para investigar, así que el proceso de investigación será doble.

Para conectar a AX desde el exterior podríamos optar por una solución “out of the box” como por ejemplo el conector AIF pero ya que este es un proceso de investigación personal (no es una solución real para un cliente por el momento) he decidido implantar “manualmente” todo el proceso según el siguiente esquema:

Android vs AX 2009

El entorno de desarrollo es el siguiente:

21 de marzo de 2011 | hay 1 comentario

HOWTO: Dimensiones y Macros en X++

El manejo de dimensiones por código en Microsoft Dynamics AX no es muy intuitivo al principio aunque con un poco de práctica se comprueba que no es tanto como parece. AX nos ofrece una serie de ayudas para facilitar estas tareas y entre otras las mas útiles son las macros #InventDim*

InventDim macros | 1

El propio estándar utiliza estas macros en multitud de lugares, por ejemplo este es un fragmento del método find() de la tabla estandar PriceDiscTable (Acuerdos comerciales):

28 de diciembre de 2010 | deja un comentario

HOWTO: Crear controles y eventos dinámicamente en formularios AX

En este HOWTO me gustaría explicar el proceso completo para crear dinámicamente controles en un formulario existente (aunque también podría no existir, pero ya sería complicar demasiado) y además manejar los eventos generados por ese control tanto dentro como fuera del formulario en sí.

Lo haremos paso a paso, de lo mas facil a lo mas complicado:

Empezaremos con un formulario nuevo de AX totalmente estándar sin ninguna propiedad modificada:

Dynamic Runtime Forms | 1

23 de julio de 2010 | deja un comentario