martes, 8 de enero de 2013

Usar DataSets .NET desde AX2012

En las devoluciones de los servicios web, lo normal es devolver datos primitivos (string, int32, array de strings) , así hacemos un servicio compatible con diferentes plataformas.


Para devolver “tablas” de datos, y si la lógica la tenemos en .NET, nos puede ser más cómodo devolver datasets, pero tenemos el inconveniente de estar “complicando” a clientes que no sean .NET.

Por ejemplo, para consumir un servicio web que devolvía un DataSet de .NET en versiones anteriores de Axapta, teníamos que crearnos un clase que nos parseara el dataset a un contenedor. (Un servicio web SOAP devuelve XML)

En esta versión se incluyen unas librerías que nos simulan el ADO, con lo que podemos manipular el dataset “casi” igual que desde .NET. (con algo más de “fontanería”)

¿Un ejemplo?

Partiendo del artículo anterior, prepararemos un proyecto que haga referencia a un servicio web que devuelva un dataset.

Luego, nos crearemos un job que use ese proyecto.


Podemos recuperar los datos según el nombre de la columna, o por índice de columna.

Un saludo.

Consumir servicios web desde AX2012



Tenemos unos servicios webs ya creados y queremos consumirlos dentro de AX2012.

Para ello, crearemos un proyecto “dll” con las referencias web que queramos usar, y ese proyecto lo añadiremos al AOT y podremos usar sus servicios web desde X++.

Añadiendo un proyecto VS a AX2012

En VS2010, creamos un proyecto de tipo “Biblioteca de clases”,y añadiremos las referencias web que queramos usar.



En mi caso, quiero consumir servicios web SOAP creados en .NET 2.0 (no servicios WCF).  Debemos de agregar la referencia web de esta forma:







Con esto, tendremos un proyecto de biblioteca de clases que hace referencia a un servicio web.




Si quisiérais hacerlo con un servicio WCF, el procedimiento debería ser el mismo, salvo que en la ventana “agregar referencia de servicio” deberíamos escribir la url del servicio WCF, y el servicio se crearía en el nodo Service Reference en vez de Web Reference

Una vez añadidos los servicios que queremos usar, debemos añadir este proyecto al AOT.

Para ello, botón derecho en el proyecto y “Añadir proyecto al AOT”.


Si nos vamos al AOT en AX2012, podemos ver en Visual Studio Projects / C Sharp Projects, el proyecto que hemos creado anteriormente.


Añadiendo un nuevo servicio web
Si queremos añadir un nuevo servicio al proyecto creado anteriormente, no hace falta que lo tengamos creado ya que está integrado en el AOT. 

Nos vamos al proyecto que contiene los web services, botón derecho > Editar.
Se nos abre el VS2010 con el proyecto cargado, añadimos las referencias que queramos añadir, y compilamos el proyecto.
Hecho este paso, en el AOT, si restauramos el proyecto, ya nos debe de aparecer el nuevo servicio.

Modificación de un servicio web
Añadir un proyecto al AOT, lo que hace es crear un código “proxy” dentro de AX2012 para que se pueda usar desde X++. Esa clase proxy va mapeada a llamadas a la DLL, que dentro tienen otra clase proxy con llamadas al web service SOAP.
Si cambia el Web Service, se rompen esos mapeos y da error. Para ello, hay que actualizar el proxy de dentro del proyecto DLL.
Para ello, editamos el proyecto  (Visual Studio Projects > C Sharp Projects > Proyecto de WS > botón derecho > Editar )
Nos situamos sobre el proxy que queremos actualizar, y botón derecho > actualizar referencia web. Este paso vuelve a generar el proxy.



Compilamos y cerramos proyecto.

Consumiendo el servicio web

Para consumir el proyecto, relizaremos el ejemplo con un job.





Mediante el método set_Url, podemos cambiar la URL del servicio, por lo que nos permite tener webservices de producción y de prueba.


En el siguiente artículo, pondré un ejemplo de cómo recuperar información de DataSets de .NET dentro de X++.
Espero que os sirva este ejemplo. Un saludo.