PDA

Ver la Versión Completa : Guardando el Log de un CALL TRANSACTION


tracer
03/05/06, 09:33:57
Saludos a todos los saperos,


Hoy vamos a adentrarnos en el maravilloso mundo de los CALL TRANSACTION. Seguro que muchos de vosotros os habéis vuelto locos alguna vez intentando hacer legible el log que devuelve la ejecución de un CALL TRANSACTION. Bien pues con este tutorial y un poco de código podréis hacer visible este log en la SLG1

TRANSACCION SLG1

Para los que no conozcais esta transacción comentaros que permite ver los log de la actuación sobre bases de datos de sap. Cuando se realizan actualizaciones a la base de datos, el sistema registra internamente información sobre el resultado de cada grabación (si fue exitosa o no), estadísticas (cantidad de registros ingresados o actualizados, cantidad de registros erróneos, etc), además de datos específicos de la aplicación (código de material ingresado o actualizado, por ejemplo).

http://www.mundosap.com/foro/images/call1.jpg



http://www.mundosap.com/foro/images/call2.jpg




GUARDANDO LOS RESULTADOS DEL CALL TRANSACTION EN LA SLG1

Cuando las actualizaciones se llevan a cabo a través del CALL TRANSACTION, esta información NO se hace disponible al usuario en forma automática, sino que, requiere de sentencias adicionales para que quede almacenada en una tabla interna de mensajes. Luego, debe analizarse y procesarse también desde
la programación, para decodificar el formato de la tabla interna en información entendible para el usuario.
Para lograr este objetivo, existen las funciones de “application logging” (registro de mensajes). Desde ya, el “Logging” de aplicaciones como concepto, puede implementarse también en otro tipo de programas.


Mediante la técnica desarrollada en este tip, que discute el caso del CALL TRANSACTION, los logs quedarán asociados a un objeto y “disponibles” para el usuario, para ser consultados en cualquier momento.
Se podrá seleccionar por objeto, fecha, hora, usuario, transacción, nivel de importancia del log, etc, y los mensajes se presentarán en forma amigable a través de semáforos que indican el éxito o fracaso de cada grabación, botones para ordenar, visualizar en detalle, dezplazar la pantalla, seleccionar, etc.


PROCEDIMIENTO:


Antes de acceder al código fuente del programa es necesario crear un objeto en la tabla de objetos del log de aplicación. Para ello, con la transacción SM30, se da de alta una entrada en la tabla BALOBJ, indicando nombre y texto descriptivo. Dicho objeto se utilizará como parámetro principal de los módulos de función invocados.

Dentro del fuente del programa se necesita:

1.-Definir las variables para el manejo de los mensajes y los parámetros de las funciones. Ejemplo:



data: appl_log_obj like balhdr-object value ’ZOBJ’. "Objeto del log
data: appl_log_class_high like balmi-probclass value ’1’. "Clase de problema
data: appl_log_class_info like balmi-probclass value ’4’. "Clase de problema
data: lognumber like balnri occurs 0 with header line. "Nros de logs
data: i_msg like balmi. "Estructura de mensajes y logs(técnicos)
data: i_msg_bis like balmi. "Estructura de mensajes y logs(de aplicación)
data: msg_error type c value ‘E’. "Tipo de mensaje (Error)
data: msg_abort type c value ‘A’. "Tipo de mensaje (Cancelar)
data: msg_warning type c value ‘W’. "Tipo de mensaje (Aviso)
data: msg_info type c value ‘I’. "Tipo de mensaje (Informativo)
data: msg_ok type c value ‘S’. "Tipo de mensaje (Exito)
data: rc like sy-subrc. "Código de retorno del Call Transaction


2.-Definir la tabla interna que contendrá los mensajes de la transacción. Ejemplo:


data: begin of mess_tab occurs 0.
include structure bdcmsgcoll.
data: end of mess_tab.



3.-Inicializar el log:


Esta función se invoca por única vez, al iniciar el ciclo que llena la tabla BDC. Verifica que el objeto o subobjeto exista y borra todos los datos existentes asociados:


...
call function 'APPL_LOG_INIT'
exporting
object = appl_log_obj
* subobject = ´ ´
* log_handle = ´ ´
exceptions
object_not_found = 1
subobect_not_found = 2
others = 3.
...


4. - Grabar el log:

Se completan las estructuras que se pasan como parámetros de la función, recorriendo la tabla interna de mensajes . También pueden armarse mensajes propios con datos específicos de la aplicación.
Esta función se invoca después de ejecutar el comando CALL TRANSACTION; se graba un mensaje y si no existe ninguna entrada para ese objeto, ésta es creada. Si no se especifica objeto o subobjeto, se asume el que
se usó más recientemente. Ejemplo:

...
call transaction ´Mxxx´ using bdc_tab mode ´N´ update ´S´ messages
into mess_tab.
rc = sy-subrc.
perform grabar_log using rc {zvar1} {zvar2}.
...
form grabar_log using status {zvar1} {zvar2}.
clear: i_msg, i_msg_bis.
if status ne 0.
* Mensaje de error:
loop at mess_tab.
move-corresponding mess_tab to i_msg.
i_msg-msgno = mess_tab-msgnr.
i_msg-msgty = msg_error.
i_msg-probclass = appl_log_class_high.
endloop.
* Se completa el segundo renglón del log con datos específicos de
la aplicación:
i_msg_bis-msgty = msg_error.
i_msg_bis-probclass = appl_log_class_high.
i_msg_bis-msgid = `{Zidmens1}`.
i_msg_bis-msgno = `999`.
i_msg_bis-msgv1 = {zvar1}.
i_msg_bis-msgv2 = {zvar2}.
else.
* Mensaje de éxito:
i_msg-msgty = msg_ok.
i_msg-msgid = `{Zidmens2}`.
i_msg-msgno = `nnn`.
i_msg-msgv1 = {zvar1}.
i_msg-msgv2 = {zvar2}.
endif.



5.- Finalizar el log:

Esta función se invoca por única vez, al terminar el ciclo que llena la tabla BDC. Graba todos los datos del objeto o subobjeto y si el log es nuevo, el número de log es devuelto al programa llamador:


...
refresh lognumber.
call function 'APPL_LOG_WRITE_DB'
exporting
object = appl_log_obj
* subobject = ´ ´
tables
object_with_lognumber = lognumber
exceptions
object_not_found = 1
subobject_not_found = 2
internal_error = 3
others = 4.
...



Bueno espero que os sea de utilidad.
Un saludo.

urjose
21/11/07, 02:30:40
Hola,

Colgandome un poco de este tema, como puedo saber si una transacción termino satisfactoriamente?

Es decir esta tabla de mensajes regresa muchos registros tipo W, S, E, etc.
Pero el hecho de que en la tabla venga un S no quiere decir que termino satisfactoriamente.

Cual sería la forma correcta de validar que el Call Trans. se ejecuto con normalidad?

Saludos

robert_milan
21/11/07, 08:26:58
Hola urjose;

ps lo mas correcto seria que no tuviera ningun tipo E.

bueno desde mi punto de vista

jorgeaguilarv
13/04/09, 23:12:31
Que tal como estan me parece muy bien tu ejemplo pero tengo una duda quiero usar el CALL TRANSACTION pero solo para mostrar otra pantalla de otro programa como puedo hacer para mostrar valores a esa pantalla que quiero llamar.

Saludos.

AlvarOtero
28/01/11, 19:48:53
Mi problema es el siguiente: Diariamente el area financiarea genera muchas facturas sobre muchas cosas, estas facturas estan relacionadas con la tabla transparente VBRK en la cual existem muchos campos, en especial 3, Fecha de creacion de factura, numero de factura y usuario que crea la faptura. Por ultimo estas facturas se muestran en uncomrpobante a los 20 - 30 dias de creadas las facturas, donde se imprimen y se archivan. Resulta que el requerimiento consiste en poner en algun lugar del comprobante (cosa que ya solucioné) el "terminal - pc - computador etc" desde el cual se CREÒ LA FACTURA, eh buscado por muchos lados sobre còmo obtener el terminal y eh encontrado muchas funciones que me retornan el terminal de un usuario conectado en el momento de uso de la funciòn, es decir, ninguna funciòn me retorna que terminal estaba usando un usuario hace 10 días por ejemplo......y como las facturas tiene mas de 20 dias de creadas no me sirven esas funciones al momento de consultar el terminal ya que un usuario que creó la factura el dia 20/01/2011 puede ser que se encuentre en un terminal distinto el dia 31/01/2011...día de la impresion del comprobante.....
Despues de tanto buscar encontre una transacción de auditoria (SM20) que ne genera un reporte segun un rango de fecha de los usuarios, transacciones terminales, usados en esas fechas, pero mi problema radica que la transaccion genera un log al cual no puedo acceder.......buscando auqi en mundosap encontre un post de usted que explicaba algo parecido a lo que necesito, asi que queria preguntarte si puedes ayudarme con este tema.......es simple, ejecutar la sm20 y guardar el resultado de esa transaccion en una tabla intera, con eso se me solucionaría la vida jejeje o encontrar en que tabla transparente se guarda un registro de varios dias sobre los ingresos de usuarios con todo y terminal...

jarabas
04/08/11, 07:37:27
Hola urjose;

ps lo mas correcto seria que no tuviera ningun tipo E.

bueno desde mi punto de vista


Buenos días, yo también comprobaría el sy-subrc cuando hay errores suele ser sy-subrc = '1001'.

Saludos.

rubencb28
02/02/12, 10:03:33
Gracias solucionado con sy-subrc = '1001'