Microsoft Dynamics AX 2012, tablas TempDB y Formularios

En versiones anteriores disponíamos de diferentes técnicas (no muy intuitivas) para utilizar tablas temporales en formularios. Estas mismas técnicas pueden utilizarse en AX 2012, donde además, tenemos diferentes tipos de estas tablas. En particular me interesan las tablas de tipo TempDB porque son las que mejor rendimiento obtienen, al estar gestionadas por el motor de Microsoft SQL Server. Este es uno de esos post que escribo para tener localizada la información y volver a ella en futuras referencias 🙂

Una versión muy sencilla de uso de estas tablas es similar a como lo hacíamos en la versión 2009, sustituyendo la función setTmpData por linkPhysicalTableInstance. De esta forma, creamos un formulario, añadimos la tabla temporal al origen de datos, etc. y finalmente el método init del formulario queda de esta forma:

public void init()
{
    // ...
   
    super();

    JAEETablaTmp.linkPhysicalTableInstance(JAEETablaTmp::createRecords(desde, hasta));
}

El origen de datos se enlaza con un buffer de la tabla temporal devuelto por la función que inserta los datos. De forma que esos datos que devuelve la función son los que se muestran en el formulario.

Una forma más avanzada de hacerlo, que ofrece más flexibilidad para actualizar los datos posteriormente, es usar una variable de la tabla temporal,que posteriormente podamos manipular. En este caso hay que tener en cuenta el ámbito (scope) de existencia de los datos en la tabla temporal, para lo cual debemos pasar la misma variable a las funciones que manipulen los datos, para no perderlos.

public class FormRun extends ObjectRun
{
    JAEETablaTmp   tmpTable;
}

public void init()
{
    // ...

    super();

    // Hay que pasar el buffer a la función para mantener el ámbito
    JAEETablaTmp::createRecords(tmpTable, desde, hasta);

    // ...

    // Enlazar el buffer con la tabla temporal
    JAEETablaTmp.linkPhysicalTableInstance(tmpTable);
}

Así podremos actualizar los datos posteriormente, en mi caso con la llamada a un botón en el formulario que obtiene parámetros de otros controles, de esta forma:

void clicked()
{
    JAEETablaTmp::createRecords(tmpTable, FromDate.dateValue(), ToDate.dateValue());
    JAEETablaTmp_ds.executeQuery();
}

Destacar cómo la variable temporal declarada en el formulario se pasa a la función que genera los datos para mantener siempre la referencia a la misma variable que está enlazada al origen de datos. La función gestiona los datos en esta misma variable, y la devuelve, de esta manera:

public static client JAEETablaTmp createRecords(
    JAEETablaTmp    _tmpBuffer,
    FromDate        _desde,
    ToDate          _hasta)
{
    // ...

    delete_from _tmpBuffer;

    while select DatePhysical, ItemId, sum(Qty)
        // ...
    {
        _tmpBuffer.clear();
        // ...
        _tmpBuffer.insert();
    }

    return _tmpBuffer;
}

Una particularidad que hay que tener en cuenta es que, en el momento de enlazar la tabla temporal con el origen de datos, la variable buffer no puede estar vacía, o el enlace no se realiza. Ésto no es ningún problema en el primer ejemplo, ya que simplemente no se mostrará ningún dato en el formulario; pero si utilizamos la segunda técnica y el enlace con la variable no se realiza correctamente,  posteriores actualizaciones de la variable no se verán reflejadas en el origen de datos, y tampoco se mostrará ningún error.

Una forma sencilla de evitar esto es insertar un registro vacío en la tabla antes de realizar el enlace con el origen de datos:

public void init()
{
    // ...

    super();

    // Hay que pasar el buffer a la función para mantener el ámbito
    JAEETablaTmp::createRecords(tmpTable, desde, hasta);

    // Si la tabla no tiene registros, la tabla no se enlaza!!
    if (!tmpTable)
        tmpTable.insert(); // IMPORTANTE!

    // Enlazar el buffer con la tabla temporal
    JAEETablaTmp.linkPhysicalTableInstance(tmpTable);
}

Espero que os sirva 😀

Libro: Microsoft Dynamics AX 2012 R2 Services

Después de un parón en la publicación de contenidos, debido a un gran proyecto que verá la luz en los próximos días/semanas, vuelvo a la carga con la revisión de un libro escrito por Klaas Deforche y Kenny Saelen y publicado por Packt Publishing, quienes me han echo llegar una versión digital. Tiene este aspecto:

Microsoft Dynamics AX 2012 Services

Este libro es una especie de segunda parte del que ya mencioné (y recomendé encarecidamente) hace algún tiempo titulado Microsoft Dynamics AX 2012 Services. El contenido es muy parecido e igual de recomendable. Esta segunda versión es más larga que el primero, por lo que abunda más en ciertos contenidos aportando más detalles, aunque el contenido en general es prácticamente el mismo, salvo algunos detalles propios de la revisión R2, que en cuanto a servicios web no son muy numerosos.

Aún así, como digo, es un libro muy recomendable, igual que lo era la primera parte. Cuenta con dos autores ya reconocidos y con la experiencia previa de la primera versión, y con un equipo de revisores de primera, así que el contenido esta bien escrito y bien estructurado, sobre un tema que es obligatorio para cualquier implantación de Microsoft Dynamics AX 2012, como son los servicios web.

Si ya compraste la primera versión, probablemente esta última no te aporte grandes novedades, salvo los detalles en los que profundiza más, y las escasas novedades de la R2. Si en su día no lo compraste, claramente recomiendo comprar esta segunda versión porque la lectura es muy interesante.

Microsoft Dynamics AX 2012 R3 Demo VM V1

Microsoft Dynamics AX 2012 R3

Ya se ha publicado la máquina virtual demo de la también recién publicada Microsoft Dynamics AX 2012 R3. Esta máquina virtual viene, como de costumbre, actualizada con las últimas versiones de todo el software (Incluido Windows 2012 R2 y Microsoft SQL Server 2014) y con datos de prueba de las nuevas funcionalidades de esta versión, que son numerosas. Se puede descargar de los siguientes enlaces:

Sin duda la gran ventaja de esta versión es la posibilidad de desplegar la máquina virtual directamente en Azure desde nuestra cuenta de , algo que se agradece viendo los enormes requerimientos de hardware que tienen las últimas versiones de la máquina demo. Los compañeros de TrucosAX han publicado una guía paso a paso de como realizar ese sencillo despliegue, muy recomendable:

 

Portal de Localización para Microsoft Dynamics AX

Sólo comentar que se ha creado un portal donde se recopilan todos los hotfixes y parches publicados referentes a la localización de todos los países, incluidos los cambios legales y de impuestos. Es muy interesante porque se pueden descargar desde un mismo sitio todos los parches que nos interesan. También se puede descargar una lista de hotfixes para poderla consultar en cualquier momento!

Cumulative Update 7 para Microsoft Dynamics AX 2012

Microsoft Dynamics

Hace ya varios meses que se publicó el CU7 para Dynamics AX 2012 R2 (que nos trajo cambios tan importantes como la utilidad AxBuild o la posibilidad de instalar hotfixes por separado). Sin embargo la actualización para las primeras revisiones se ha hecho esperar. Esta semana se ha publicado la última actualización acumulativa para Microsoft Dynamics AX 2012 RTM (6.0.947.0) y Microsoft Dynamics AX 2012 Feature Pack 1 RTM (6.0.1108.0). Esta revisión (6.0.1108.6482), como de costumbre, agrupa todos los hotfixes publicados desde el lanzamiento de la primera versión (ver los CU publicados con anterioridad) y, como ya comenté en post anteriores, se ha cambiado la numeración para ser coherente en todas sus versiones, por tanto no existe CU6 para RTM, el último que se publicó fue el CU5 y éste es el siguiente.

Se puede descargar del siguiente enlace:

A diferencia de las últimas actualizaciones acumulativas para la versión R2 (pronto R3), esta actualización no incluye cambios funcionales (no incluye la utilidad AxBuild, por desgracia), sólo actualizaciones y hotfixes tal como era costumbre en estos paquetes. Es importante echar un vistazo a la página de descarga para revisar las versiones desde las que podamos actualizar, así como los detalles del proceso de instalación en cada caso.

Microsoft Dynamics AX 2012, servicios web, .NET Interop, cliente-servidor y arquitectura de aplicación

¡Vaya título! ¿Qué tienen que ver todos estos conceptos y por qué debería tenerlos en cuenta? Es posible que no sea una situación que se nos presente todos los días, pero hay veces donde hay que tener todos esos conceptos en cuenta para hacer que un fragmento de X++ funcione correctamente. Este ha sido mi caso: Tengo que consumir un servicio web externo desde Microsoft Dynamics AX 2012. Parece fácil, ¿no?. El servicio web se va a consumir en un proceso por lotes (servidor), pero también debe poder llamarse manualmente desde formularios (cliente).

En Microsoft Dynamics AX 2009, para utilizar un servicio debíamos añadir una referencia de servicio al AOT. En la versión 2012 creamos un proyecto Visual Studio de tipo Librería de clases. En ese proyecto de Visual Studio agregamos una referencia de servicio y agregamos el proyecto al AOT. No voy a entrar en detalle sobre ésto porque esta bien explicado por ejemplo en este white paper.

Una de las cosas a tener en cuenta acerca de los conceptos del título de este post está en las propiedades del proyecto en Visual Studio:

Propiedades Proyecto Visual Studio

Lo relevante aquí es marcar Deploy to Client si queremos que la DLL se despliegue a los clientes y Deploy to Server si queremos que se despliegue al servidor. De esta manera, el sistema copiará la librería cuando sea necesario a la carpeta correspondiente, descargándola de la base de datos (de la Model Store) donde está almacenada. Dependiendo de cómo se ejecute el código X++ que utiliza esta librería podemos marcar uno u otro o los dos.