Hace un par de días que he empezado a mirarme un poco el módulo Commerce – Gateway que incorpora Axapta. Ya sabéis, para intercambiar documentos y datos de forma electrónica entre compañías distintas o centrales y sucursales … etc.
Como es un tema un poco extenso, en el truco de hoy vamos a tratar las entradas de datos a nuestra aplicación Axapta. Dejo para siguientes entregas el tema del envío de datos desde nuestra aplicación hacia el exterior.
La base de todo es el XML
Cuando estamos hablando de intercambio de datos de forma electrónica entre organizaciones … ¿que mejor que usar el sistema por excelencia para estos menesteres?
Pues bien, esta es precisamente la base del sistema del Commerce gateway.
Vamos a usar XML para definir la estructura de los datos que podemos recibir/enviar, incluyendo restricciones del tipo de datos opcionales, obligatorios … y otras validaciones.
De la misma forma vamos a usar XML para lo que serán los propios ficheros de intercambio de datos que deberán estar basados en la estructura anterior.
Normalmente se suele utilizar Biztalk Server como intermediario y motor del flujo de intercambio entre organizaciones, más o menos siguiendo este diagrama : (extraído de un documento de Navision sobre Commerce Gateway para Axapta 2.5)
Para realizar nuestro ejemplo vamos a simplificar todo esto prescindiendo del Biztalk Server y de la parte Web.. Digamos que vamos a centrarnos puramente en la parte de importación de los datos recibidos más que en como recibimos esos datos (abordable en futuras entregas)
En fin … vamos al grano
Definición de datos principales
Hemos comentado que los ficheros XML vienen y van entre organizaciones. De alguna forma debemos informar a Axapta donde puede encontrar o a través de que sistema le envían los ficheros XML que debe incorporar.
Vamos a crear un método de transporte :
Nos dirigimos al menú Base / Configurar / Gateway / Métodos de transporte
Y creamos nuestro nuevo método, le damos el nombre que deseemos, una descripción y le indicamos que la línea de comunicación será a través de Archivo.
A continuación nos dirigimos a la solapa Configurar y informamos un directorio de entrada desde el que más tarde leeremos los archivos de datos en formato XML.
Ahora definiremos una organización :
Esta organización será un cliente que nos enviará la información necesaria para que creemos un pedido de venta.
Nos dirigimos al menú organizaciones y creamos una nueva.
Le damos un código, un nombre y le asociamos el método de transporte predeterminado de entrada y de salida.
Luego pulsamos el botón referencias e informamos que la organización org001 será nuestro cliente “X”.
Bien, ya sabemos quien nos enviará datos y en que carpeta encontraremos estos datos. Pero … juraría que nos falta algo … mmm …. Ah!!! Claro!!!
Los Datos
Vamos a explicar por encima en que se basa el sistema de definición de datos de intercambio pero por cuestión de tiempo y extensión del artículo, acabaremos incorporando un juego de datos de ejemplo que viene con Axapta.
Como hemos comentado, definiremos la estructura de los datos en un archivo XML incluyendo diversas validaciones, listas de valores posibles, organización de los distintos registros que pueden llegar en un mismo fichero XML … etc.
En este fragmento de esquema definimos un elemento llamado “ExBaseItemDetail” que contendrá información básica acerca de la especificación de un artículo en una línea de pedido. El código del artículo, Descripción, Cantidad …
Si a continuación escribimos :
Estamos definiendo los tipos de datos de cada uno de los elementos del esquema anterior, además estamos encapsulando una estructura compleja en el elemento “ExQuantity” indicando que consta de Cantidad y Unidad de medida.
Y así sucesivamente.
A continuación el esquema de ejemplo que viene en la documentación del Commerce Gateway para Axapta 2.5 para incorporar pedidos de venta.
Esto es un pedido de ejemplo, es decir, así nos llegarían los datos
Vamos a crear el esquema en Axapta.
Para definir un esquema XML en Axapta debemos tener una estructura de clases acorde con el esquema que deseamos definir. Estas clases no se usan mas que como almacen temporal de datos durante el proceso de interpretar un XML recibido.
Por defecto vienen definidas un par de clases para esquemas XML bastante completos de Pedidos de venta y facturas, pero son realmente complejas … demasiado para nuestro ejemplo
Podéis echarles una ojeada, ya que en teoría son las que se deberían usar en realidad para intercambiar pedidos y facturas, ya que contemplan muchísimos casos. Son XCBLOrder y XCBLInvoice.
Hemos guardado el esquema anterior en una carpeta del disco como “ExOrder.xml”.*
*Nota : En realidad no es necesario que guardéis el esquema, ya que, podéis usar el que viene en el CD de Axapta como explico más adelante.
Ahora nos vamos al menú Esquemas y creamos uno nuevo.
En dirección Web le ponemos “file://c|/temp/cgateway/ExOrder.xml” para indicar que nuestro archivo está en “C:\temp\cgateway\ExOrder.xml”.
En Nombre del Esquema ponemos ExOrder, ya que es el nombre que le hemos dado al esquema en la línea de nuestro ExOrder.xml :
XML:
<ElementTypename="ExOrder"content="eltOnly">
Ahora vamos a la solapa trazar y …
Nos aparece la estructura que tenemos definida en el XML a la izquierda en forma de árbol.
En esta pantalla debemos asociar cada uno de los nodos del árbol con clases y métodos que tenemos creados en Axapta y se encargarán de almacenar los datos que reciban.
¿Y que clases son esas?
Ya hemos comentado que Axapta incorpora “de serie” todo un sistema para poder realizar intercambio de pedidos y facturas. Para ello incorpora toda una estructura compleja de clases. Las XCBL…
Pero para nuestro ejemplo importaremos un paquete “demo” que viene con Axapta.
Cerramos de momento nuestra pantalla de esquemas y vamos a crear las clases que necesitamos.
En el CD de Axapta 3.0 encontramos una carpeta llamada “Import Data / Commerce Gateway / Demo Data”.
Lo primero que debemos hacer es importar las clases necesarias, por tanto … desde el AOT importamos el archivo ExOrder.xpo.
Este proyecto incorpora clases para 2 tipos de ejemplo, uno simple con tan solo 2 clases una para cabecera de pedido y otra para líneas y un segundo ejemplo más complejo con más clases anidadas. Por supuesto … vamos a usar el más simple
Ya tenemos las clases, ahora volvemos a la pantalla de esquemas y vamos a asociar el esquema a nuestras clases :
Deberíamos asociar :
El primer nodo es el más sencillo : ExOrder asociado a la clase de grupo EX1Order.
Luego vamos desplegando los nodos del árbol y vamos asociando a las propiedades métodos de la clase que nos almacenen los valores necesarios (Ordernumber, OrderDate …)
Tened en cuenta que únicamente asociaremos los nodos “finales” del arbol (es decir, las hojas) ya que el ejemplo de clases que estamos usando es muy simple y ha encapsulado todo en un solo nivel. Si usáramos otro ejemplo seguramente deberíamos asociar cada uno de los nodos a otras subclases … etc.
El único caso de encapsulamiento lo tenemos en las líneas del pedido. Es decir, en el nodo ExItemDetail :
En este nodo debemos asociar como clase de grupo la subclase Ex1ItemDetail y como método del valor la función ExItemDetails de la clase Ex1Order.
Si miramos la estructura de las clases de ejemplo que hemos importado, observaremos que la función ExItemDetails de la clase Ex1Order nos devuelve una lista de elementos de tipo ExItemDetails. Pues eso es precisamente lo que indicamos aquí, que puede haber n elementos en este nodo. Podéis ver en el apartado “Información” del nodo XML como indica que “MaxOccurs = *” y “MinOccurs = 1” lo que significa que puede haber como mínimo 1 elemento en la lista (1 línea del pedido como mínimo) y como máximo N.
Esto tiene su lógica, un pedido puede tener entre1 y N líneas de detalle de artículo, cantidad, precio ... etc.
Nota : Cuidado con el editor, tiene malas bromas. A mi me ha sucedido varias veces, salir del formulario después de haber asociado todos los nodos y al volver a entrar . Ya no había nada. Ir dándole al disquete por si las flys
Bien, ya tenemos todos los nodos asociados, ¿y ahora que?
Ahora vamos de nuevo a la organización para asociarle una acción.
Abrimos la pantalla de organizaciones, botón Acciones posibles y :
Aquí le estamos diciendo que la organización org001 usará el esquema TrucosAX para la acción “Pedido de venta”.
Las acciones posibles son unas que vienen predeterminadas. Podemos echarle un vistazo al método InitDefaultData de la tabla SysAction. Allí encontraremos como añaden acciones al sistema y veremos que hay algunas desactivadas. Supongo que si queremos añadir las nuestras … pues habrá que tocar ese método, pero de momento … no es el caso.
Una vez tenemos la acción añadida a la lista de acciones posibles de nuestra organización, podemos entrar a configurar dicha combinación (acción, esquema).
Le damos a configurar y …
Nos aparece una pantalla en la que básicamente podemos indicar que tipo de codificación y conversiones usaremos para aquellos datos susceptibles de tener varias interpretaciones, como por ejemplo … el código de artículo.
Ejemplo : Cuando nos llega un fichero XML con un pedido, es posible que los artículos vengan codificados según el código que les da el cliente y no el nuestro. En ese caso vendríamos a tocar el tratamiento de códigos de artículo en esta pantalla para indicar que use la conversión apropiada.
De todas formas, para el ejemplo de hoy … vamos a prescindir de todo esto, ya que como veréis al final, para esta primera parte del truco de “Commerce Gateway : Entradas” no vamos a necesitar esta configuración.
Creo que ya está todo …
Importación de un fichero de muestra
Como ya hemos comentado, normalmente se usa Biztalk para realizar la entrada/salida automática de los ficheros, pero para nuestro ejemplo … mejor no nos liamos más y vamos a hacerlo fácil
Guardamos el fragmento de XML de datos que he pegado más arriba que corresponde a un pedido de prueba. Lo ponemos en una carpeta y lo nombramos “pedidos.xml” por ejemplo.
Nota : Lo normal sería que la carpeta en la que lo guardemos sea la que hemos definido en los métodos de transporte al principio del truco.
Para realizar la entrada en la cola de proceso del Gateway he creado un job :
x++:
staticvoid TestEntradaGateway(Args _args) {
gatewayQueueCreate queueCreate;
xmldocument xml;
GateWayOrgId OrgId;
;
// Aquí le pongo una carpeta directamente, pero deberíamos buscar // en la tabla de métodos de transporte, la carpeta asociada al método // que queramos usar
xml = xmldocument::newFile('c:\\temp\\cgateway\\datos\\pedidos.xml');
// Nuestra organización
OrgId = 'org001';
Como veis esto (un poco más refinado) podemos ponerlo en un proceso por lotes para que cada X minutos compruebe si hay algún archivo nuevo en la carpeta de entradas y si es así lo importe (solo es una idea).
Si ejecutamos este job y da un mensaje como este :
La cosa ha ido bien
Ahora simplemente hemos incorporado el fichero a la cola de proceso del gateway.
La cola de proceso del Gateway
Para poder ver la cola de proceso del gateway vamos al menú “Base / cola de gateway”
Si miramos en los ficheros en estado retenido podremos ver el nuestro
Ahora vendría cuando cambiamos el estado a “En espera” y le damos a procesar, pero … para nuestra sorpresa, esto no haría nada en absoluto.
Me explico :
Tenemos el fichero incorporado en la cola, el esquema definido, etc … pero … falta crear una clase que haga la conversión de nuestras clases “recipientes” a pedidos reales (salestable y salesline).
Axapta incorpora las suyas propias creadas para los esquemas complejos que hemos comentado, podéis echarle un vistazo a la clase SalesXCBL2Order.
Esta parte la veremos en otra entrega , como pista os diré que la clase debe heredar de GatewayMapable2AX.
Si queréis “trastear” un poco … podéis crearos una clase que herede de GatewayMapable2AX, implementar el método parmMapableTop para que reciba una clase de tipo Ex1Order, y luego en la función convert podeis ejecutar la función Info de Ex1Order que nos mostrará el contenido de lo que hemos importado.
Pero esto ya es programación y lo abordaremos en el próximo truco
Hasta aquí esta primera parte, comentaros que en el CD de Axapta 3.0 podéis encontrar los esquemas complejos del commerce gateway que podéis importar y en teoría son los que se deben usar (almenos así, entre Axaptas, ya está el trabajo hecho).
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
Axapta y Dynamics Ax son marcas registradas de Microsoft corporation. Todos los logos y marcas son propiedad de sus respectivos propietarios. Excepto trucosAx.com que este si que es mio :-). (c) 2005 by Manel Querol (Mkz) TrucosAx.com no pertenece ni está asociada a Microsoft corporation. Los fragmentos de código y proyectos importables que aquí se muestren están realizados sobre bancos de pruebas. No nos hacemos responsables de cualquier daño o pérdida de datos que se pudiera originar del hecho de instalar alguno de estos ejemplos en un sistema productivo. Es responsabilidad del usuario ser consciente del impacto que puede ocasionar en sus aplicaciones el uso del código que de aquí extraiga.