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

Microsoft Dynamics AX Design Patterns
Dado el tamaño y la inmensa funcionalidad incluida en Microsoft Dynamics AX, parece lógico pensar que se han seguido diferentes patrones de diseño para implementarlo, y en efecto así es.
Conocer y respetar estos patrones de diseño y tambien las buenas practicas es muy importante para mantener un buen nivel en nuestros desarrollos y procurar no “romper” el funcionamiento estándar de la aplicación con nuestras modificaciones, si bien no todos ellos estan completamente documentados, la mayoría se perfeccionan con la experiencia, pero la base se puede aprender mediante la documentación oficial:
Estos patrones no son arbitrarios, como se puede comprobar la mayoría se basan en patrones de diseño mas o menos estándar o al menos comunmente reconocidos como válidos, por ejemplo:
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?

Entorno de desarrollo en AX 2012
Ya hace algun tiempo que se anunciaron algunas mejoras en el editor de X++ para la próxima versión de AX, entonces AX ’6′, finalmente AX 2012, y durante las pasadas semanas se anunciaron muchas mas.
Ahora podemos ver que casi todas esas novedades ya están implementadas en un video publicado esta semana en el blog de mfp’s two cents.

En primer lugar se ven claramente las diferencias entre el entorno de usuario y el nuevo entorno de desarrollo. El interfaz esta mas limpio para las tareas de programación e incluye nuevos menus y barras de herramientas específicas.
Tambien podemos ver lo que de momento es el nuevo AOT que incluye varios nodos nuevos implementando las funcionalidades ya anunciadas la semana pasada:

Y al pie del entorno podemos ver el indicador de Modelo actual, desde donde podremos cambiarlo con un click, como se indica en el video:

Novedades sin parar en estos días, es muy recomendable el artículo publicado hace unos dias en el mismo blog Getting to AX 2012
Microsoft Dynamics AX 2012
Acabada la Microsoft Dynamics AX Technical Conference 2011 de esta semana tenemos suficientes novedades sobre AX como para considerarlo un producto totalmente nuevo, al menos en lo que arquitectura y tecnología se refiere. La primera novedad es el nombre definitivo de la nueva versión llamada hasta ahora Dynamics AX ’6′, se publicará con el nombre comercial Microsoft Dynamics AX 2012.
Durante esta semana algunos de los afortunados que pudieron asistir a la conferencia en Redmond han estado publicando novedades en sus blogs y sobre todo, en twitter, bajo el hashtag #daxconf. Lo que publico aquí es sólo un resumen de las novedades publicadas en twitter desde diferentes cuentas.
Durante la conferencia se llegó a decir que mas que una nueva versión, AX 2012 será una nueva generación de ERP, y despues de leer este artículo y las novedades que aún no se han desvelado, creo que estaremos de acuerdo con esa afirmación. Preparemonos para re-aprender todo lo aprendido hasta ahora.

Microsoft Dynamics AX Technical Conference 2011
Foto: @techmaniac1
Avances de la nueva versión de Dynamics AX ’6′
Como es más que sabido, ya que lo han anunciado por todos los canales posibles, la semana que viene es la Microsoft Dynamics AX Technical Conference 2011 en las oficinas de Microsoft en Redmond (Washington, EEUU) y esto hace que se vayan adelantando las novedades que allí se van a contar sobre las nuevas versiones de Dynamics, en el caso que nos ocupa la version llamada de momento Dynamics AX 6.
Aunque no hay nada concreto todavía, Microsoft publicó ayer una nota de prensa anunciando lo que serán los cambios de arquitectura de AX que ya hace tiempo se venian comentando y que, si bien para usuarios finales e incluso consultores será casi un cambio transparente, para los desarrolladores y personal técnico va a ser la novedad mas importante y más esperada de esta versión, salvo que anuncien una novedad impresionante en los próximos meses.
Estoy hablando de la anunciada arquitectura en capas basada en modelos que permitirá separar de una vez los desarrollos entre partners e incluso permitirá separar para un mismo partner diferentes desarrollos como por ejemplo pueden ser soluciones verticales u horizontales. También incluirá, según se aunció durante el año pasado, el traspaso de muchos de los objetos de la aplicación que ahora se almacenan en ficheros de disco a la base de datos SQL lo que mejorará (esperemos) notablemente el rendimiento de los objetos y la facilidad de mover desarrollos entre entornos.
También se destaca una integración de serie con el resto de la plataforma Microsoft Application Platform que incluye entre otros SQL Server 2008, Visual Studio 2010, Office 2010 y Sharepoint 2010 que, según anuncian, reducirá los tiempos de integración.
Es interesante que varios partners ya han estado probando y desarrollando sobre esta versión en el programa Early Adopter (por lo que suponemos hay una versión estable disponible) y anuncian que habrá una versión preview para la comunidad técnica el mes que viene (Febrero) y que estará disponible de forma general en el tercer cuarto de este año 2011.
Todo el detalle en la Nota de Prensa.
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:
