j.a.estevan

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

AX TIP: Mostrar label con saltos de línea mediante X++

Una característica bastante molesta que te encuentras programando para Microsoft Dynamics AX es la manera en la que se tratan los saltos de líneas al presentar texto en formularios utilizando etiquetas. Por ejemplo, la siguiente línea:

Box::yesNo("Línea 1 \n Línea 2", DialogButton::Yes, "Prueba multi línea!");

Presenta un diálogo normal con un texto en varias líneas (hace caso del carácter \n para poner un salto de línea):

strFmtLB 1 | Bien

Sin embargo al convertir el mismo texto en una etiqueta, el resultado es distinto:

// @TST001: Línea 1 \n Línea 2
Box::yesNo("@TST001", DialogButton::Yes, "Prueba multi línea!");

strFmtLB 2 | Mal

Y ocurre lo mismo si se utiliza una etiqueta con comodines (%1, %2, …) y la función strFmt de esta manera:

// @TST001: Línea 1 \n Línea 2
Box::yesNo(strFmt("@TST001"), DialogButton::Yes, "Prueba multi línea!");

Para que la etiqueta haga caso del salto de línea hay que utilizar la función strFmtLB:

// @TST001: Línea 1 \n Línea 2
Box::yesNo(strFmtLB("@TST001"), DialogButton::Yes, "Prueba multi línea!");

Y así si funcionará:

strFmtLB 3 | Bien

Pero esta función no sustituye a la anterior. Esto es, en caso de tener comodines y saltos de página habrá que incluir las dos funciones. Esto es bastante molesto cuando modificas una etiqueta y pones un salto de línea. Da la impresión de haberse roto algo que antes sí funcionaba, y es que esta función no esta incluida nunca en el código si no es necesaria de forma explícita.

26 de diciembre de 2011 | deja un comentario

Información de tablas durante el desarrollo en Dynamics AX

Cuando se desarrolla para Microsoft Dynamics AX es muy común tener que consultar tipos de datos, nombres de campos, tablas, etc. para mantener la coherencia entre objetos nuevos y estándar. Esta consulta se puede hacer mediante las propiedades de los formularios (el botón Configurar del menú contextual estándar) y consultando el diseño o la query que se muestra en este formulario o yendo directamente al objeto del AOT:

Pero si esta consulta la tenemos que hacer muy a menudo, como al principio de un gran desarrollo, es molesto tener que hacer todos estos pasos cada vez y se puede consultar mucho mas fácilmente de esta manera:

16 de diciembre de 2011 | deja un comentario

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

Microsoft Dynamics AX Hotfix: Ley de Morosidad (España)

Están disponibles los objetos actualizados de Microsoft Dynamics AX para cumplir con los requisitos de la Ley de Morosidad según el BOE-A-2010-10708:

  • Microsoft Dynamics AX 2009 SP1

* requiere login

27 de septiembre de 2011 | deja un comentario

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

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

Microsoft Dynamics AX 2009 SP1 Rollup 7

Sólo una breve nota para reseñar que ha sido publicado el paquete de actualizaciones Rollup 7 para Dynamics AX 2009 SP1. Se puede descargar y consultar los hotfixes incluidos en la siguiente página:

NOTA: Es interesante indicar que incluye, entre muchas otras cosas, el último cambio para la declaración española del 347

25 de abril 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

Dynamics AX reporting y SQL Server Reporting Services (SSRS)

Una de las novedades que mas me interesan y sobre la que mas se está publicando en diversos medios (supongo que no soy el único al que le interesa) es el paso de los reports en Dynamics AX 2012 al entorno SQL Reporting Services (SSRS).

Microsoft SQL Server Reporting Services

13 de marzo de 2011 | hay 1 comentario