Microsoft Dynamics AX 7 y el nuevo X++

El nuevo Microsoft Dynamics AX también trae consigo “el nuevo X++“. La mayoría de cambios recibidos por el nuevo X++ son relativos al compilador y las herramientas para desarrollarlo. El compilador es totalmente nuevo, haciendo de X++ un lenguaje más del stack de .NET, lo que ha permitido integrarlo totalmente con Visual Studio y evitar el compilado en dos partes de versiones anteriores: No más p-code, todo el código X++ es compilado ahora directamente a CIL. Pero de esto hablaremos otro día, hoy vamos a ver los cambios en el lenguaje en sí mismo, en la sintaxis, disponibles en la nueva versión:

luke-skywalker

Mejoras respecto a AX 2012

  • Finally… añadido el bloque finally a las estructuras try..catch. Su funcionamiento es el mismo que en C#, este bloque se ejecuta siempre se produzcan o no errores en el bloque try.
  • Se puede inicializar el valor de las variables de clase en la propia declaración.
  • Se pueden declarar variables en cualquier parte del código, ya no es necesario realizar todas las declaraciones al principio de los métodos, lo que permite declarar variables en un ámbito más específico (dentro de bucles, por ejemplo).
  • Se añade el tipo especial var, que permite al compilador inferir el tipo concreto de la variable. Su funcionamiento es el mismo que en C# pero cuidado, en .NET se usa este tipo para manejar tipos genéricos, en X++ los tipos genéricos no están disponibles todavía.
  • Añadida la instrucción using para que podemos utilizar igual que en C#, esto es:
    • Para abreviar las referencias a espacios de nombres complicados:
using System.Collections;

class ClaseEjemploXpp
{
    public static void main(Args args)
    {
        // No es necesario especificar el tipo completo
        // System.Collections.Arraylist

        ArrayList arrayList = new ArrayList();
        arrayList.Add('Prueba');
    }
}

Para crear alias a espacios de nombres:

using SysCol = System.Collections;

class ClaseEjemploXpp
{
    public static void main(Args args)
    {
        SysCol.ArrayList arrayList = new SysCol.ArrayList();
        arrayList.Add('Prueba');
    }
}

Para garantizar el uso correcto de tipos como los IDisposable, por ejemplo (más información aquí):

using (Font font = new Font())
{
    // font.Method(...);
}

// ES EQUIVALENTE A:

Font font = new Font();
try
{
    // font.Methods(...);
}
finally
{
    font.Dispose();
}
  • Las variables de clase pueden ser estáticas.
  • Las clases pueden tener un constructor estático mediante la nueva palabra clave typenew. Por ejemplo:
class ClaseConConstructor
{
    static str variableDeClaseEstatica = "Inicializada";

    static void typenew()
    {
        variableDeClaseEstatica = "Asignada sin this.";
    }
}
  • Los atributos aplicados en clases y métodos pueden omitir el sufijo Attribute en su nombre, igual que ocurre en C#. Por ejemplo, para un atributo llamado [PruebaAttribute] también será válido utilizar sólo [Prueba].
  • Los delegados que antes podían declararse en clases, ahora también se pueden declarar en tablas formularios y consultas (objetos Query).
  • La relación entre estos delegados y los métodos manejadores se realiza ahora mediante atributos.
  • Dentro de formularios, se pueden encontrar clases anidadas dentro de clases. La clase base representa el formulario (una instancia de FormRun) y las clases interiores manejan los componentes del formulario (Controles, Orígenes de datos, etc.).

Incompatibilidad con versiones anteriores

Aunque se ha intentado reducir al mínimo los problemas de retro-compatibilidad en el lenguaje, el cambio de plataforma ha llevado inevitablemente a descatalogar las partes del lenguaje que gestionan aspectos de la plataforma que ya no existen, como los siguientes:

  • Eliminadas las siguientes instrucciones: changeSite, pause, windows. Provocan errores de compilación.
  • Puesto que todo el código se ejecuta ahora en CIL en el servidor, ya no tienen sentido las sentencias client y server. No provocan errores de compilación pero son ignoradas y deben eliminarse.
  • En Microsoft Dynamics AX 2012 había algunas diferencias en cuanto a la ejecución del mismo código en CIL o interpretando el p-code. En la nueva versión todos estos casos funcionan igual que en su anterior ejecución CIL. Por ejemplo:
    • El tipo base real es ahora un System.Decimal en todos los casos. La precisión decimal se ha modificado respecto al tipo real de p-code. Esta diferencia provocaba a menudo pequeñas variaciones de decimales cuando el código se ejecutaba en CIL respecto a su interpretación en p-code.
  • La asignación directa de un array a otro array se realiza por referencia. En p-code se realizaba por valor.
5 comentarios
  • jaestevan
    diciembre 14, 2015

    Sí, todo el desarrollo se realiza en Visual Studio. Hasta donde yo se, no hay ningún cambio en las licencias. Esto es, necesitas tener un entorno AX para probar, y necesitas tener una licencia Visual Studio que corre por cuenta del partner, igual que ahora.

    El desarrollo en la parte gráfica es bastante parecido a versiones anteriores, se pueden personalizar los formularios en base a metadatos. Con el cambio a web se pueden utilizar algunos controles MVC personalizados igual que antes podían utilizarse controles ActiveX.

    En cuanto se libere el NDA se publicará mucha documentación más precisa accesible en la nueva wiki de Dynamics.

  • Luis Cano
    diciembre 14, 2015

    el desarrollo de nuevas funcionalidades por parte de un partner se realizará ahora mediante Visual Studio?¿

    esto como afecta las licencias?, solo basta con tener Visual Studio ? …
    será posible un desarrollo mas personalizado en la parte gráfica de las ventanas ?¿

    Muchas Gracias por tu post muy bueno y enriquecedor

  • jaestevan
    diciembre 11, 2015

    Así es, con la primera versión se incluye una implementación de LINQ que no utiliza generics.

  • Huber Gomez
    diciembre 11, 2015

    Hola gracias por la información, pero me deja una duda, al no tener implementado el uso de generics, tampoco podria usar LINQ to Objects para trabajar con los objetos.

  • Arun Garg
    diciembre 4, 2015

    Interesting post 🙂