Conectividad de SAP / Visual Basic
DCOM - Introducción

Fecha: 18/Nov/2004 (15/11/04)
Autor: Luis Elías Carro, luis.carro@gmail.com

Primera Parte: (este)
Segunda Parte: Obtener una tabla y cargar un combo (30/Nov)
Tercera Parte:
Insertar un cliente en SAP desde una aplicación VB (04/Dic)

 


 

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.

 


Índice de VB6
 

ir al índice