| Creacion de funciones RFC y uso de conectores |
|
|
|
| Documentación - Manuales breves | ||||||||
| Miércoles, 08 de Junio de 2005 16:50 | ||||||||
|
Introduccion
La tecnica RFC consiste en llamar desde un sistema externo, por ejemplo una aplicacion escrita en Visual Basic o C a las funciones internas de SAP ya sean estas funciones estandar de SAP o desarrolladas por nosotros mismos.
Cuando se instala el Front End de SAP en el computador que se va a utilizar como terminal para trabajar con SAP tambien se instalan un buen numero de componentes de comunicaciones que son utilizados por lenguajes como Visual Basic para poder acceder al sistema SAP.
A este conjunto de componentes de comunicacion se les denomina Conectores DCOM.
La maquina desde la cual se debe ejecutar este programa debe tener correctamente instalado el SAP Gui.
No hacen falta otros pasos especiales o configuraciones, si el SAP Gui esta correctamente instalado se puede escribir directamente un programa en Visual Basic para conectarse a SAP.
En el directorio:
D:Program FilesSAPFrontEndSAPgui fcsdkccwwwdefault.htm
se encuentra la documentacion oficial que viene con el SapGui acerca de los conectores DCOM para hacer RFC entre SAP y Visual Basic.
Tambien se la puede encontrar en:
Start / Programs / SAP Front End / Development Tools / DCOM Conector
He aqui un ejemplo de un programa en Visual Basic que establece la conexion con SAP y ejecuta una funcion estandar de SAP:
Option Explicit
' Conectores a las SAP.Functions. Dim R3 As Object Dim MyFunc As Object
' Parametros a enviar a la funcion. Dim PEBELP As Object
' Parametros a recibir desde la funcion. Dim RESULTADO As Object
' Tablas a ser enviadas a la funcion Dim TABLA As Object
' Resultado de la llamada a SAP. Dim Result As Boolean
Private Sub Command1_Click()
' Establecer la conexion con los Add Ins de SAP. Set R3 = CreateObject("SAP.Functions")
' Cargar los parametros de conexion R3.Connection.Messageserver = "serverR3" ' Nombre del server R3.Connection.Groupname = "" R3.Connection.System = "01" ' Sistema R3.Connection.Client = "110" ' Mandante R3.Connection.User = "DESARROLLO" ' Usuario R3.Connection.Password = "init" ' Password R3.Connection.language = "ES" ' Idioma
' Ejecutar la conexion en modo visible. If R3.Connection.logon(0, False) <> True Then MsgBox "No se ha podido establecer la conexión" Else ' Establecer contacto con la funcion. Set MyFunc = R3.Add("RFC_PRUEBA")
' Cargar los parametros a enviar a la funcion - EXPORTING Set PEBELP = MyFunc.exports("PEBELP") PEBELP.Value = "00020"
' Cargar la tabla con los datos que vamos a enviar - TABLES. Set TABLA = MyFunc.Tables("TABLA") TABLA.rows.Add
TABLA.Value(1, "adrnr") = "0000010007" ' Direccion. TABLA.Value(1, "matnr") = "000000000000051676" ' Material. TABLA.Value(1, "knttp") = "K" ' Tipo de imputación. TABLA.Value(1, "ewerk") = "C002" ' Centro. TABLA.Value(1, "bpreibapi") = "20" ' Precio. TABLA.Value(1, "mwskz") = "09" ' Indicador de IVA. TABLA.Value(1, "etmen") = "2" ' Cantidad del material. TABLA.Value(1, "kostl") = "0000000001" ' Centro costo. TABLA.Value(1, "eindt") = "20040909" ' Fecha del item.
' Llamar a la funcion de SAP. Result = MyFunc.CALL
' Analizar el resultado de la llamada. If Result = False Then MsgBox "Error en el llamado a la funcion RFC_PRUEBA." Else MsgBox "Funcion RFC_PRUEBA ejecutada OK."
' Recoger los parametros devueltos por la funcion - IMPORTING Set RESULTADO = MyFunc.imports("RESULTADO") MsgBox "El resultado devuelto es: " & RESULTADO.Value End If
' Terminar la sesion. R3.Connection.logoff End If
End Sub
El programa listado arriba llama desde Visual Basic a la funcion SAP 'RFC_PRUEBA'.
Si esta misma llamada hubiese que hacerla desde SAP tendria esta forma :
CALL FUNCTION 'RFC_PRUEBA' EXPORTING pebelp = '00080' IMPORTING resultado = vresultado TABLES TABLA = ttabla.
Desde SAP, la funcion tendra la siguiente forma:
FUNCTION rfc_prueba. *"---------------------------------------------------------------------- *"*"Interfase local *" IMPORTING *" VALUE(PEBELP) TYPE EBELP OPTIONAL *" EXPORTING *" VALUE(RESULTADO) LIKE MARA-MATNR *" TABLES *" TABLA STRUCTURE ZRFC_SGM_TABITEM OPTIONAL *"----------------------------------------------------------------------
TABLES: zrfc_sgm_tabitem.
* Establecer el valor de un campo obligatorio. zrfc_sgm_tabitem-mandt = sy-mandt. " Mandante
* Recoger los parametros enviados a la funcion. zrfc_sgm_tabitem-ebelp = pebelp. " Nro de item
* Recoger los datos enviados a la funcion como tabla. LOOP AT tabla. zrfc_sgm_tabitem-adrnr = tabla-adrnr. " Direccion. zrfc_sgm_tabitem-matnr = tabla-matnr. " Material. zrfc_sgm_tabitem-knttp = tabla-knttp. " Tipo de imputación. zrfc_sgm_tabitem-ewerk = tabla-ewerk. " Centro. zrfc_sgm_tabitem-bpreibapi = tabla-bpreibapi. " Precio. zrfc_sgm_tabitem-mwskz = tabla-mwskz . " Indicador de IVA. zrfc_sgm_tabitem-etmen = tabla-etmen. " Cantidad material. zrfc_sgm_tabitem-kostl = tabla-kostl. " Centro costo. zrfc_sgm_tabitem-eindt = tabla-eindt. " Fecha del item.
INSERT zrfc_sgm_tabitem. ENDLOOP.
* Establcer el resultado de la operacion. resultado = '123456'.
ENDFUNCTION.
Notas para Windowds NT: ----------------------------
Segun la documentacion de SAP se requiere el ejecutable de microsoft mdac_typ.exe para que los add-ins de SAP funcionen bien en NT.
Se lo puede encontrar en: D:sap gui 620 para instalarGUIWINDOWSWIN32systemMdacen
Parece ser que algunos componentes del SAP Gui no quedan bien instalados, en particular los conectores DCOM y Add Ins para comunicarse con Visual Basic.
Este es un problema que se da con la version mas reciente del SAP Gui, con versiones anteriores el Visual Basic se conecta bien.
Se instalo la version SAP Gui 6.20 y luego se instalo el componente de "Desktop Interfase" del SAP Gui 4.6C y esto resolvio el probelma.
1 - Debe tenerse en cuenta que como la funcion es de tipo RFC no se permiten parametros de tipo REFERENCE, por lo tanto se debe establecer el flag "Trasp. Valores" al declarar los parametros de la funcion:
2 - Para que la funcion en SAP sea RFC debe setearse el siguiente flag: Atributos / Modulo de acceso remoto.
3 - Los parametros de la funcion serian:
IMPORT
PEBELP TYPE EBELP Opcional Trasp. Valores
EXPORT
RESULTADO LIKE MARA-MATNR Trasp. Valores
TABLAS
TABLA LIKE ZRFC_SGM_TABITEM Trasp. Valores
4 - Las funciones RFC no pueden tener salida a pantalla
Esta funcion haria que el codigo en Visual Basic a pesar de ejecutar la funcion reportara un error.
CALL FUNCTION 'POPUP_TO_INFORM' EXPORTING titel = 'Funcion BAPI_PO_CREATE.' txt1 = 'Ha habido errores' txt2 = '' txt3 = '' txt4 = ''.
La funcion opera, y crea el pedido, pero como el codigo no esta preparado para recibir el mensaje el sistema responde con Result = False lo cual se interpreta como un error, a pesar de haber funcionado bien.,
En el archivo dev_rfc.trc se devuelve el estado del "error".
El mensaje en el archivo seria algo asi como:
**** ERROR file opened at 20040924 170432 Pacific Dayligh, SAP-REL 620,0,949 RFC-VER 3 584466 MT-SL T:1636 ======> Screen output without connection to user. T:1636 <* RfcReceive [1] : returns 3:RFC_SYS_EXCEPTION T:1636 <* RfcCallReceive [1] : returns 3:RFC_SYS_EXCEPTION >TS> Fri Sep 24 17:05:01 2004
Se ejecuta la funcion desde Visual Basic y luego al mirar la tabla se vio que habia dado el alta, por lo tanto funciono.
La tabla que usamos para probar esta funcion es ZRFC_SGM_TABITEM.
RFC desde VBScript para Internet.
El siguiente codigo fuente al ser colocado dentro de un archivo como por ejemplo Prueba.html realiza el mismo trabajo que el programa en visual basic para contactar a la funcion RFC de SAP.
<HTML>
<HEAD>Establecer contacto con una RFC SAP a traves de VBScript</HEAD> <TITLE>Establecer contacto con una RFC SAP a traves de VBScript</TITLE>
<BODY>
<!-------------------------------------------------------------------- * Sistema : sr3test_SD1_01 - R/3 Version 4.7 * Nombre : Prueba1.htm * Modulo : ZRFC_PRUEBA * Autor : Exequiel Lopez Ramon - Invenzis - Esta dirección electrónica esta protegida contra spam bots. Necesita activar JavaScript para visualizarla * Usuario : * Fecha : 19/10/2004. * Orden : * * Desc : Este programa en VBScript invoca a una funcion RFC en SAP. ---------------------------------------------------------------------->
<H1> Establecer contacto con una RFC SAP a traves de VBScript </H1>
<FORM NAME="Form1">
<INPUT TYPE="button" NAME="btnVB" VALUE="Contactar RFC SAP" onClick="pressed" LANGUAGE="VBScript">
</FORM>
<!-------------------------------------------------------------------->
<SCRIPT LANGUAGE="VBSCRIPT">
Sub Pressed()
' Establecer la conexion con el sistema SAP Set R3 = CreateObject("SAP.Functions")
' Cargar los parametros de conexion R3.Connection.Messageserver = "100.123.234.255" ' Aplication Server R3.Connection.Groupname = "" R3.Connection.System = "01" ' Sistema R3.Connection.Client = "100" ' Mandante R3.Connection.User = "DESARROLLO" ' Usuario R3.Connection.Password = "init" ' Password R3.Connection.language = "ES" ' Idioma
' Abrir la conexion con SAP If R3.Connection.logon(0, False) <> True Then alert( "No se ha podido establecer la conexión.") Else ' Establecer contacto con la funcion. Set MyFunc = R3.Add("RFC_PRUEBA")
' Cargar los parametros a enviar a la funcion - EXPORTING Set PEBELP = MyFunc.exports("PEBELP") PEBELP.Value = "00010"
' Cargar la tabla con los datos que vamos a enviar - TABLES. Set tabitem = MyFunc.Tables("TABLA") tabitem.rows.Add
' Cargar los parametros a ser enviados. tabitem.Value(1, "matnr") = "000000000000051677" ' Material. tabitem.Value(1, "knttp") = "K" ' Tipo de imputación. tabitem.Value(1, "bpreibapi") = "10" ' Precio. tabitem.Value(1, "mwskz") = "09" ' Indicador de IVA. tabitem.Value(1, "etmen") = "123" ' Cantidad del material. tabitem.Value(1, "kostl") = "0000000001" ' Centro costo. tabitem.Value(1, "eindt") = "20040927" ' Fecha del item. ' La fecha no puede estar en el pasado. ' Llamar a la funcion de SAP. Result = MyFunc.CALL
' Analizar el resultado de la llamada. If Result = False Then alert("Error en el llamado a la funcion RFC_PRUEBA.") Else alert("Funcion RFC_PRUEBA ejecutada OK.")
' Recoger los parametros devueltos por la funcion - IMPORTING Set RESULTADO = MyFunc.imports("RESULTADO") alert("El resultado devuelto es: " & RESULTADO.Value) End If
' Terminar la sesion. R3.Connection.logoff End if
End Sub
<!-------------------------------------------------------------------->
</SCRIPT>
</BODY></HTML>
RFC desde Java
Requiere el paquete de desarrollo JavaBeans
Requiere del Jco que puede bajarse desde la pagina de conectores de SAP: https://websmp103.sap-ag.de/CONNECTORS
Para que el Java acepte a import com.sap.mw.jco.*; hay que:
Copiar en WinNT/System32 a los dlls de JCo. Declararlo en /File /Projects / . . . . Properties /Compiling sources /Add Jar: sapjco.jar
// -------------------------------------------------------------------- // Sistema : Java conectandose a SAP R3 4.7 via JCo. // Nombre : Prueba_RFC_3. // Autor : Exequiel Lopez Ramon - Invenzis - Esta dirección electrónica esta protegida contra spam bots. Necesita activar JavaScript para visualizarla // Usuario : // Fecha : 25/10/2004. // Orden : // // Desc : Este programa llama a la funcion SAP estandar RFC_PRUEBA // : de acuerdo a las reglas recomendadas por JCo. // --------------------------------------------------------------------
// Declarar la biblioteca de JCo., debe incluirse el sapjco.jar en Properties. import com.sap.mw.jco.*;
// --------------------------------------------------------------------
public class Prueba_RFC_3 { // Identificacion del sistema. static final String SID = "R3";
// Declaracion un repositorio. IRepository repository;
// --------------------------------------------------------------------
public Prueba_RFC_3() { try { // Agrregar una conexion al POOL.
JCO.addClientPool( SID, // Alias para este pool. 10, // Numero maximo de conexiones. "110", // Cliente o Mandante. "DESARROLLO", // Usuario. "init", // Password. "ES", // Idioma. "serverR3", // Nombre del servidor SAP. "01" ); // Nro de sistema.
// Crear el repositorio
repository = JCO.createRepository("MYRepository", SID); }
catch (JCO.Exception ex) { System.out.println("Ha ocurrido un error: " + ex); } }
// --------------------------------------------------------------------
public void salesOrders() { JCO.Client client = null;
try { // Obtener el template de la funcion para el repositorio de datos. IFunctionTemplate ftemplate = repository.getFunctionTemplate("RFC_PRUEBA");
// Si la definicion de la funcion ha sido encontrada en el sistema SAP if(ftemplate != null) {
// Crear la funcion desde el template JCO.Function function = ftemplate.getFunction();
// Obtener un cliente desde el Pool. client = JCO.getClient(SID);
// Cargar los parametros de entrada. JCO.ParameterList input = function.getImportParameterList(); input.setValue("00010", "PEBELP" );
// Indicarle que habra lista de parametros retornados por la funcion. JCO.ParameterList output = function.getExportParameterList();
// Llamar a la funcion en el sistema SAP. client.execute(function);
// Recuperar la lista de parametros devueltos por la funcion. for (int indice = 0; indice < output.getFieldCount(); indice++) { System.out.println(" Nombre del parametro: " + output.getName(indice) + " Valor: " + output.getString(indice)); }
// Para las funciones con parametro RETURN // Print return message // JCO.Structure ret = function.getExportParameterList().getStructure("RESULTADO"); // System.out.println("RFC_PRUEBA: " + ret.getString("MESSAGE"));
// Obtener el contendio de la tabla devuelta por la funcion. JCO.Table tabla_devuelta = function.getTableParameterList().getTable("TABLA");
// Imprimir los resultados if ( tabla_devuelta.getNumRows() > 0) {
// Recorrer todas las filas de la tabla. do {
System.out.println("-----------------------------------------");
// Desplegar el contenido de cada columna. for (JCO.FieldIterator e = tabla_devuelta.fields(); e.hasMoreElements(); ) { JCO.Field field = e.nextField(); System.out.println(field.getName() + ": " + field.getString()); } } while(tabla_devuelta.nextRow());
} else { System.out.println("La tabla volvio vacia"); } } else { System.out.println("La funcion RFC_PRUEBA no existe en el sistema SAP."); } } catch (Exception ex) { System.out.println("Ha ocurrido un error: " + ex); }
finally { // Liberar al cliente del Pool JCO.releaseClient(client); } }
// --------------------------------------------------------------------
protected void cleanUp() { JCO.removeClientPool(SID); }
// --------------------------------------------------------------------
public static void main(String[] argv) { Prueba_RFC_3 e = new Prueba_RFC_3();
e.salesOrders(); e.cleanUp(); }
// --------------------------------------------------------------------
}
// --------------------------------------------------------------------
RFC desde JavaScript
<!-------------------------------------------------------------------> <! Sistema : JavaScript. <! Nombre : Ejemplo 1 de RFC con JavaScript - Sin Dynpro.html <! Modulo : ZRFC_PRUEBA <! Autor : Exequiel Lopez Ramon - Invenzis - Esta dirección electrónica esta protegida contra spam bots. Necesita activar JavaScript para visualizarla <! Fecha : 21/09/2004. <! <! Desc : Este programa en JavaScript invoca a una <! funcion RFC en SAP. <!------------------------------------------------------------------->
<BODY>
<H1> Establecer contacto con una RFC SAP a traves de JavaScript. </H1> <H1> Funciona bien con el Internet Explorer de Microsoft. </H1>
Pulse el boton para establer la conexion con SAP desde JavaScript:
<input TYPE = "submit" VALUE = "Conectar" OnClick = "SAPlogon();" >
<input type = "BUTTON" value = "Cerrar esta Pagina" onClick = "javascipt:window.close()" >
</BODY>
<!------------------------------------------------------------------->
<script language="JavaScript">
Result = 0; Resultado = 0;
// ------------------------------------------------------------------
function SAPlogon() { R3 = new ActiveXObject("SAP.Functions");
R3.connection.Messageserver = "serverR3" R3.connection.System = "01"; R3.connection.Groupname = "" R3.connection.Client = "110"; R3.connection.User = "DESARROLLO"; R3.connection.Password = "init"; R3.connection.Language = "ES";
if ( R3.connection.logon(0, 0) != 1 ) alert("No se ha podido establer la conexion con SAP."); else { MyFunc = R3.Add("RFC_PRUEBA");
PEBELP = MyFunc.exports("PEBELP"); PEBELP.Value = "00020";
tabitem = MyFunc.Tables("TABLA"); tabitem.rows.Add;
tabitem.Value(1, "matnr") = "000000000000051677"; tabitem.Value(1, "knttp") = "K"; tabitem.Value(1, "bpreibapi") = "10"; tabitem.Value(1, "mwskz") = "09"; tabitem.Value(1, "etmen") = "123"; tabitem.Value(1, "kostl") = "0000000001"; tabitem.Value(1, "eindt") = "20040927";
Result = MyFunc.CALL;
if ( Result == 0 ) alert("Error en el llamado a la funcion RFC_PRUEBA.") else { alert("Funcion RFC_PRUEBA ejecutada OK.");
Resultado = MyFunc.imports("RESULTADO");
alert(Resultado); }
R3.connection.logoff(); }
};
// ------------------------------------------------------------------
--></script>
<!------------------------------------------------------------------->
¡Sólo los usuarios registrados pueden escribir comentarios!
Powered by !JoomlaComment 3.26
3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."
|




