Artículo
· 26 jun, 2023 Lectura de 9 min

IrisSAP Connector (Español)

 

¡Hola Comunidad!

¿Habéis tenido que conectar alguna vez IRIS con un sistema SAP?

Tuve que enfrentarme al reto de conectar InterSystems IRIS con SAP, y una vez más pude comprobar el gran acierto que hizo InterSystems añadiendo la posibilidad de ejecutar código nativamente de Python desde IRIS.

Esto me hizo la integración muy fácil gracias a la librería  pyrfc.

Con esta librería, fui capaz de realizar llamadas a RFC's de SAP (Remote Function Call) desde una clase de IRIS y recibir datos de la base de datos de SAP.

Pero.., ¿qué es una RFC?

RFC es un protocolo de comunicación usado por SAP. Permite la interacción entre diferentes sistemas SAP o no SAP. También permite a aplicaciones externas comunicarse con el sistema SAP y acceder a las funciones y datos disponibles.

Cuando una RFC es ejecutada, una aplicación externa envía una petición sobre la red al sistema SAP. El sistema SAP recibe la petición, la procesa, y devuelve la respuesta con el resultado o datos a la aplicación externa.

RFC se puede usar para tareas de integración, ejecución de programas y recibir información desde SAP.

En resumen, una RFC de SAP es una llamada remota a una función o servicio disponible en un sistema SAP que permite la comunicación y el intercambio de información entre sistemas, sistemas externos o aplicaciones.

Finalidad del artículo:

Me he decidido a escribir este artículo para describir los pasos que he seguido y el resultado recibido por si alguno se ve en la misma situación poder facilitarle la tarea.

También he publicado una aplicación en el OpenExchange (link) con casi todo lo necesario para arrancar el Docker y conectar con el sistema SAP.

¿Porqué digo casi todo?. Para poder conectar con un servidor SAP, necesitamos descargar el SAP NetWeaver RFC SDK. Por desgracias, está protegido por copyright, y, por este motivo, no puedo compartir los fichero con vosotros. Por lo que si queréis descargar el SDK de la página de SAP debéis tener un usuario de tipo "S".

La aplicación del OpenExchange está lista para descargar, añadir los ficheros del SDK, configurar la conexión con el servidor SAP y ejecutar.
 

¿Te interesa?, Genial, pues vamos!!

Pasos para descargar SAP NetWeaver RFC SDK:

Una vez tengamos nuestro usuario tipo "S" (Si no tienes un usuario tipo "S" pide a tu administrador del sistema SAP que te facilite uno), debemos entrar en el siguiente  link.

Hacemos clic en el link con las instrucciones de descarga:

Después, clic en el link de descarga de los ficheros:


 

Finalmente, clic en “SAP NW RFC SDK 7.50”



Elegimos Linux X86_64 Bit version (si tienes planeado usar mi aplicación del OpenExchange con Docker) y hacemos click en el botón "descargar":

Añadiendo los ficheros SAP NetWeaver RFC SDK a el projecto:

Cuando tengamos descargados y descomprimidos los ficheros, debemos copiar el contenido de la carpeta "nwrfcsdk" dentro de la carpeta "nwrfcsdk" del proyecto.


Explicación de los archivos auxiliares y el Dockerfile:

El fichero "nwrfcsdk.conf" debe contener la ruta donde los ficheros SDK van a ser copiados. Si no tienes pensado cambiar la ruta no es necesario modificar nada.

El fichero Dockerfile ya incluye el código necesario para descargar e instalar las librerías necesarias para realizar la conexión:

 

Lo que hace es copiar el fichero "nwrfcsdk.conf", el contenido de la carpeta "nwrfcsdk" y el fichero "sapnwrfc.cfg" (este fichero lo explico luego) dentro del Docker.

También instala las librerías de Python:

  • pyrfc: se usa para ejecutar las RFC de SAP
  • configparser: se usa para leer los parámetros de la conexión almacenados en el fichero de configuración sapnwrfc.cfg

 

Configurando la conexión con el servidor SAP:

Para conectar con el servidor SAP, debes completar la información requerida en el fichero "sapnwrfc.cfg".

Si no tienes la información, pero puedes entrar en tu servidor SAP, sigue los siguientes pasos para encontrarla. Si no tienes acceso al servidor SAP, deberás preguntarle al administrador del sistema SAP la información.

Obtener la información de conexión desde el servidor SAP:

Las capturas de pantalla puede variar en función de si estás usando SAP GUI (usuarios Windows) o SAP GUI for JAVA (usuarios macOS y Linux). En mi caso, es SAP GUI for JAVA.

1 - Entra en SAP GUI y elige tu servidor. Después, haz click en el botón conectar:

 

2 - Introduce tu usuario y contraseña y aprieta "Enter" o haz clic en el botón aceptar:

 

3 - Una vez estés dentro del sistema, ve a la barra de menús y selecciona "System" y después la opción "Status" en el desplegable:

 

En esta ventana, tu puedes obtener la siguiente información:

  • El valor del campo "Client" para la propiedad "client" del fichero de configuración.
  • El valor del campo "User" para la propiedad "user" del fichero de configuración (En este caso, mi usuario del sistema SAP y el de RFC es el mismo. Aunque para entornos de producción, es recomendable usar usuarios diferentes).
  • El valor del campo "Host" para la propiedad "ashost" del fichero de configuración. (Puede ser un nombre de equipo o una dirección IP).
  • En el caso de que tu usuario para RFC sea el mismo que el del sistema SAP, debes usar la misma contraseña en la propiedad "passwd" del fichero de configuración.


Si tienes problemas con la conexión, comprueba la información con tu administrador de sistemas de SAP que tu usuario tiene permisos para ejecutar RFC's.

Una vez tengamos los pasos listos, estamos listos para empezar!!.
 


 

Comprobando la conexión con SAP

Para comprobar la conexión con SAP, puedes ejecutar el metodo TestConecction del la clase RFC.RFCUtil.cls

ClassMethod TestConnection() [ Language = python ]
{
 try:
   # Import python libraries
   from pyrfc import Connection, ABAPApplicationError, ABAPRuntimeError, LogonError, CommunicationError
   from configparser import ConfigParser


   # Connect to the SAP Server
   config = ConfigParser()
   config.read('/opt/irisapp/sapnwrfc.cfg')
   params_connection = config._sections['connection']
   conn = Connection(**params_connection)


   # Launch RFC call to STFC_CONNECTION
   result = conn.call('STFC_CONNECTION', REQUTEXT=u'Hello SAP!')


   # Close the connection
   conn.close()


   # Print the result
   print(result)


 except Exception as e:
   print(e)
 }

 

Si todo va bien, deberíais ver un mensaje en la consola como este:

 

(Si recibes un error por favor comprueba la información del fichero "sapnwrfc.cfg".)


Como puedes ver, la manera de ejecutar una RFC es muy fácil:

1 - Conectamos con el servidor SAP

2 - Ejecutamos el metodo conn.call('Nombre de la RFC a ejecutar', Parametros RFC)

3 - Cerramos la conexión

4 - Procesamos el resultado

En este ejemplo, el único parámetro admitido es un String, y lo hemos enviado como un parámetro del tipo REQUTEXT.

Consultar la información de una tabla de SAP

Ahora vamos a llamar a la RFC "RFC_READ_TABLE" que nos permite leer una tabla de SAP.

ClassMethod GetDataTableSFLIGHT() [ Language = python ]
{
  try:
    # Import python libraries
    from pyrfc import Connection, ABAPApplicationError, ABAPRuntimeError, LogonError, CommunicationError
    from configparser import ConfigParser


    # Connect to the SAP Server
    config = ConfigParser()
    config.read('/opt/irisapp/sapnwrfc.cfg')
    params_connection = config._sections['connection']
    conn = Connection(**params_connection)


    # Define query parameters
    params = {
        'QUERY_TABLE': 'SFLIGHT',
        'DELIMITER': ',',
        'FIELDS': [
            {'FIELDNAME': 'CARRID'},
            {'FIELDNAME': 'CONNID'},
            {'FIELDNAME': 'FLDATE'},
            {'FIELDNAME': 'PRICE'}
        ],
        'OPTIONS': [],
    }


    # Call to función RFC 'RFC_READ_TABLE'
    result = conn.call('RFC_READ_TABLE', **params)


    # Process results
    if 'DATA' in result:
        data = result['DATA']
        fields = result['FIELDS']
       
        # Imprime los nombres de campo
        for field in fields:
            print(field['FIELDNAME'], end='\t')
        print()
       
        # Imprime los datos
        for entry in data:
            values = entry['WA'].split(',')
            for value in values:
                print(value, end='\t')
            print()
    else:
        print('No data found.')


    # Close SAP connection
    conn.close()


  except CommunicationError:
    print("Could not connect to server.")
    raise
  except LogonError:
    print("Could not log in. Wrong credentials?")
    raise
  except (ABAPApplicationError, ABAPRuntimeError):
    print("An error occurred.")
    raise
  except Exception as e:
    print(e)
}


Para este ejemplo, hemos pasado como parámetro una variable tipo estructura con la siguiente información:

QUERY_TABLE: Es la tabla que queremos consultar  (SFLIGHT tabla demo de vuelos de SAP)

DELIMITER: Nos permite elegir el separador

FIELDS: Son las columnas que queremos consultar, en este caso estoy consultado CARRID (Id de la compañia), CONNID (Id conexión de vuelo), FLDATE (fecha del vuelo), y PRICE (precio del vuelo).
 

Una vez ejecutado, podemos procesar la respuesta y imprimirla por pantalla o lo que queramos hacer con ella... xD.

Finalmente, cerramos la conexión.

Si todo ha ido bien, deberíais ver algo parecido a esto en la consola:

Consultando datos de una tabla filtrando:

Este va a ser un ejemplo un  como mas complejo, vamos a consultar la tabla de clientes para obtener los datos de un único cliente filtrando por su id.

ClassMethod GetDataCustomer(clientSapID As %String) [ Language = python ]
{
 try:
   from pyrfc import Connection, ABAPApplicationError, ABAPRuntimeError, LogonError, CommunicationError
   from configparser import ConfigParser


   config = ConfigParser()
   config.read('/opt/irisapp/sapnwrfc.cfg')
   params_connection = config._sections['connection']
   conn = Connection(**params_connection)


  # Define the parameters
   params = {
     'QUERY_TABLE': 'KNA1',
     'DELIMITER': ',',
     'FIELDS': [{'FIELDNAME': 'KUNNR'}, {'FIELDNAME': 'SORTL'}, {'FIELDNAME': 'TELF1'}],
     'OPTIONS': [{'TEXT': "KUNNR = '" + clientSapID + "'"}],     
 }


 # Call the RFC 'RFC_READ_TABLE' to obtain the data
   result = conn.call('RFC_READ_TABLE', **params)


 # Process the result
   if 'DATA' in result:
     data = result['DATA']
     fields = result['FIELDS']
    
     # Print the fields names
     for field in fields:
         print(field['FIELDNAME'], end='\t')
     print()
    
     # Print the data fields.
     for entry in data:
         values = entry['WA'].split(',')
         for value in values:
             print(value, end='\t')
         print()
   else:
     print('No data found.')


 # Close the connection
   conn.close()


 except CommunicationError:
   print("Could not connect to server.")
   raise
 except LogonError:
   print("Could not log in. Wrong credentials?")
   raise
 except (ABAPApplicationError, ABAPRuntimeError):
   print("An error occurred.")
   raise
 except Exception as e:
   print(e)
}


Parámetros:

QUERY_TABLE: Es la tabla que queremos consultar (KNA1 es la tabla de clientes en SAP)

DELIMITER: Nos permite elegir el separador

FIELDS: Son las columnas que queremos consultar, en este caso estoy consultando KUNNR (id de cliente SAP), SORTL (nombre corto cliente), y TELF1 (Teléfono del cliente).

OPTIONS: Es el filtro que queremos aplicar a la consulta. En este caso, estamos filtrando por el id de cliente recibido por parámetro en el metodo.

Una vez ejecutado, podemos procesar la respuesta e imprimirla por pantalla o lo que queramos... xD.

Finalmente, cerramos la conexión.

Si todo ha ido bien, deberíamos ver algo similar a esto:

Esto es solo el principio ya que gracias a las llamadas RFC, podemos no solo realizar operaciones de creación, lectura, actualizado, y borrado, también podemos ejecutar cualquier código de SAP (estandard o personalizado)  expuesto por una RFC, programas, modulos de funciones, etc... RFC se no solo se usa para leer o escribir datos, también se puede usar para ejecutar programas o funciones.

Espero que algún día si os veis en la situación de integrar InserSystems IRIS con SAP, este artículo pueda seros de ayuda.

Si tenéis cualquier duda, por favor escribidme en los comentarios e intentaré ayudaros.

¡Muchas gracias por leerme!!
 

Link a la aplicación en OpenExchange: https://openexchange.intersystems.com/package/IrisSapConnector

Link al repositorio: https://github.com/daniel-aguilar-garcia/IrisSapConnector/blob/main/sapnwrfc.cfg

Link a la librería pyrfc: https://sap.github.io/PyRFC/

 

Comentarios (1)2
Inicie sesión o regístrese para continuar