PDA

Ver la Versión Completa : Administrar Conexiones Sap


Julio Villalobos
10/03/08, 19:15:46
Hola,

Por favor a quien me pueda ayudar estare muy agradecido. Tengo 5 licencias para conectarme a la BD SAP para realizar consultas desde SQL_Server, Visual Basic, Power Bulider, etc. Quisiera saber como podria ver las conexiones que se realizan a la BD de SAP ya que en determinados momentos las 5 licencias se ocupan, no permitiendo mas conexiones, y quiero determinar cuales son las conexiones que se mantienen tanto tiempo establecidas. Lo que quisiera determinar es el equipo desde donde se esta realizando la conexion, que aplicacion y hasta que consulta esta realizando???, bueno pero creo que con saber de que equipo (computador) se esta realizando la conexion seria mas que suficiente y de mucha ayuda.

Si se pueden diferenciar estas conexiones de las realizadas a traves del mismo aplicativo SAP cierto?

Bueno agradesco a quien pueda ayudarme a entrar a la ventana en SAP donde se puede visualizar estas conexiones por licencias desde otros programas externos.

Gracias.

bourokba
25/03/08, 12:50:38
Hola aqui te mando un ejemplo completo de llamadas desde varios entornos.
Breve Tutorial de RFC (Remote Far Call).

Introducción
En este breve tutorial vamos a explicar como utilizar las capacidades de SAP para
comunicarse con sistemas externos, utilizando el ambiente de desarrollo del
Microsoft Visual Basic, Java y otros desarrollaremos algunas aplicaciones de
ejemplo que accedan a los datos de SAP a través de la invocación de funciones
RFC de SAP.
RFC y Conectores
En el directorio:
D:\Program Files\SAP\FrontEnd\SAPgui\rfcsdk\ccwww\default.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
RFC desde Visual Basic
La tecnica RFC consiste en llamar desde un sistema externo, por ejemplo una
aplicacion escrita en Visual Basic, Java, ASP 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.
Breve Tutorial de RFC (Remote Far Call) por Exequiel López Febrero 10, 2005
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.
Probando un ejemplo
Cree la siguiente funcion en SAP usando la transacción SE37, no olvide establecer
en la solapa Atributos que sea "Modulo de acceso remoto" para que sirva como
RFC.
Esta funcion debera tener un parámetro IMPORT:
PEBELP TYPE EBELP OPTIONAL
Tambien debera tener un parametro EXPORT:
RESULTADO LIKE MARA-MATNR
FUNCTION rfc_prueba.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" VALUE(PEBELP) TYPE EBELP OPTIONAL
*" EXPORTING
*" VALUE(RESULTADO) LIKE MARA-MATNR
*"----------------------------------------------------------------------
* En PEBELP viene el parametro
* que le enviamos a la funcion.
* Establcer el resultado de la operacion.
resultado = '123456'.
ENDFUNCTION.
He aqui un ejemplo de un programa en Visual Basic que establece la conexion
con SAP y ejecuta una funcion de SAP creada por nosotros llamada
RFC_PRUEBA, para probar este codigo simplemente cree una aplicación nueva en
Visual Basic y copie el codigo en el form principal y ejecútelo:
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
Breve Tutorial de RFC (Remote Far Call) por Exequiel López Febrero 10, 2005
' 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 = "sr3teste" ' Nombre del server
R3.Connection.Groupname = ""
R3.Connection.System = "01" ' Sistema
R3.Connection.Client = "110" ' Mandante
R3.Connection.User = "A971907" ' Usuario
R3.Connection.Password = "minelan" ' 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"
' 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
Notas para Windows 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:
Breve Tutorial de RFC (Remote Far Call) por Exequiel López Febrero 10, 2005
D:\sap gui 620 para instalar\GUI\WINDOWS\WIN32\system\Mdac\en
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
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".
Breve Tutorial de RFC (Remote Far Call) por Exequiel López Febrero 10, 2005
Un ejemplo mas complejo, envio de tablas
Modifique la anterior o cree una nueva funcion pero que tenga estos parámetros:
IMPORTING
VALUE(PEBELP) TYPE EBELP OPTIONAL
EXPORTING
VALUE(RESULTADO) LIKE MARA-MATNR
TABLES
TABLA STRUCTURE ZRFC_SGM_TABITEM OPTIONAL
En este caso yo estoy utilizando una tabla llamada ZRFC_SGM_TABITEM creada
por mi mismo que tiene algunos campos como dirección, material ,etc, pero
obviamente cualquier tabla seria apropiada para ser usada como parámetro.
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.
* 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.
Lo que la funcion hace es sumamente simple, solo toma los datos que le envie
como parámetros a la tabla y los almacena para luego utilizarlos, en este caso en
la tabla ZRFC_SGM_TABITEM.
Breve Tutorial de RFC (Remote Far Call) por Exequiel López Febrero 10, 2005
El codigo fuente en Visual Basic para invocar a la funcion seria el siguiente:
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 = "sr3teste" ' Nombre del server
R3.Connection.Groupname = ""
R3.Connection.System = "01" ' Sistema
R3.Connection.Client = "110" ' Mandante
R3.Connection.User = "A971907" ' Usuario
R3.Connection.Password = "minelan" ' 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.
Breve Tutorial de RFC (Remote Far Call) por Exequiel López Febrero 10, 2005
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
RFC desde VBScript para Internet.
El siguiente codigo fuente al ser colocado dentro de un archivo como por ejemplo
Prueba.htm 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 - exequiel@adinet.com.uy
* Usuario :
* Fecha : 19/10/2004.
* Orden :
*
* Desc : Este programa en VBScript invoca a una funcion RFC en SAP.
Breve Tutorial de RFC (Remote Far Call) por Exequiel López Febrero 10, 2005
---------------------------------------------------------------------->
<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 = "sr3teste" ' Aplication Server
R3.Connection.Groupname = ""
R3.Connection.System = "01" ' Sistema
R3.Connection.Client = "100" ' Mandante
R3.Connection.User = "A971907" ' Usuario
R3.Connection.Password = "minelan" ' 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.
Breve Tutorial de RFC (Remote Far Call) por Exequiel López Febrero 10, 2005
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.
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 - exequiel@adinet.com.uy
// 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.
Breve Tutorial de RFC (Remote Far Call) por Exequiel López Febrero 10, 2005
// --------------------------------------------------------------------
// 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.
"A971907", // Usuario.
"satelite", // Password.
"ES", // Idioma.
"sr3teste", // 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: \n" + 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
Breve Tutorial de RFC (Remote Far Call) por Exequiel López Febrero 10, 2005
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();
)
{
Breve Tutorial de RFC (Remote Far Call) por Exequiel López Febrero 10, 2005
JCO.Field field = e.nextField();
System.out.println(field.getName() + ":\t" + 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: \n" + 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();
}
// --------------------------------------------------------------------
}
// --------------------------------------------------------------------
Breve Tutorial de RFC (Remote Far Call) por Exequiel López Febrero 10, 2005
RFC desde JavaScript
<!------------------------------------------------------------------->
<! Sistema : JavaScript.
<! Nombre : Ejemplo 1 de RFC con JavaScript - Sin Dynpro.html
<! Modulo : ZRFC_PRUEBA
<! Autor : Exequiel Lopez Ramon - exequiel@adinet.com.uy
<! 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 = "sr3teste"
R3.connection.System = "01";
R3.connection.Groupname = ""
R3.connection.Client = "110";
R3.connection.User = "A971907";
Breve Tutorial de RFC (Remote Far Call) por Exequiel López Febrero 10, 2005
R3.connection.Password = "";
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>
<!------------------------------------------------------------------->