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:
- SAP .NET Connector 3.0 (se puede descargar aquí, es necesario estar registrado).
- Ambiente de desarrollo, en este caso utilizaremos Visual Studio 2010.
- 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:
- Crear la conexión a SAP y probarla.
- Hacer el llamado a la RFC con los parámetros de entrada.
- 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:
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.
Hola. Excelente Articulo. Una pregunta: ¿se puede mandar un parámetro DataTable a la función de SAP?
ResponderEliminar(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
Hola:
EliminarPrimero 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.
Dawcons se renueva a DW.
EliminarEste 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.
Hola
ResponderEliminarHabra algun articulo sobre insertar en SAP desde c#, es el mismo procedimiento o cambia en algo?
Hola:
EliminarPrimero 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.
Dawcons se renueva a DW.
EliminarEste 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.
Hola buenas tardes
ResponderEliminarQuisiera saber como es el proceso para llamar una BAPI
Hola, muchas gracias por tu interés en el artículo.
ResponderEliminarPró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.
Hola amigo tendras de casualidad el conector. Lo trato de descargar pero la verdad no me deja.
ResponderEliminarHOLA 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.
ResponderEliminarbuenas, que parametros o funcion del rfc puedo usar para enviar o mandar un parámetro a una función en SAP?
ResponderEliminarhe 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.
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.
ResponderEliminarbuenas, el ping le hace al metodo odestino. para probar los valores de conexion de sap,
Eliminarcomo siempre debe de arrojar la exepcion de error si falla.dimejecutas@gmail.com
pregunta, iba a descargar el sap connector desde el link que dejas y solicita usuario y contraseña? :(
ResponderEliminarHola tengo que desde .NET consumir una funcion via RFC en SAP que la misma recibe parametros de tipo tabla algunos y otros no. Como seria en ese caso ?
ResponderEliminarGerardo hola, estoy en el mismo escenario que tu, mi whatsapp es +56940736045, quizás podamos colaborarnos
EliminarBuenas tardes disculpa si ya tengo mi llamado a mi rfc de sap y ya lo hace correcto pero ese mismo rfc me pide el llenado de una tabla de detalle como podria insertar registro a esa tabla
ResponderEliminarconsulta este conector se aplica para sap hana, tienes un ejemplo de insertar información ósea registrar a sap
ResponderEliminarDw Software: Conectando La Aplicación De .Net Con Sap >>>>> Download Now
ResponderEliminar>>>>> Download Full
Dw Software: Conectando La Aplicación De .Net Con Sap >>>>> Download LINK
>>>>> Download Now
Dw Software: Conectando La Aplicación De .Net Con Sap >>>>> Download Full
>>>>> Download LINK