Date post: | 02-Jul-2015 |
Category: |
Documents |
Upload: | carlos-gutierrez |
View: | 449 times |
Download: | 0 times |
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:
M I É R C O L E S 1 9 D E A G O S T O D E 2 0 0 9
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:
M A R T E S 1 4 D E J U L I O D E 2 0 0 9
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> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="oninputprocessing(btnGrabar)"
value="Enviar" />
<input type="reset" name="Submit2" value="Limpiar" /></td>
</tr>
<tr>
<td> </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:
V I E R N E S 2 6 D E J U N I O D E 2 0 0 9
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:
M I É R C O L E S 2 4 D E J U N I O D E 2 0 0 9
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 ...