j.a.estevan
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”:

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):
HOWTO: Enviar emails desde X++

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:
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();
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:

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

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:

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?

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:

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

El entorno de desarrollo es el siguiente:
- Microsoft Dynamics AX 2009 SP1 RTM (Máquina virtual con Windows 2003 Estándar)
- Microsoft Dynamics .NET Business Connector
- Visual Studio 2010 Profesional, el lenguaje elegido es C#
- Android SDK
- Librería ksoap2-android para comunicación SOAP desde Android
- Eclipse IDE for Java con plugin para Android
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*

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