Crear un servicio web con Business Connector de Axapta (2009)

by Marc Cortada 19/06/2012

Business Connector permite integrar cualquier aplicación basada en .NET con Axapta Object Server (AOS). Por tanto, un servicio web, formulario web o cualquier otro tipo de aplicación de escritorio basada en .NET podrá interactuar directamente con AOS. Solamente tendremos que agregar una referencia a una dll al proyecto de Visual Studio que queramos que tenga acceso a Axapta. ¡Esta librería abre un sinfín de capacidades!

Cómo hacerlo:

La librería Microsoft.Dynamics.BusinessConnectorNet.dll está en el disco duro de un equipo con el cliente AX instalado (me baso en AX 2009). Para habilitar que el proyecto pueda interactuar con AX tendremos que copiar este archivo y pegarlo en el ordenador donde esté instalado el entorno de desarrollo (en este caso Visual Studio). Después, desde el proyecto que queremos desarrollar, habrá que agregar la referencia a esta dll y... ¡ya podemos comenzar! Esto significa que no es necesario tener el cliente AX instalado en el equipo que se utilizará como entorno de desarrollo (el entorno que se puede ver aquí no tiene cliente AX). Lo que no he podido probar es si funciona correctamente la ejecución desde un entorno sin cliente AX instalado (solamente con la dll). Si alguien lo sabe y quiere dejar un comentario, será bienvenido.

Puede que por cambios en la versión, la biblioteca Microsoft.Dynamics.BusinessConnectorNet.dll no esté en la ubicación que detalla este artículo (artículo en el que se basa este post). Recomiendo hacer una búsqueda en C:\ en un equipo que tenga el cliente AX. Ya sé que normalmente uno se siente más orgulloso encontrándolo por sí mismo, pero la utilidad "buscar" ahorra mucho tiempo.

Ahí va el ejemplo:

  1. Crear un proyecto web vacío. Archivo > nuevo > proyecto, seleccionar Visual C# > web. En la lista de la derecha seleccionar aplicación Web vacía de ASP.NET. Establecer ubicación y demás a gusto de cada uno.
  2. Localizar la dll en un ordenador con el cliente AX instalado y pegarla en cualquier recurso local de nuestro equipo. No es necesario que sea una carpeta dentro del proyecto, en el caso de un proyecto web (el que nos ocupa) VS copiará la dll en la carpeta Bin al crear la referencia.
  3. Agregar la referencia del proyecto a la dll. Botón derecho en carpeta References > agregar referencia. Pestaña examinar, buscarla y aceptar.

  4. Hacer una compilación por si hubiera algún problema.

El compilador debería compilar sin errores ni advertencias. Si aparece un warning del tipo "Generación de ensamblado -- El ensamblado al que se hace referencia 'Microsoft.Dynamics.BusinessConnectorNet.dll' tiene como destino un procesador distinto" con toda probabilidad será porque la dll del business connector es de 64 bits y la plataforma de destino es de 32 bits o al revés. Bastará con poner la plataforma de destino del proyecto a ANY CPU, establecer el destino al mismo valor que la dll (32 o 64 bits), u obtener una dll de una instalación en un cliente con la misma configuración de destino que el entorno de desarrollo (desconozco al 100% si en una instalación de cliente de 32 bits la librería generada será de 32 bits).

Mucho cuidado estas configuraciones. Hay que tener en cuenta la configuración del servidor donde corre IIS, la configuración del grupo de aplicaciones de IIS y ajustar las propiedades en consecuencia para que todo funcione correctamente. Recordad que las últimas versiones de IIS permiten establecer la compatibilidad con aplicaciones de 32 bits aunque IIS esté corriendo en un entorno de 64 bits.

En este momento ya se podría crear un formulario web, un informe, una página con formularios, etc. El proceso sería el mismo para un proyecto de aplicación de escritorio.

Ahora que ya tenemos el proyecto vinculado y compila correctamente, crearemos el servicio web:

Botón derecho en el proyecto > Agregar > nuevo elemento. Seleccionar C# > web en la lista izquierda, Servicio Web en la lista derecha y agregar. En el ejemplo dejaremos el nombre por defecto.

Ha llegado el momento de codificar. Naturalmente la calidad del código es muy cuestionable, solo es un ejemplo! Y sí, faltaría un control de excepciones más elaborado (de hecho no hay). Y sí, habría que cambiar el espacio de nombres tempuri.org.

El ejemplo consiste en retornar el apellido de un cliente a partir de un código facilitado por un parámetro. Si el cliente no existe retornaremos una cadena vacía.

        [WebMethod]
        public string dameNombreCliente(string codigoCliente)
        {
            //Un guiño a los habituales de VB, seguro que les gusta que
            //la variable de retorno se llame igual que el nombre de la función ;)
            string dameNombreCliente = "";
            Microsoft.Dynamics.BusinessConnectorNet.Axapta DynAx =
                 new Microsoft.Dynamics.BusinessConnectorNet.Axapta();
            Microsoft.Dynamics.BusinessConnectorNet.AxaptaRecord DynRec;
            //configuración se peude dejar en blanco... funciona!
            DynAx.Logon("Empresa", "Idioma", "Servidor", "");
            DynRec = DynAx.CreateAxaptaRecord("CustTable");
            //El * se puede mejorar, pero lo dejo para así ver
            //cómo se puede acceder a una columna concreta en un conjunto que contiene más de una
            DynRec.ExecuteStmt("Select * from %1 where %1.AccountNum == '" + codigoCliente + "'");

            if (DynRec.Found)
            {                
                dameNombreCliente = (string)DynRec.get_Field("Name");
            }
            return dameNombreCliente;
        }   

Para que funcione habrá que cambiar los literales de empresa, idioma y servidor de objetos. Como se indica en el comentario del código. La configuración puede dejarse en blanco.

Momento de publicar el servicio web:

Como mi ordenador es de 32 bits y el cliente lo tengo instalado en un servidor de 64 (los medios son los que son), tendré que subir el proyecto web al servidor (64 bits) para que funcione.

No entraré en detalles sobre cómo hacerlo, ya que no es el objeto de este post, sin embargo resulta muy fácil: copiar y pegar los archivos del proyecto en la carpeta raíz de una aplicación web. Algunos archivos sobran, pero eso ya es conocimiento de .NET y publicar aplicaciones web en los que no voy a entrar.

De todos modos no me cuesta nada hacer un pantallazo con los archivos seleccionados (hoy me siento generoso ;) ). ¡Estos son los archivos y directorios estrictamente necesarios para publicarlo a un servidor web!

Podéis llegar a ellos directamente haciendo clic con el botón derecho en el proyecto web > abrir ubicación en Explorador de Windows.

A partir de aquí ya tenemos el servicio web disponible en nuestro servidor IIS.

Si queremos utilizar el de desarrollo integrado en VS bastará con presionar CTRL+F5 o F5 y utilizar la URL que obtendremos al abrirse el explorador o desde el icono del servidor de desarrollo de la barra de tareas. Con esa URL agregaremos la referencia al servicio web en un proyecto de pruebas más adelante. Tened en cuenta que cada vez que se levanta el servidor de desarrollo integrado el puerto puede variar, por lo que tendréis que cambiar la referencia al servicio web cada vez que eso ocurra. Tampoco he probado que de esta forma funcione, no aseguro nada.

Si al arrancar el servidor de desarrollo de VS o al intentar acceder al webservice por URL desde un navegador nos encontramos un error como este: "No se puede cargar el archivo o ensamblado 'Microsoft.Dynamics.BusinessConnectorNet' ni una de sus dependencias. Se ha intentado cargar un programa con un formato incorrecto." Lo más probable es que las compilaciones de las dll no tengan la misma plataforma de salida en lo que a aplicación de 32 o 64 bits se refiere. Esto tiene que ver con el warning que hemos comentado antes, pero aunque la compilación sea sin warnings la ejecución con dll's de distinta plataforma puede ser un problema. A mí me compila sin warnings, pero al ponerlo en marcha en el servidor de desarrollo de VS me da este error. Por este motivo subo el proyecto a un servidor de 64 bits y he establecido a ANYCPU el proyecto web (como comentaba antes).

Compruebo que todo arranca. Pongo la URL en el navegador y todo va bien (o eso parece). Es recomendable guardarse la URL en el portapapeles, se utilizará para agregar la referencia al servicio web más adelante.

Ahora llega el momento de probar el código del servicio web. Del código anterior solamente he cambiado las tres variables que he dicho antes de subirlo al servidor IIS (podéis creerme)!

Agregamos nuevo proyecto para pruebas.

  1. Puede ser un proyecto con entorno gráfico, pero en las películas los informáticos buenos salen utilizando una línea de comandos y tecleando a todo trapo, así que como somos buenos agregaremos un proyecto de aplicación de consola:
  2. Agregaremos la referencia al servicio web. References > agregar referencia de servicio… cuidado que antes lo hemos hecho en agregar referencia…
  3. Y esta pantalla os la dejo a vuestra disposición. Se trata de proporcionar la URL del servicio web para su descubrimiento y para poder trabajar con la referencia (si habéis leído atentamente y me habéis hecho caso antes, la tendréis en el portapapeles y solo tendréis que pegarla! :PPP). Quienes utilicéis el integrado de VS tendréis una URL con un puerto que puede cambiar! Así que cuando volváis a levantar el servidor integrado puede que tengáis que cambiar la referencia al servicio web.
  4. El método main de la clase Program quedará de la siguiente manera:
class Program
    {
        static void Main(string[] args)
        {
            ServiceReference1.WebService1SoapClient cliente = new ServiceReference1.WebService1SoapClient();
            Console.WriteLine(cliente.dameNombreCliente("CodigoCliente"));
            Console.Read();
        }
    }

En la cadena "elcodigoDelCliente" poner algo creíble, como un código de un cliente que exista (más que nada porque si no, nos quedamos sin ejemplo!)

Ya solo queda establecer el proyecto de consola de aplicación como proyecto de inicio. Botón derecho sobre el proyecto > establecer como proyecto inicio

En este caso he utilizado mi código de cliente. Ahora ya solo queda pulsar F5, cruzar los dedos, y si todo está bien puesto, debería salir el nombre del cliente que se corresponde con el código…..

Y voila...

Ya tenemos un servicio web interactuando con un AOS. A partir de aquí se pueden integrar muchas más aplicaciones y casi cualquier cosa que se nos ocurra.

A partir del artículo original podréis encontrar mucha más información.

Espero os haya sido útil!

Tags:

Categorías: ASP.NET | Axapta | How to | Programación y desarrollo

No se aceptan más comentarios

Entradas por mes