Sie sind auf Seite 1von 34

Implementar Business Transaction Events ( BTE's ) - SAP

En esta oportunidad hablaremos de como podemos implementar un Business


Transaction Events (BTE) en SAP.

Los BTE's son un tipo especial de extensión para el modulo de FI; al igual que los
enhancement, user exit, BADI's, etc... nos permite adaptar el sistema a las
necesidades del cliente. También el BTE es un functionmodule (ejecutado por el
cliente) que tiene una interfaz estándar definida por SAP, y este es llamado por el
programa estándar de SAP por una llamada a la función
OPEN_FI_PERFORM_(BTE-number) o por OUTBOUND_CALL_(BTE-number).

Existen 2 Tipos de Interfases:

• Publish and Subscribe (Modulos P/S) .- No es posible actualizar los Datos o


devolver al estandar de SAP.
• Process interfaces (Modulos de proceso) .- Puede Devolver o entregar Datos
a la aplicacion SAP.

Funcionamiento de un BTE:
Pregunta:
¿Como saber si existe un BTE en la Trx de SAP o programa?
Para esto particularmente utilizo un programa Z que me identifica si existen User
Exit,BADI,... y también BTE. (descargar programa z)

Ejemplo: Utilizando el programa Z para identificar un BTE podemos apreciar:

Ingresamos el nombre del Programa o la Transacción:


Resultado de la búsqueda:

Tomaremos como ejemplo el BTE: OPEN_FI_PERFORM_00001420_P, cabe


aclarar que esta función en algún momento es invocado desde la Tx.

Podemos comprobar el BTE ingresando a la Tx FIBF, y cuando entramos en la tx en


la parte del menu ingresamos a: Entorno->Sistema Info (procesos), seguido
ejecutamos la interfaz y nos muestra una lista de BTE's y en esta lista encontramos
el BTE que estamos utilizando
Para Implementar el BTE primero hacemos una copia de la funcion, para esto
hacemos click en el boton

realizamos la copia:
Despues de haber realizado la copia de la funcion, volvemos a la Tx FIBF ir al
menu: Opciones->Productos->...de un cliente.

En esta seccion registramos un nombre de producto a utilizar en los BTE (como si


fuera un nombre de proyecto):

Despues de haber creado el producto, volvemos al menu principal de la Tx FIBF e


ingresamos al menu: Opciones->Modulo de Proceso->... de un cliente

En esta seccion, seleccionamos nuestro numero de BTE (00001420) e ingresmos


nuestra funcion Z (la que hicimos una copia) y seleccionamos el nombre del
producto creado anteriormente.

De esta forma nuestro BTE ya se encuentra listo para usarlo y escribir nuestro
codigo (ampliar el estandar):
Espero que les sea util, Saludos ....

PUBLICADO POR CARLOS E. FLORES JOSEPH EN 15:47 0 COMENTARIOS


ENVIAR POR CORREO ELECTRÓNICO ESCRIBE UN BLOG COMPARTIR CON TWITTER
COMPARTIR CON FACEBOOK COMPARTIR CON GOOGLE BUZZ

Reaccion

es:

MIÉRCOLES 19 DE AGOSTO DE 2009

ALV Object Model (cl_salv_table)

En esta oportunidad vamos a ver como hacer nuestro ALV con el nuevo modelo que
nos proporciona SAP para hacerlo mas rápido y sencillo utilizando clases estandar.

ALV Object Model:


El nuevo Modelo de Objetos de Lista (SAP List Viewer) es un objeto orientado a la
encapsulación de la herramienta ALV que ya existe:

• ALV Simple, 2 Dimensiones


• ALV Jerarquico
• ALV Tree.

Para cada tipo de ALV se trabaja con una clase diferente: CL_SALV_TABLE,
CL_SALV_HIERSEQ_TABLE, CL_SALV_TREE. mas detalles

En el ejemplo utilizaremos la tabla SPFLI (Itinerarios de vuelos) para luego


mostrarlo en un ALV GRID utilizando la clase CL_SALV_TABLE.

Creamos una estructura ZES_SPFLI:

El codigo del programa queda de la siguiente manera:

REPORT zalv_om01.

DATA: t_spfli TYPE TABLE OF zes_spfli,


t_table TYPE REF TO cl_salv_table,
g_sort TYPE REF TO cl_salv_sorts,
g_functions TYPE REF TO cl_salv_functions,
g_dsp TYPE REF TO cl_salv_display_settings,
g_columns TYPE REF TO cl_salv_columns_table,
g_column TYPE REF TO cl_salv_column_table,
g_color TYPE lvc_s_colo,
g_agg TYPE REF TO cl_salv_aggregations.

START-OF-SELECTION.
PERFORM cargar_data.
PERFORM llamar_alv.

*&---------------------------------------*
*& Form cargar_data
*&---------------------------------------*
* text
*----------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------*
FORM cargar_data .

SELECT
carrid
connid
countryfr
cityfrom
airpfrom
countryto
cityto
airpto
distance
INTO TABLE t_spfli
FROM spfli.

ENDFORM. " cargar_data

*&---------------------------------------*
*& Form llamar_alv
*&---------------------------------------*
* text
*----------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------*
FORM llamar_alv .

cl_salv_table=>factory(
IMPORTING
r_salv_table = t_table
CHANGING
t_table = t_spfli
).

"Para los botones en el status


g_functions = t_table->get_functions( ).
g_functions->set_all( abap_true ).

"Para mostar el titulo del alv


g_dsp = t_table->get_display_settings( ).
g_dsp->set_list_header( 'ALV OBJECT MODEL' ).

"Para poner color a una columna


g_columns = t_table->get_columns( ).
g_column ?= g_columns->get_column( 'CONNID' ).
g_color-col = '6'.
g_color-int = '1'.
g_color-inv = '0'.
g_column->set_color( g_color ).

"Para ordernar por el campo CARRID y indicar un subtotal


g_sort = t_table->get_sorts( ).
g_sort->add_sort( columnname = 'CARRID' subtotal = abap_true ).

"Para que funcione el subtotal y las sumatorias


g_agg = t_table->get_aggregations( ).
g_agg->add_aggregation( 'DISTANCE' ).

"Para mostrar el alv


t_table->display( ).

ENDFORM. " llamar_alv

Ejecutamos...
Esta nueva forma de hacer nuestros ALVs nos ayuda en reducir el código de
nuestro programa, minimizar el tiempo de estar escribiendo nuestros layout,
fliedcat, etc.....

PUBLICADO POR CARLOS E. FLORES JOSEPH EN 12:26 5 COMENTARIOS


ENVIAR POR CORREO ELECTRÓNICO ESCRIBE UN BLOG COMPARTIR CON TWITTER
COMPARTIR CON FACEBOOK COMPARTIR CON GOOGLE BUZZ

Reaccion

es:

MARTES 14 DE JULIO DE 2009

Ejemplo Aplicacion Web con BSP en SAP

En esta oportunidad vamos a crear nuestra primera Aplicacion Web utiliando BSP
en SAP.

BSP significa Bussines Server Pages, al igual que otras tecnologias como Java
Server Pages o los Active Server Pages, etc... para desarrollo de aplicaciones web,
esta es la tecnología que nos provee SAP para la programación basadas en páginas
con scripting del lado del servidor. La ventaja que tiene el scripting del lado del
servidor, es que nos permite el acceso directo a todos los elementos del servidor de
aplicaciones (tales como modulos de funcion, tablas, abap object, etc). Para mas
informacion.. clic aqui

Antes de empezar a crear nuestra aplicaciones bsp, 1ero crearemos una tabla Z que
utilizaremos en el ejemplo.

Estructura de la Tabla: ZZWST_USUARIO

Despues de haber creado nuestra tabla de usuarios, ingresamos a la transaccion


SE80, para crear la aplicacion bsp, seleccionamos "BSP Application" e ingresamos
un nombre y le damos crear (nos pedira algunas datos comunes: nombre corto, ot,
paquete).
Ahora necesitamos un formulario de registro para la tabla Z Usuario, para esto
debemos crear una pagina con logica de proceso.
En la pestaña "Layout" diseñamos nuestro formulario, para eso podemos utilizar
cualquier editor de html.

Codigo HTML - Layout.

<%@page language="abap"%>
<%@extension name="htmlb" prefix="htmlb"%>
<html>
<head>
<title>REGISTRO DE USUARIO</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="">
<table width="360" border="0" align="center" cellpadding="0"
cellspacing="0">
<tr>
<td colspan="2">REGISTRO DE USUARIO </td>
</tr>
<tr>
<td width="105">Codigo</td>
<td width="255"><input name="TXTCODIGO" type="text" VALUE="" /></td>
</tr>
<tr>
<td>Nombre</td>
<td><input name="TXTNOMBRE" type="text" VALUE="" /></td>
</tr>
<tr>
<td>User Name </td>
<td><input name="TXTUSERNAME" type="text" VALUE="" /></td>
</tr>
<tr>
<td>User Password </td>
<td><input name="TXTUSERPASSWORD" type="text" VALUE="" /></td>
</tr>
<tr>
<td>Tipo Usuario </td>
<td><select name="CBTIPO">
<option value="A">Administrador</option>
<option value="U">Usuario</option>
</select> </td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="submit" name="oninputprocessing(btnGrabar)"
value="Enviar" />
<input type="reset" name="Submit2" value="Limpiar" /></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><a href="lista_usuario.htm">Ver Lista</a> </td>
</tr>
</table>
</form>
</body>
</html>

Ya teniendo nuestra interfaz para registrar usuario, pasaremos a realizar el evento


Grabar. Para eso fijemonos en esta parte del Código del Layout :
name="oninputprocessing(btnGrabar)"
En esta petaña ponemos todas las variables globales de la página.

Declaracion de los tipos de datos.

Luego ejecutamos nuestra página, y podemos realizar la grabacion. Pero como lo


visualizamos, para esto crearemos otra pagina con logica de proceso para visualizar
y poder eliminar los registros.
Creamos la nueva pagina con logica de proceso de nombre "lista_usuario".

El codigo en la pestaña del Layout.

<%@page language="abap" %>


<html>
<head>
<title>Listar Usuarios</title>
<style>
body{
font-family:sans-serif;font-size:11px;
}
.CABECERA_TABLA{
color: #003366;font-weight:bold; text-align:center;
font-family:"Trebuchet MS";font-size:12px;
}
</style>
</head>
<body>
<table width="635" border="0" align="center" >
<tr>
<td class="CABECERA_TABLA">LISTA USUARIOS</td>
</tr>
</table>
<BR />
<table width="635" height="25" border="1" cellpadding="2" cellspacing="0"
bordercolor="#CCCCCC" align="center" style="font-family:Verdana, Arial,
Helvetica, sans-serif;font-size:11px">
<tr style="background-color:#A9CEED;">
<td width="100">Codigo</td>
<td width="400">Apellidos y Nombres </td>
<td width="100">Usuario</td>
<td width="100">Eliminar</td>
</tr>
<%
field-symbols: <fs_usuario> like LINE OF ti_usuario.
loop at ti_usuario ASSIGNING <fs_usuario>.
%>
<tr>
<td><%= <fs_usuario>-codus%></td>
<td><%= <fs_usuario>-nomus%></td>
<td><%= <fs_usuario>-usern%></td>
<td><a href="lista_usuario.htm?accion=E&codusu=<%=<fs_usuario>-codus
%>">Eliminar</a></td>
</tr>
<%
endloop.
%>
</table>
<center><a href="registro_usuario.htm">Formulario</a></center>
<input name="ACCION" type="hidden" />
<input name="CODUSU" type="hidden" />
</body>
</html>

Con la variable "accion" indicamos si estamos eliminando el registro.

Atributos de la Pagina

Declaracion de tipos globales

Ejecutamos la pagina y podemos ver la lista de registros y ademas de poder


eliminar.
PUBLICADO POR CARLOS E. FLORES JOSEPH EN 07:58 2 COMENTARIOS
ENVIAR POR CORREO ELECTRÓNICO ESCRIBE UN BLOG COMPARTIR CON TWITTER
COMPARTIR CON FACEBOOK COMPARTIR CON GOOGLE BUZZ

Reaccion

es:

VIERNES 26 DE JUNIO DE 2009

Conectar Java con SAP JCO Connector

En este ejemplo veremos como conectarnos a SAP desde Java y consultar los datos
de una tabla de SAP, para lograr esto utilizaremos el driver JCO Connector, que
tambien se podría usar WebService para la coneccíon pero esto sera otro tema.

Ahora debemos bajarnos el Conector del siguiente link SAP Marketplace nos pedirá
un usuario y contraseña este usuario lo tienen las empresas, partners, y otros que
tienen alguna relación con SAP, pero si no tenemos el usuario para poder acceder a
la página los bajamos de este link click aqui

Ingresamos a SAP y creamos una función RFC que no hará mas que traernos una
lista de registros de una tabla de SAP para luego procesarlo en nuestra aplicación
en java.

Entramos a la transacción SE37 para crear nuestra función: ZRCF_SPFLI_LIST


Seleccionamos la pestaña "Import"...

El parámetro "CARRID" será opcional, luego en la pestaña "Tables":

El parámetro "FLIGHT_LIST" nos devolverá los valores que recogeremos en


nuestra aplicación en java.

En la pestaña "Source code" escribiremos el código que obtendrá los datos de la


tabla de SAP.
Para terminar con nuestra función tenemos que indicarle que será un RFC (Remote
Function Call) para poder acceder a el desde la aplicación.

Grabamos y Activamos la función, y ya se encuentra listo para usarlo.

Antes de pasar a crear nuestra aplicacion, debemos colocar las librerias del jco
connector en la carpeta de windows, cuando descargamos el conector nos adjunta
una dll:

librfc32.dll : colocar en la carpeta "C:\WINDOWS\system32\"

Ahora pasaremos a crear la aplicación en java que accederá a la función rfc, para
esto creamos un nuevo proyecto "Java Application" e ingresamos el nombre del
proyecto, seguidamente agregamos la librería al proyecto "sapjco":

Escribiendo en nuestra clase:

Importamos la librería:
Declaramos las variables que utilizaremos:

Establecemos la conexion al servidor...

Accedemos a la función:

Recorremos los valores de nuestra tabla que se obtuvo de la función:


Ejecutamos y el resultado es...

Código Completo:
package test_sap_jco;

import com.sap.mw.jco.*;
/**
*
* @author carlos
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
JCO.Client client = null;
JCO.Function funcion = null;
JCO.Table t_spfli = null;

IRepository repositorio = null;


IFunctionTemplate ftemplate = null;
try {
client = JCO.createClient("000",
"bcuser",
"minisap",
"EN",
"localhost",
"00");
//Creando el repositorio para las funciones
repositorio = JCO.createRepository("MiRepositorio", client);
//Indicamos que funciones queremos utilizar
ftemplate =
repositorio.getFunctionTemplate("ZRCF_SPFLI_LIST".toUpperCase());
//Obtenemos la funcion del SAP
funcion = ftemplate.getFunction();
//Pasamos parametros a la funcion
funcion.getImportParameterList().setValue("AA", "CARRID");
//Ejecutamos la funcion
client.execute(funcion);
//Capturamos el parametro de Salida
t_spfli =
funcion.getTableParameterList().getTable("FLIGHT_LIST");

System.out.println("Nro de Filas:" +t_spfli.getNumRows());

for (int i= 0;i<t_spfli.getNumRows();i++){


t_spfli.setRow(i);
System.out.println(t_spfli.getString("CARRID") + " "
+
t_spfli.getString("CONNID") + " "
+
t_spfli.getString("COUNTRYFR") + " "
+
t_spfli.getString("CITYFROM") + " "
+
t_spfli.getString("AIRPFROM") + " "
+
t_spfli.getString("COUNTRYTO") + " "
+
t_spfli.getString("CITYTO"));
}
} catch (Exception e) {
System.out.println("Error:" +e.getMessage());
}
}
}

PUBLICADO POR CARLOS E. FLORES JOSEPH EN 09:52 12 COMENTARIOS


ENVIAR POR CORREO ELECTRÓNICO ESCRIBE UN BLOG COMPARTIR CON TWITTER
COMPARTIR CON FACEBOOK COMPARTIR CON GOOGLE BUZZ

Reaccion

es:

MIÉRCOLES 24 DE JUNIO DE 2009

Generando Clases en C# .Net con base de datos

Alguna vez nos a tocado crear las clases de las modelo de base de datos, y nos
encontramos con una gran cantidad de tablas y realizar una por una estas clases
nos demandaría mucho tiempo además que se vuelve algo mecánico, y lo que
buscamos es minimizar tiempo en el desarrollo. En uno de los proyecto que estuve
tenía que crear las clases para cada tabla donde debían contener los gets sets y los
métodos de "crear", "modificar", "eliminar", "buscar por Id" (más conocido como
CRUD), es entonces que decidí realizar un programa que me genere
automáticamente estas clases con sus respectivos métodos, basados en una
arquitectura de desarrollo de la empresa...

El programa está desarrollado en C# y traer los datos de SQL Server 2005, la lógica
consiste en:

Primero traerse todas las tablas que contiene nuestra base de datos, para esto
realizamos la siguiente consulta sql:

Una vez que se tiene la lista de las tablas debemos saber cuáles son sus campos y
qué tipo de datos tienen: para eso debemos hacer la siguiente consulta:

Ahora debemos saber cuál de estos campos es PK, realizamos la siguiente consulta:

Con esto ya tenemos todos los datos para poder generar nuestras clases
automáticamente, el siguiente paso es crear nuestras plantillas o la arquitectura
que tendrán nuestras clases, por ejemplo mi clase conexion como se genera en el
programa:

Indicamos la ruta donde se generan los archivos, e utilizamos StreamWriterpara


crear y escribir nuestro archivo:
Nuestro método que tiene la estructura que se escribirá en el archivo.

ejecutando el programa:

Ingresamos el nombre de nuestro servidor, y nos logeamos nos carga la lista de


base de datos que tiene y seleccionamos uno de ellos:
Seleccionando la carpeta donde se guardaran los archivos:

Seleccionando las tablas que queremos generar sus clases:


Conclusiones: El objetivos de esto es generar nuestra herramienta que nos
faciliten y minimicen tiempo a la hora de desarrollar nuestros programas, ver cual
de los procesos es una rutina constante (en este caso crear las clases en basándose
en el modelo que se tiene en la base de datos), no importa el lenguaje que se utilice
ni el motor de base de datos que se trabaje, se puede crear un programa siguiendo
la misma lógica por ejemplo que genere en código en vb.net, java, abap, etc... y la
arquitectura del sistema crearlo de acuerdo a la empresa o la forma que trabajamos
(crear plantillas para generar los archivos)

Acá les dejo el link de descarga del programa Generador de Clases en C#..

PUBLICADO POR CARLOS E. FLORES JOSEPH EN 17:17 0 COMENTARIOS


ENVIAR POR CORREO ELECTRÓNICO ESCRIBE UN BLOG COMPARTIR CON TWITTER
COMPARTIR CON FACEBOOK COMPARTIR CON GOOGLE BUZZ

Reaccion

es:

Conectar Java con SQL Server 2005 Netbeans


Al igual que el post de Conectar java con mysql realizaremos algo parecido pero
ahora utilizando SQL Server 2005.

Para realizar este ejemplo primero tenemos que realizar unas configuraciones al
SQL Server 2005 Express, aca les dejo un muy buen post que nos enseña como
realizar una configuración correcta click aqui ... aproposito el blog es de mi
Hermano Hugo :) un saludo a la distancia...

Una vez realizado la configuracion correspondiente nos descargamos el conector


de SQL Server para Java, luego pasamos a crear nuestro proyecto para realizar las
pruebas de conexion.

Abrimos el Netbeans click en Nuevo Proyecto - > java -> Java Application,
ingresamos el nombre de nuestro proyecto, luego en nuestro proyecto agregamos la
librería del SQL Server 2005:

Seleccionamos la librería:
Creamos la clase clsConexion que tendrá los métodos getConexion() y Listar(),
importando las librerías: import java.sql.*;

Método getConexion que tiene los parámetros para la conexion a la base de datos:

Como se darán cuenta la cadena "connectionUrl" estamos poniendo como


parámetros el usuario y la clave que accederá al motor de bd, esto se vio en la parte
de conflagración del SQL Server.

Luego creamos el método Listar que nos realizar un query a la base de datos, para
nuestro caso listar la tabla categoría:
Luego en el Main del programa realizamos el test de los métodos:

Ejecutamos y el resultado es ...

Das könnte Ihnen auch gefallen