HOWTO: AX – Distribuir ficheros con SysFileDeployment

A veces es util poder distribuir a los clientes de AX ficheros auxiliares que van a necesitar para la ejecución del programa, por ejemplo, controles ocx, librerias dll, iconos, imágenes, etc.

Gracias a André Arnaud, que amablemente respondió a una duda mía en los foros de la Microsoft Dynamics Community he descubierto el framework de AX SysFileDeployment que viene perfecto para esta tarea.

La idea de este framework es heredar clases para indicar a AX qué ficheros deben copiarse a la parte cliente cada vez que se realiza una nueva instalación de AX. Este framework tiene bastantes limitaciones pero la ventaja es que en su código se gestiona bastante bien el tema de permisos para copiar ficheros situados en el servidor hacia el cliente.

Comparto las pruebas que yo he realizado por si a alguien le pudieran servir. En primer lugar, hay que generar una nueva clase heredada de SysFileDeploymentFile indicando a AX qué fichero hay que copiar, dónde esta y hacia donde copiarlo. Esta es la estructura básica de la clase heredada, que esta bien autodocumentada por si se necesita mas personalización:

class SysFileDeploymentFileJAEEIcon extends SysFileDeploymentFile
{
   public Filename filename()
   {
       return 'jaestevan.png';
   }
 
   //AOSRunMode::Server
   protected FilenameOpen sourcePath()
   {
       return "C:\\Archivos de programa\\Microsoft Dynamics AX\\50\\Application\\Share\\Include\\";
   }
 
   //AOSRunMode::Client
   protected FilenameSave destinationPath()
   {
       return xInfo::directory(DirectoryType::Include);
   }
}

Una de las limitaciones de este framework es que sólo se ejecuta la primera vez que se ejecuta el cliente en un equipo determinado. Por tanto para distribuir nuevos ficheros o para hacer pruebas, como es mi caso, habría que modificar el método applBuildNo() de la clase ApplicationVersion, para forzar al sistema a actualizar la versión. Haciéndolo de este modo, AX detectará que tenemos ficheros pendientes de actualizar en el servidor y nos mostrará el siguiente diálogo:

SysFileDeploymentFile

Como no me apetecía andar modificando la build de mi entorno de pruebas, he hecho un pequeño Job que simula el código que se ejecutaría automáticamente de manera normal:

static void JAEE_SysFileDeployment(Args _args)
{
   container           classes;
   SysFileDeployment   sysFileDeployment;
   container           classVersion;
   classId             classId;
   ;
 
   classId = classNum(SysFileDeploymentCesserIcon);
   sysFileDeployment = classfactory.createClass(classId);
   classes += [[classId,sysFileDeployment.getServerVersion()]];
 
   classVersion = conpeek(classes, 1);
   classId = conpeek(classVersion, 1);
 
   sysFileDeployment = classfactory.createClass(classId);
   sysFileDeployment.setServerVersion(conpeek(classVersion, 2));
   sysFileDeployment.run();
}

Otra de las desventajas es que parece que esta clase no funciona demasiado bien en AX 4. Yo las pruebas que acabo de hacer en 2009 SP1 sí han funcionado, salvo un pequeño problema con las rutas de origen/destino, supongo que por ejecutar todo el entorno en la misma máquina (cliente, aplicación, AOS, ..).

A partir de aquí que cada uno investigue lo que necesite.

Descarga

jaestevan
Microsoft Dynamics AX MVP. Programador y consultor técnico de soluciones Microsoft Dynamics AX y Business Intelligence. Experiencia con Dynamics AX, SQL Server y lenguajes como VB6, .NET C#, PHP, Java, etc. para desarrollos de escritorio, PDA, sitios y servicios web, interfaces de integración, etc.