Conector de Integración con SAP
Una integración con SAP se puede realizar con varios métodos, como puede ser por Base de Datos, con lo que utilizaríamos el conector de Base de Datos.
Sin embargo, el método más usual de realizar una integración es mediante funciones BAPI que dispone SAP, con lo que XOne dispone de un conector específico para conectarnos a dichas funciones.
El paso inicial es definir las conexiones para ambos puntos de la Interface. Para SAP, se usa el cliente RPC específico de SAP y en dependencia del tipo de Base de datos que se emplee para le aplicación XOne, se define también el acceso a la misma.
Existen dos tipos de traspasos de datos:
1 | en el sentido SAP-XOne |
2 | en el sentido XOne-SAP |
La diferencia desde el punto de vista de la interface radicaría en la forma de especificar el origen y el destino.
Si se cargan datos, el origen es una BAPI o FUNCTION de SAP y el destino la tabla de XOne.
Si por el contrario, la idea es enviar datos de XOne a SAP, el origen sería una consulta SQL en la que se construya toda la estructura necesaria, y el destino una FUNCTION SAP, que por regla debe tener definido un RETURN para indicar a la interfase si el registro ha sido correctamente recibido, o no, y de esta forma poder marcarlo como tal para que no se siga enviando indefinidamente.
El cuerpo de cada transformación es una serie de propiedades que indican que TABLA.CAMPO de la BAPI de SAP, se relaciona con el CAMPO de XOne de la tabla destino o del SQL definido.
Al final de la misma se puede describir un nodo after-action para controlar acciones de marcado, o actualizaciones en cadenas necesarias de acuerdo a las especificaciones del proyecto.
Fichero Intercliente.xml
HELP
<xml> <interface> Definición del nodo app y conexiones <app name="NOMBRE" timeaccess="false" logoper="true/false"> <dsn> <!-- Conexión cliente, en este caso consideramos que el cliente es SAP --> <client type="SAP" name="NOMBRE_SAP" user="USUARIOSAP" pwd="PWDSAP" ApplicationServer="IPSERVER" HostName="" Language="ES" Client="MANDANTESAP"/> <!-- Conexión origen, como ejemplo a una BD de XOne en SQLServer -- > <source type="sqlclient" name="NOMBRE_SQLSERVER" connstring="Data Source=NOMBRESERVER;User ID=sa;Initial Catalog=NOMBREBD" user="sa" pwd="PWDsql"/> <!-- Se puede definir otra conexión auxiliar para procesos específicos --> <borrados type="sqlclient" name="AUXILIAR_SQLSERVER" connstring="Data Source=NOMBRESERVER;User ID=sa;Initial Catalog=NOMBREBD" user="sa" pwd="PWDsql"/> </dsn> </app> <!— Transformaciones para leer datos SAP y actualizar la BD XOne --> <transforms type="client-to-source"> <!— Transformación ejemplo para la carga de usuarios --> <transform name="USUARIOS"> <!— tabla destino en BD XOnegen_usuarios, opcionalmente, se puede definir el RetryCall para especificar la cantidad de intentos que se desean en caso de que falle la ejecución --> <colldest-table="gen_usuarios"source-table="##SAPFUNCTION##" clean-source-keys="true/false" clean-dest-keys="true/false" RetryCall="2"> <!— Especificación de la BAPI de la que se leerán los datos --> <function name="Z_XONE_AUTOVENTAS"> <!— Pueden especificarse parámetros para la llamada como en este caso, si no se hace, pues se cargan todos los datos que devuelva la BAPI --> <paramname="NOMBREPARAMETRO" value="VALOR"/> </function> <data-condition> <client type="##ALL##"/> </data-condition> <!— Definición de los PROPs que indican el origen (TABLA.NOMBRECAMPO) desde el que se tomarán los datos y el destino (NOMBRECAMPO en la tabla destino), además del tipo de datos y el indicador de si será clave o no para la búsqueda del registro a actualizar --> <prop source-name="AUTOVENTAS.PERNR" dest-name="CODSAP" key="true"type="T" saved-source="true" saved-dest="true"> <oper type="copy"/> </prop> <prop source-name="AUTOVENTAS.VORNA" dest-name="NOMBRE" key="false" type="T"> <oper type="copy"/> </prop> …. <!-- Ejemplo para asignar un valor directamente, sin que venga de SAP --> <prop dest-name="ACTIVO" type="N"> <oper type="setval" value="1"/> </prop> <!-- Nodo after-action, para definer operaciones que se desean ejecutar una vez que han sido ejecutadas correctamentes las acciones anteriores --> <after-action> <action name="execute-query"> <param name="dest" value="UPDATE gen_usuarios SET BORRADO=3 WHERE (BORRADO=0 or BORRADO is null) AND ACTIVO=1"/> </action> </after-action> </coll><!—Fin de la colección > </transform><!— Fin de la transformación --> <!— Ejemplo que usa la conexión auxiliar para marcar registros XOne, tanto el source-table, como el dest-table hacen referencia a la BD de XOne . La definición de los PROPS sigue el mismo criterio que el ejemplo anterior --> <transform name="MARCADO_Usuarios" source-connection="borrados"> <coll source-table="SELECT ID,ACTIVO,BORRADO FROM gen_usuarios WHERE BORRADO=3 AND ACTIVO=1"dest-table="gen_usuarios"> <data-condition> <client type="##ALL##"/> </data-condition> <prop source-name="ID" dest-name="ID" type="N" key="true" saved-source="true" saved-dest="true"> </prop> <prop dest-name="ACTIVO" type="N"> <oper type="setval" value="0"/> </prop> ….. </coll> </transform> </transforms> <!— Fin de las transformaciones SAP-XOne --> <!— TransformacionesXOne-SAP --> <transforms type="source-to-client"> <transform name="Visitas"> <colldest-table="##SAPFUNCTION##" desc="VISITA" name="Visitas" commit="false" Source-table="SELECT TOP 100 vFROM gen_visitasvWHERE v.ACTUALIZADO=1 ORDER BY v.ID" > <!— Nombre de la BAPI SAP destino --> <function name="Z_XONE_VISITA_FALLIDA"> </function> <data-condition> <client type="##ALL##"/> </data-condition> <prop source-name="ID" type="N" key="true" saved-source="true"></prop> <prop source-name="USUARIO" dest-name="VISITA.PERNR" type="T" key="true"> <oper type="copy"/> </prop> …. <!— after-action para marcar cada registro que se envía a SAP y del cual se recibe el RETURN indicando que se ha ejecutado correctamente --> <after-action each-record="true"> <action name="execute-query"> <param name="source" value="UPDATE gen_visitas SET ACTUALIZADO=0 WHERE ##SOURCEKEYVALUES##"/> </action> </after-action> </coll> </transform> </transforms><!— Fin de las transformaciones XOne-SAP --> </interface> </xml>