Conectividad de SAP / Visual Basic Fecha: 18/Nov/2004 (15/11/04) Primera Parte: (este)
|
Intentaré a través de esta nota de dar un ejemplo de cómo conectar Visual Basic con SAP mediante DCOM Connector.
El componente conector DCOM es importante para la interoperatividad técnica de componentes SAP (escritos en ABAP u objetos ABAP) y componentes COM (escritos en Visual Basic, Java, C++, Cobol, Delphi u otro lenguaje compatible COM) en la base de Microsoft´s Distributed Component Object Model (DCOM). Usando el conector SAP DCOM permite crear aplicaciones distribuidas sin tener que instalar el SAP DLL o componentes COM en cada maquina cliente.
DCOM Connector es de Microsoft y se vende desde 1998 a partir de la versión 3 de SAP. Hay otros conectores, incluso un ITS que permite generar paginas Web.
Aunque ya esta disponible la versión 2 del SAP .NET Connector, que permite la generacion de librerías .NET para la conectividad con SAP y por otra parte, el SAP BC (SAP Business Connector) permite automatizar potentemente, aún sobre Internet, utilizando estándares abiertos, prefiero escribir sobre lo que conozco, así que sin más preámbulos vamos ver cómo crear un componente COM para conectar nuestra aplicación Visual Basic a SAP R/3.
DCOM Connector.
En una terminal en la tengamos instalado el GUI de SAP, en “inicio/programas/SAP FrontEnd/DCOM Connector” se inicia un HTML “R/3 DCOM Connector” donde se pueden ver claras explicaciones sobre que es y como usar este objeto, como instalarlo y que es necesario para usarlo.
Requisitos de instalación de DCOM Connector
En la solapa “destinations” veré, al menos, las mismas conexiones que veo en mi SAP logon, que son los servidores SAP a los que puedo conectarme desde mi terminal.
DCOM: Servidores SAP disponibles.
SAP: Selección de servidor.
Seleccionando uno de los servidores puedo editar sus propiedades de conexión, que son los datos que habitualmente uso para conectarme SAP, pero en este caso se los estoy indicando al DCOM Connector para la creación de una DLL.
DCOM: Edición de las propiedades de conexión a un servidor SAP.
En la solapa “object builder” se ingresa la información para la creación del proyecto (que será en Visual C++). Hay un cuadro en el que me conecto a SAP, tal como desde la ventana “SAP Logon”, cargando las propiedades de conexión del servidor al que necesito acceder. Por medio de esta conexión obtengo un árbol con los objetos que SAP expone, en el que puedo buscar las BAPI's (Business Programming Application Interfaces: funciones provistas por SAP para emular una transacción por medio de una llamada con parámetros) o RFC's (Remote Function Call: funciones que pueden invocarse desde sistemas externos a SAP enviando y recibiendo valores) de la que necesite obtener información. En otro cuadro indico las propiedades para crear el proyecto C++ que generara la DLL que después agregaré a las referencias de mi proyecto Visual Basic. Por medio de un check “session”, se indica si la función hace una sola operación a la vez (login, commit y cierra), o si la función realiza varias tareas sin loguear después de cada commit y manejar un rollback general o a conveniencia. Si no indico nombre de sesión, cada commit supone un nuevo login.
DCOM: Creación de la librería que se referencia en el proyecto Visual Basic.
Dadas las características de generación, no se puede usar más una DLL de este tipo en cada proyecto, por lo tanto necesito agregar todas las BAPI’s y RFC’s que vaya a usar.
Es indispensable contar con C++ instalado ya que DCOM genera la DLL en este lenguaje, después se puede usar en cualquier proyecto. De todas formas se genera también el código fuente del proyecto, así que podría levantarse con la versión de C++ que tenga y traducirlo a otro lenguaje si así lo deseo ( y me la aguanto).
Función en ABAP.
Los nombres de las RFC´s de SAP que se ven en la figura son así de raros por que SAP exige que comiencen con “Y” o “Z” todos los objetos (tablas, tipos de dato, funciones, procedimientos, pero no variables o nombre de campo) que son creados por el desarrollador que usa SAP.
Primero generaremos una función RFC en SAP tan simple como indicar un número de cliente y que devuelva el nombre, osea con dos parámetros: uno input y otro output. El código de la función en ABAP es el que sigue
FUNCTION ylu_dcom_ej01.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" REFERENCE(I_KUNNR) TYPE KUNNR
*" EXPORTING
*" REFERENCE(E_NAME1) TYPE NAME1
*"----------------------------------------------------------------------
TABLES: kna1.
SELECT SINGLE name1
FROM kna1 INTO kna1-name1
WHERE kunnr EQ i_kunnr.
IF sy-subrc EQ 0.
e_name1 = kna1-name1.
ELSE.
CLEAR e_name1.
ENDIF.
ENDFUNCTION.
Proyecto Visual Basic
En Visual Basic creo un proyecto y le agrego una referencia a la DLL que creó el DCOM Connector. Una vez agregada, podré ver sus características por medio del examinador de objetos (F2). No es necesario registrar la DLL. En el código de carga del formulario se crea una sesión indicando “destination” y “client”.
“Destination” es el servidor al que me conecto, generalmente se lla “DES” al de desarrollo, “QA” o “QAS” al de test y “PRD” al productivo, estos son los más comunes.
“Client” es la instancia del servidor a la que me conecto, en SAP se llama “Mandante” y puedo tener más de una por servidor con distintos volumen y calidad de datos para pruebas o desarrollo.
En las figuras que siguen veremos la referencia y los métodos y propiedades que expone la librería.
Visual Basic: La referencia a la librería creada.
Las clases ISAPCatalog e ISAPConnector las crea el DCOM Connector y están siempre. En la última pantalla se puede ver la clase “Prueba” y seleccionada la función que se creo para el ejercicio, en la parte inferior también se ven los parámetros necesarios para la ejecución.
Ahora agregaremos un formulario para poder ingresar un código de cliente, enviarlo a SAP y que nos devuelva el nombre.
Formulario y código Visual Basic.
Option Explicit Private Sesion As DESdcom1Lib.Dcom1SessionComponent Private Funcion As DESdcom1Lib.Prueba Private Sub Form_Load() On Error GoTo errSAP Set Sesion = CreateObject("SAP.DCOM1SessionComponent.1") Sesion.Destination = "DES" ‘ servidor Sesion.UserID = "usuario" Sesion.Password = "password" Sesion.Client = "100" ‘ mandante Exit Sub errSAP: MsgBox Err.Number & " " & Err.Description End Sub Private Sub Command1_Click() Dim stNombre As String Set Funcion = Sesion.CreateInstance("DES.Prueba.1") Funcion.Z_Rfc_Prueba stNombre, Text1(0).Text Text1(1).Text = stNombre End Sub
Al correr el formulario, si le indicamos un código de cliente nos devolverá el nombre al hacer clic en el botón. Si el cliente no existe, devuelve un blanco, pero esto es así por que la funcion en SAP vacía el parámetro de retorno ante el fin de archivo.