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

Sin embargo al convertir el mismo texto en una etiqueta, el resultado es distinto:
Box::yesNo("@TST001", DialogButton::Yes, "Prueba multi línea!");

Y ocurre lo mismo si se utiliza una etiqueta con comodines (%1, %2, …) y la función strFmt de esta manera:
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:
Box::yesNo(strFmtLB("@TST001"), DialogButton::Yes, "Prueba multi línea!");
Y así si funcionará:

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.
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:
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();
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 4.0 SP2
- Microsoft Dynamics AX 2009 SP1
- Hotfix *
* requiere login
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.:

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