martes, 31 de diciembre de 2013

Conectando la aplicación de .NET con SAP


 Conectado .NET con SAP

En una entrada anterior ya se dio una pequeña introducción sobre lo que es SAP y de las ventajas que puede llegar a tener. En esta ocasión se explicará brevemente cómo desde tu aplicación de .NET ejecutar una Llamada a Función Remota (RFC por sus siglas en ingles) de SAP.

Requisitos

Para este pequeño ejemplo vamos a necesitar lo siguiente:

  1. SAP .NET Connector 3.0 (se puede descargar aquí, es necesario estar registrado).
  2. Ambiente de desarrollo, en este caso utilizaremos Visual Studio 2010.
  3. Ambiente real de SAP con al menos una RFC creada.

Entendiendo la comunicación entre SAP y aplicación .NET

Antes de empezar a desarrollar nuestra pequeña aplicación, expliquemos un poco más a detalle sobre la RFC.

Una RFC nos permite hacer el llamado a un segmento de código realizado en ABAP, este segmento de código está diseñado para ser disparado por alguna aplicación externa utilizando el protocolo TCP/IP, es decir, en pocas palabras, vamos a llamar una función realizada en ABAP desde nuestra aplicación de .NET. Como toda función en programación puede recibir y retornar valores.

Para este ejemplo tenemos la RFC ficticia con el siguiente nombre: ZHP_PERSONA_TEST, la cual se encargará de guardar los datos de una persona y recibir los siguientes parámetros de entrada:


Devolviéndonos los siguientes datos:


Básicamente lo que haremos en la aplicación será:
  1. Crear la conexión a SAP y probarla.
  2. Hacer el llamado a la RFC con los parámetros de entrada.
  3. Obtener los datos que nos devuelve la RFC.
Un punto importante a tomar en cuenta es que no es necesario conocer el código ABAP que se está ejecutando, nosotros simplemente lo llamamos y nos retornará los valores con los que trabajaremos. Sin embargo recomiendo mantener una buena comunicación con la persona encargada de administrar la parte de SAP, para poder corregir de forma inmediata cualquier error que se pueda presentar.


Creando la aplicación

Primeramente vamos a crear un proyecto en Visual Studio, en este caso, con una aplicación de consola vale.
























Después añadiremos las referencias de las dll de SAP a nuestro proyecto, en Visual Studio damos clic derecho al proyecto en el explorador de la solución y escogemos la opción de Agregar Referencia (Add Reference):


Aparecerá la siguiente pantalla en la que seleccionaremos la pestaña Browse y buscaremos la ubicación de las dll, en este caso las coloque en la carpeta bin del proyecto:






















Con esto ya podremos utilizar el conector agregando a nuestro código la referencia:

using SAP.Middleware.Connector;

De la forma en que trabajaremos con el conector será mediante una clase, por lo que añadimos una nueva clase a la que llamaremos cSap, la cual contendrá las funciones para hacer la comunicación con SAP.






Como propiedad de la clase declaramos un objeto de la clase RfcDestination, que es el que nos ayudará a realizar la comunicación con SAP. El constructor quedaría de la siguiente manera:


















Como se observa, es necesario un objeto RfcConfigParameters para asignarle los parámetros de configuración y después con la función RfcDestinationManager. GetDestination en el objeto oDestino se le asignan los datos necesario para la conexión.

Con esto la conexión a SAP ya debería de llevarse a cabo y por ende se podría hacer el llamado a la RFC. Pero primeramente probemos que la conexión efectivamente se está realizando. Para esto vamos a realizar un Ping, este Ping se encierra en un bloque try - catch retornando true si este se llevó a cabo de forma exitosa y falsó si el Ping tuvo algún error y por ende entro al bloque catch:

De esta forma, antes de tratar de hacer el llamado a la RFC, podemos probar si la conexión a SAP es posible.















Ahora que tenemos la conexión funcionando procedemos a realizar un método que llamaremos CrearPersona. Este método recibirá los parámetros de entrada para la RFC:





Dentro de esta función crearemos el objeto que representa la RFC con la siguiente línea de código:

IRfcFunction oFunc = oDestino.Repository.CreateFunction(NombreRFC);

En dado caso de que la RFC no existiera en SAP, se generará una excepción y el código restante no se ejecutará.

Después agregamos los parámetros de entrada de la siguiente forma:

oFunc.SetValue("NAME", sNombre);

Como se puede ver, la función recibe primero el nombre que tiene asignado en SAP y posteriormente el valor. De igual forma si se intenta asignar un valor a una variable que no existe o con otro tipo de dato (un entero a un char), se generará una excepción y el código restante no se ejecutará.

Se invoca la función con la siguiente línea de código:

oFunc.Invoke(oDestino);

Si todo salió correctamente obtendremos los datos de salida utilizando la siguiente línea de código:

oFunc.GetString("ZID")

Ahora bien nuestro método terminado es el siguiente:















Se puede observar que se regresa un diccionario el cual contiene los datos de salida. Ahora vamos a probar su funcionamiento en nuestra aplicación de consola, suponiendo que ya hemos capturado los datos que necesitamos para mandar llamar la RFC.

Lo que haremos será:

1. Crear nuestro objeto de la clase cSap.
2. Probamos la conexión.
3. Creamos un diccionario donde se guardara lo que retorne el método que realiza el llamado a la RFC.
4. Si se le asignó un ID Persona SAP lo imprimimos, sino imprimimos el mensaje de error.
















Como dato extra, si entre los datos de salida se encuentra una tabla, la podemos obtener de haciendo lo siguiente:

IRfcTable rfcTabla = oFunc.GetTable(NombreTablaSAP);

Para después acceder a sus datos:

rfcTabla[Fila].GetString("COLUMNA1"),

De esta forma se puede iterar por todas las filas de la tabla e incluso si se prefiere se puede pasar la tabla a un DataTable.


Conclusión

Crear una aplicación en .NET que se pueda conectar con SAP es una tarea bastante sencilla, los problemas pueden venir a la hora de probar la aplicación, es por eso que recomiendo estar en constante comunicación con la persona encargada de SAP.

Por ejemplo:
Para probar la aplicación anteriormente explicada, esta podría estar ejecutándose correctamente pero siempre mandando mensaje de error. Para esto es recomendable hacer la prueba junto con el encargado de SAP, de esta forma cada quien pone “Breakpoints” donde crea necesario en su código y verifican que este funcionando correctamente o monitoreando donde se encuentra el error.


Acerca del Autor

Alejandro Trejo Huerta es Ingeniero en Computación de la Universidad de Guadalajara, desarrollador .NET para Dawcons en el área de software a la medida.  Puedes contactarlo a través de la cuenta de correo atrejo@dawcons.com

14 comentarios:

  1. Hola. Excelente Articulo. Una pregunta: ¿se puede mandar un parámetro DataTable a la función de SAP?
    (Tal como en SQL se define un tipo de dato tabla creado por el usuario)
    Me refiero a que en vez de dar de alta a una persona ¿se pueden dar de alta muchas personas en conjunto?
    Saludos. y Gracias

    ResponderEliminar
    Respuestas
    1. Hola:

      Primero que nada, gracias por tus comentarios. Sobre tu pregunta, todo depende de si la RFC de SAP recibe como parámetro una tabla, si ese es el caso, para pasarlo como parámetro, necesitas hacer los siguiente:

      - Obtener la referencia de la tabla, en código seria algo como:
      IRfcTable tabla = rfcFuncion.GetTable("NOMBRETABLA");
      - Pasas los datos a la tabla
      - Haces el llamado a la función de SAP

      Espero que haya sido de tu ayuda y gracias por tu interés en el articulo.

      Eliminar
    2. Dawcons se renueva a DW.
      Este blog emigrará a
      http://dwsoftware.mx/blog/
      En dicho portal se continuará publicando nuevos artículos relacionados a tecnologías de la información.
      Registrase y manténgase informado de las nuevas tecnologías, lenguajes y acontecimientos de esta industria.

      Eliminar
  2. Hola

    Habra algun articulo sobre insertar en SAP desde c#, es el mismo procedimiento o cambia en algo?

    ResponderEliminar
    Respuestas
    1. Hola:

      Primero que nada, muchas gracias por tu interés en el articulo. Sobre tu pregunta, si lo que deseas es insertar desde C#, primero lo que tienes que verificar es, si existe una RFC en SAP que sirva para insertar, si es así, sigues los pasos del articulo para poder hacer el llamado a la RFC, si lo que deseas es manipular los datos de SAP directamente desde tu aplicación de C# sin hacer llamadas a RFC, hasta donde yo tengo entendido no es posible, se necesita forzosamente trabajar con RFC's.

      Espero haya sido de ayuda y nuevamente gracias por el interes.

      Eliminar
    2. Dawcons se renueva a DW.
      Este blog emigrará a
      http://dwsoftware.mx/blog/
      En dicho portal se continuará publicando nuevos artículos relacionados a tecnologías de la información.
      Registrase y manténgase informado de las nuevas tecnologías, lenguajes y acontecimientos de esta industria.

      Eliminar
  3. Hola buenas tardes
    Quisiera saber como es el proceso para llamar una BAPI

    ResponderEliminar
  4. Hola, muchas gracias por tu interés en el artículo.
    Próximamente escribiremos un artículo acerca de este tema; este blog emigrará a
    http://dwsoftware.mx/blog/ síguenos y mantente informado sobre nuevas tecnologías y acontecimientos de esta industria.

    ResponderEliminar
  5. Hola amigo tendras de casualidad el conector. Lo trato de descargar pero la verdad no me deja.

    ResponderEliminar
  6. HOLA AMIGO , COMO PUEDO INTEGRAR .NET A MI PROYECTO SAP E INVESTIGADO Y EXISTEN MANERAS DE LLAMAR APLICACIONES O LANZAR APLICACIONES .NET DESDE SAP SIN NECESIDAD DE ABRIR VISUAL STUDIO QUE TODO ESTE MERAMENTE INTEGRADO A SAP.

    ResponderEliminar
  7. buenas, que parametros o funcion del rfc puedo usar para enviar o mandar un parámetro a una función en SAP?
    he visto que para leer funcion tabla o estrcutura se usa IRFC
    ahora para el envio que funcion o manera de enviar el dato que se usaria.
    o algun link donde investigar la documentacion sobre esto?
    saludos.

    ResponderEliminar
  8. buenos días, primero gracias por tu articulo, tengo una duda o no lo veo, en la linea de conexión a SAP, para verificar la conexión a SAP veo que se realiza un ping; ¿pero que va en esto, la dirección IP y ya? agradezco su respuesta y aclaración.

    ResponderEliminar
    Respuestas
    1. buenas, el ping le hace al metodo odestino. para probar los valores de conexion de sap,
      como siempre debe de arrojar la exepcion de error si falla.dimejecutas@gmail.com

      Eliminar
  9. pregunta, iba a descargar el sap connector desde el link que dejas y solicita usuario y contraseña? :(

    ResponderEliminar