|
#1
|
||||
|
||||
Log Display
Hola Amigos:
Tengo un problema estoy creando un log con la funcion estandar BAL_LOG_CREATE y todas sus funciones, pero el problema esta que en la parte donde le paso el contexto no me despliega nada en mi log, como si los datos nunca los grabara, otra cuestion es que si realiza la insercion de columnas pero no trae ningun dato. HELP ME PLEASE¡¡¡¡
__________________
Ing. José Ernesto Vera Osorno ABAP Software Libre |
#2
|
|||
|
|||
Buenas, compañero, revisa, la siguiente informacion, alli tienes un programa ejemplo, saludos espero te ayude |---------------------------------------------------------------------| | ¿Cómo se pueden recopilar mensajes? | |---------------------------------------------------------------------| Resumen ====================================================================== Aquí se exponen varios métodos para recopilar mensajes mediante el log de aplicación. Módulos de funciones: BAL_LOG_CREATE Crear log con cabecera BAL_LOG_MSG_ADD Añadir mensajes al log BAL_LOG_EXCEPTION_ADD Añadir excepción al log BAL_LOG_MSG_CUMULATE Añadir mensajes al log acumulándolos BAL_LOG_MSG_REPLACE Sustituir el último mensaje BAL_GLB_MSG_CURRENT_HANDLE_GET Proporcionar el programa para control de mensajes BAL_LOG_MSG_DELETE Borrar mensajes BAL_LOG_EXCEPTION_DELETE Borrar excepción BAL_LOG_MSG_CHANGE Modificar mensajes BAL_LOG_EXCEPTION_CHANGE Modificar excepción BAL_GLB_MSG_DEFAULTS_GET Asignaciones previas para traer datos de mensajes BAL_GLB_MSG_DEFAULTS_SET Asignaciones previas para fijar datos de mensajes Tipos BAL_S_MDEF Asignanciones previas para mensajes Programa de ejemplo El report SBAL_DEMO_02 simula la verificación de un vuelo. Se da salida a un log, en el que se ven los resultados de la verificación. ==>ejecutar SBAL_DEMO_02 ==>coding SBAL_DEMO_02 Añadir mensajes al protocol ======================================================================= Esta es la forma habitual de colocar mensajes en un log. Mediante BAL_LOG_MSG_ADD se puede, fácilmente, anexar un mensaje a un log. ==>Nota Al indicar el programa para control del log en los módulos de funciones como BAL_LOG_MSG_ADD, BAL_LOG_MSG_CUMULATE, BAL_LOG_MSG_ADD_FREE_TEXT, etc. es opcional. Si no se indica se toma el log por defecto. Éste puede indicarse mediante BAL_GLB_MSG_DEFAULTS_SET (junto con otros datos por defecto). Si no se ha definido un log por defecto, se fija automáticamente mediante BAL_LOG_CREATE (para más información, haga clic aquí). Añadir mensajes acumulándolos ======================================================================= Funciones Un mensaje se acumula con un log identificado por I_LOG_HANDLE ( programa para control de datos). Los datos de un mensaje se indican mediante el parámetro IMPORTING I_S_MSG (estructura BAL_S_MSG). Mediante E_S_MSG_HANDLE se obtiene un programa para control de mensajes que identifica el mensaje de forma unívoca. ¿Qué significa "acumular"? Algunos mensajes deben aparecer varias veces durante la ejecución de un programa sin que estas apariciones aporten informaciones nuevas. Para no cargar la memoria principal de forma innecesaria, algunos de estos pueden acumularse mediante BAL_LOG_MSG_CUMULATE. Si algunos mensajes del mismo tipo se emiten de forma repetida, no se vuelve a crear el mismo, sino que el contador MSG_COUNT las va sumando. Lo que significa "del mismo tipo" lo puede definir en el módulo de funciones. Los datos T100 deben ser idénticos en todo caso. Si lo desea, puede definir que otros datos deban ser iguales: I_COMPARE_ATTRIBUTES = "X" Los atributos de mensaje restantes (clase de problema PROBCLASS, nivel de detalle DETLEVEL y campo de clasificación ALSORT) deben ser iguales. I_COMPARE_CONTEXT = "X" También el contexto debe ser igual. I_COMPARE_PARAMETERS = 'X' También los parámetros del mensaje deben ser igual. Para encontrar un mensaje del mismo tipo lo más rápido posible durante la acumulación, el log de aplicación crea una pequeña tabla índice que contiene una signatura unívoca de un mensaje. Este índice sólo se elabora cuando se utilizar la función de acumulación. Sustituir el último mensaje ======================================================================= Funciones El último mensaje situado en el log de aplicación se borra y un nuevo mensaje lo sustituye. Los datos del nuevo mensaje se indican mediante el parámetro IMPORTING I_S_MSG (estructura BAL_S_MSG). Mediante E_S_MSG_HANDLE obtiene un programa para control de mensajes que identifica el nuevo mensaje unívocamente. ¿En qué log se sitúa el nuevo mensaje? Si no indica ningún programa para control de logs mediante I_LOG_HANDLE, entonces se sitúa en el mismo log en el que estaba el mensaje borrado. En caso contrario, el mensaje se coloca en el log identificado por I_LOG_HANDLE. Si no hay mensaje antiguo y no se indica ningún log mediante I_LOG_HANDLE, entonces se añade al log por defecto (para más detalles haga clic aquí). ¿Para qué sustituir el último mensaje? A veces, uno desea controlar un mensaje emitido al log de aplicación por un programa externo mediante un mensaje propio. Mediante el módulo de funciones BAL_LOG_MSG_REPLACE puede realizar esto. Ejemplo Un módulo de funciones genérico para la programación se llama para calcular los horarios de un vuelo. Si la programación no tiene éxito podría emitirse un mensaje a través de un módulo de funciones que dijera: "Programación para el proceso 0006 no concluida con éxito". Dado que los mensajes siempre deben registrarse en el log en el lugar donde se crean, este módulo escribe un mensaje en el log de aplicación. Para el usuario, sin embargo, sería mas útil si el mensaje dijera: "La planificación de horarios para el vuelo entre Hamburgo y Nueva York no se ha realizado correctamente". ==>Nota El programa para control del último mensaje puede también obtenerse mediante BAL_GLB_MSG_CURRENT_HANDLE_GET. Esto puede utilizarse si no desea sobreescribir el último mensaje escrito, sino borrarlo (mediante BAL_LOG_MSG_DELETE) o modificarlo ( BAL_LOG_MSG_CHANGE). Mensaje como texto libre ======================================================================= Funciones Un mensaje de texto libre se añade con un log identificado con I_LOG_HANDLE ( programa para control de logs). El texto del mensaje se indica al módulo de funciones BAL_LOG_MSG_ADD_FREE_TEXT mediante el parámetro IMPORTING I_TEXT (longitud máxima 200 caracteres). La gravedad del error (I_MSGTY) y (opcionalmente) la clase de problema (I_PROBCLASS) también pueden indicarse. Mediante E_S_MSG_HANDLE se obtiene un programa para control de mensajes que identifica los mensajes de forma unívoca. Asignaciones previas para colocar mensajes ======================================================================= Algunas informaciones que podrían ser importantes para entender un mensaje, no suelen identificarse en el lugar en el que aparecen sino en un nivel superior del programa. Ejemplo En una rutina muy inferior se comprueba si se ha indicado el destino para un transporte con camión. En este nivel, no se conoce ni el número de transporte ni el tramo parcial para los que se debe ejecutar. Para que los mensajes emitidos por esta rutina contengan las informaciones de contexto adecuadas, pueden asignarse previamente antes de que se llame esta rutina (fijar por defecto). Esto ocurre mediante BAL_GLB_MSG_DEFAULTS_SET. A este módulo de funciones se transmite el tipo de dato BAL_S_MDEF, que, además del contexto, contiene otros datos (como atributos de mensaje, parámetros, log por defecto, etc.). Se puede acceder a las asignaciones previas actuales mediante BAL_GLB_MSG_DEFAULTS_GET. Esto es importante, sobre todo, si no desea detirmanarlas nuevamente por completo, sino sólo modificar distintos aspectos (p.ej., el número de posición del contexto, pero no el número de orden). ==>Nota Siempre es aconsejable utilizar los módulos de funciones BAL_GLB_MSG_DEFAULTS_GET y BAL_GLB_MSG_DEFAULTS_SET combinándolos, dado que uno no puede estar seguro de qué asignaciones previas están fijadas para un determinado momento. Las asignaciones previas afectan a los módulos de funciones siguientes: BAL_LOG_MSG_ADD Añadir mensaje a un log BAL_LOG_EXCEPTION_ADD Añadir excepción a un log BAL_LOG_MSG_CUMULATE Acumular mensaje BAL_LOG_MSG_REPLACE Sustituir el último mensaje BAL_LOG_MSG_ADD_FREE_TEXT Añadir mensaje como texto libre Mensajes con contextos complejos ======================================================================= A veces, puede desear añadir otras informaciones mucho más complejas al mensaje (o a la cabecera de log), como puede hacerse a partir de un contexto o de parámetros. Para ello, el log de aplicación le proporciona un tipo de tabla INDX, que puede utilizarse mediante los comandos ABAP EXPORT TO DATABASE y IMPORT FROM DATABASE. El report SBAL_DEMO_06 muestra cómo pueden guardarse o leerse contextos complejos. Esto puede realizarse como sigue: Recopilar mensajes: Para una cabecera de log o un mensaje debe definirse una rutina CALLBACK (...-PARAMS-CALLBACK-...) Asimismo, deberán recopilarse las informaciones de contexto en tablas internas del programa de llamada. Grabar logs: En este evento, debe continuarse escribiendo las tablas mediante EXPORT my_data TO DATABASE bal_indx(al) ID lognumber.. El número de log interno se obtiene del módulo de funciones BAL_DB_SAVE. Visualización log: Si en la visualización de log se selecciona detallar un mensaje o una cabecera de log, entonces se ejecuta la rutina CALLBACK al recopilar. Aquí se pueden leer y presentar los datos mediante EXPORT my_data FROM DATABASE bal_indx(al) ID lognumber. El número de log interno LOGNUMBER está en esta rutina Callback interna transmitida (en PARAM = "%LOGNUMBER"). Borrar logs Aquí no debe realizarse nada por parte de la aplicación. Los datos se borran automáticamente. ==>Nota La información de contextos complejos debe utilizarse con precauciones. Podría dar problemas. Si (p.ej., a causa de un cambio de release) se ha modificado la estructura del contexto complejo MY_DATA, entonces ya no se pueden leer. Por el momento no se puede asegurar que el contexto complejo se archive automáticamente, si se realiza la funcionalidad archivo. (Por el momento, todavía no.) Añadir excepción al log ======================================================================= Funciones Un texto de excepción se añadirá al log identificado con I_LOG_HANDLE ( Protokollhandle) La clase de excepción, la gravedad del error, la clase de problema y el nivell de especificación se fijarán al módulo de funciones BAL_LOG_EXCEPTION_ADD mediante los parámetros IMPORTING I_S_EXC(estructura BAL_S_EXC). Las informaciones de contexto para excepciones y sumas acumuladas de excepciones no se soportan. Con E_S_MSG_HANDLE se recupera un handle de mensaje que este mensaje identifica unívocamente. => Nota: Este módulo de funciones sustituye al módulo de funciones BAL_LOG_EXC_ADD.
__________________
Lo unico que se, es que no se nada..... |
#3
|
||||
|
||||
Si esa informacion estuve buscando y la lei, pero encontre un programa identico al que quiero usar, pero al hacer los cambios en el log no me despliega los datos que he recueperado o los datos de contexto.
Este es el programa ************************************************************************ *&---------------------------------------------------------------------* *& Nombre del Programa: ZLOG_PANELCTRL *& Paquete : ZDEVELOP *& Transporte : DEVK969645 *& Creado por : Adrian Cordova Barrientos *& Creado el : 27 Abril del 2011 *& Descripción : Log de panel de control *&---------------------------------------------------------------------* ************************************************************************ REPORT ZLOG_PANELCTRL_CPY MESSAGE-ID SABAPDOCU. TABLES ZSD_LOG_PD. SELECT-OPTIONS : GUIA FOR ZSD_LOG_PD-ID_GUIA. * ENT FOR ZSD_LOG_PD-ENTREGA, * VBELNF FOR ZSD_LOG_PD-VBELN, * FECHA FOR SY-DATUM DEFAULT SY-DATUM. * USER FOR SY-UNAME, * HORA FOR SY-UZEIT. INCLUDE: SBAL_CONSTANTS, <ICON>. DATA: G_S_LOG TYPE BAL_S_LOG, G_LOG_HANDLE TYPE BALLOGHNDL, G_T_LOG_HANDLE TYPE BAL_T_LOGH, G_S_DISPLAY_PROFILE TYPE BAL_S_PROF. DATA : IT_ZSD_LOG_PD TYPE TABLE OF ZSD_LOG_PD . FIELD-SYMBOLS : <WA_LOG> TYPE ZSD_LOG_PD. DATA : WA_LOG TYPE ZWSD_LOG_PD_DOCU. ************************************************************************ *&---------------------------------------------------------------------* * MAIN PROGRAM *&---------------------------------------------------------------------* ************************************************************************ START-OF-SELECTION. SELECT MANDT ID TYPE NUMBER_M ID_GUIA ENTREGA VBELN FECHA HORA USUARIO TEXTO INTO TABLE IT_ZSD_LOG_PD FROM ZSD_LOG_PD WHERE ID_GUIA IN GUIA. * ENTREGA IN ENT AND ** VBELN IN VBELNF AND * FECHA IN FECHA. * USUARIO IN USER AND * HORA IN HORA. DELETE IT_ZSD_LOG_PD WHERE ID IS INITIAL. DELETE IT_ZSD_LOG_PD WHERE TYPE IS INITIAL. G_S_LOG-EXTNUMBER = 'Log de Documentacion'(EXT). G_S_LOG-ALUSER = SY-UNAME. G_S_LOG-ALPROG = SY-REPID. CALL FUNCTION 'BAL_LOG_CREATE' EXPORTING I_S_LOG = G_S_LOG IMPORTING E_LOG_HANDLE = G_LOG_HANDLE EXCEPTIONS OTHERS = 1. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. PERFORM MESSAGES_ADD USING G_LOG_HANDLE. * PERFORM CREATE_DISPLAY_PROFILE CHANGING G_S_DISPLAY_PROFILE. INSERT G_LOG_HANDLE INTO TABLE G_T_LOG_HANDLE. CALL FUNCTION 'BAL_DSP_LOG_DISPLAY' * EXPORTING * I_S_DISPLAY_PROFILE = G_S_DISPLAY_PROFILE * I_T_LOG_HANDLE = G_T_LOG_HANDLE EXCEPTIONS OTHERS = 1. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. END-OF-SELECTION. ************************************************************************ *&---------------------------------------------------------------------* * messages_add *&---------------------------------------------------------------------* ************************************************************************ FORM MESSAGES_ADD USING VALUE(I_LOG_HANDLE) TYPE BALLOGHNDL. DATA L_S_MESSAGE_DEFAULTS TYPE BAL_S_MDEF. L_S_MESSAGE_DEFAULTS-LOG_HANDLE = I_LOG_HANDLE. *{MJEVERA_20110620_1416_CHANGE CALL FUNCTION 'BAL_GLB_MSG_DEFAULTS_SET' EXPORTING I_S_MSG_DEFAULTS = L_S_MESSAGE_DEFAULTS EXCEPTIONS OTHERS = 0. *}MJEVERA_20110620_1416_CHANGE SORT IT_ZSD_LOG_PD BY ENTREGA. LOOP AT IT_ZSD_LOG_PD ASSIGNING <WA_LOG>. MOVE-CORRESPONDING <WA_LOG> TO WA_LOG. PERFORM CALCULATE_FACT USING WA_LOG SY-TABIX. ENDLOOP. ENDFORM. "MESSAGES_ADD ************************************************************************ *&---------------------------------------------------------------------* * FORM calculate_flight *&---------------------------------------------------------------------* ************************************************************************ FORM CALCULATE_FACT USING WA_LOG TYPE ZWSD_LOG_PD_DOCU VALUE(V_INDEX) TYPE SY-INDEX. DATA: L_S_MDEF TYPE BAL_S_MDEF, L_S_CONTEXT TYPE ZWSD_LOG_PD_DOCU, L_ERROR TYPE BOOLEAN, L_DUMMY TYPE C. *{MJEVERA_20110620_1416_CHANGE DATA: L_S_MSG TYPE BAL_S_MSG. CALL FUNCTION 'BAL_GLB_MSG_DEFAULTS_GET' IMPORTING E_S_MSG_DEFAULTS = L_S_MDEF EXCEPTIONS OTHERS = 0. *{MJEVERA_20110620_1416_CHANGE L_S_CONTEXT-ID = WA_LOG-ID. L_S_CONTEXT-TYPE = WA_LOG-TYPE. L_S_CONTEXT-NUMBER_M = WA_LOG-NUMBER_M. L_S_CONTEXT-ENTREGA = WA_LOG-ENTREGA. L_S_CONTEXT-VBELN = WA_LOG-VBELN. L_S_CONTEXT-ID_GUIA = WA_LOG-ID_GUIA. L_S_CONTEXT-FECHA = WA_LOG-FECHA. L_S_CONTEXT-HORA = WA_LOG-HORA. L_S_CONTEXT-USUARIO = WA_LOG-USUARIO. L_S_CONTEXT-TEXTO = WA_LOG-TEXTO. L_S_MDEF-CONTEXT-TABNAME = 'ZWSD_LOG_PD_DOCU'. L_S_MDEF-CONTEXT-VALUE = L_S_CONTEXT. *{MJEVERA_20110620_1416_CHANGE CALL FUNCTION 'BAL_GLB_MSG_DEFAULTS_SET' EXPORTING I_S_MSG_DEFAULTS = L_S_MDEF EXCEPTIONS OTHERS = 0. *}JEVERA_20110620_1416_CHANGE CASE WA_LOG-TYPE . WHEN 'S'. MESSAGE S888 WITH 'Proceso concluido correctamente' WA_LOG-VBELN INTO L_DUMMY. PERFORM MSG_ADD USING WA_LOG. WHEN 'E'. MESSAGE E888 WITH 'No se concluyo proceso' WA_LOG-ENTREGA INTO L_DUMMY. PERFORM MSG_ADD USING WA_LOG. WHEN 'W'. IF WA_LOG-VBELN IS INITIAL. MESSAGE E888 WITH 'Se concluyo proceso CON WARNING' WA_LOG-ENTREGA INTO L_DUMMY. PERFORM MSG_ADD USING WA_LOG. ELSEIF WA_LOG-VBELN IS NOT INITIAL. MESSAGE E888 WITH 'Se concluyo proceso CON WARNING' WA_LOG-VBELN INTO L_DUMMY. PERFORM MSG_ADD USING WA_LOG. ENDIF. ENDCASE. ENDFORM. "CALCULATE_FACT ************************************************************************ *&---------------------------------------------------------------------* * FORM MSG_ADD *&---------------------------------------------------------------------* ************************************************************************ FORM MSG_ADD USING WA_LOG TYPE ZwSD_LOG_PD_DOCU. DATA L_S_MSG TYPE BAL_S_MSG. L_S_MSG-MSGTY = WA_LOG-TYPE. L_S_MSG-MSGID = WA_LOG-ID. L_S_MSG-MSGNO = WA_LOG-NUMBER_M. L_S_MSG-MSGV1 = WA_LOG-TEXTO. * L_S_MSG-MSGV2 = "". * L_S_MSG-MSGV3 = SY-MSGV3. * L_S_MSG-MSGV4 = SY-MSGV4. CASE WA_LOG-TYPE . WHEN 'E'. L_S_MSG-PROBCLASS = 1. WHEN 'W'. L_S_MSG-PROBCLASS = 3. WHEN 'S'. L_S_MSG-PROBCLASS = 4. ENDCASE. CALL FUNCTION 'BAL_LOG_MSG_ADD' EXPORTING I_S_MSG = L_S_MSG EXCEPTIONS LOG_NOT_FOUND = 0 OTHERS = 1. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. "MSG_ADD ************************************************************************ *&---------------------------------------------------------------------* * FORM log_show *&---------------------------------------------------------------------* ************************************************************************ FORM CREATE_DISPLAY_PROFILE CHANGING C_S_DISPLAY_PROFILE TYPE BAL_S_PROF. DATA: L_S_FCAT TYPE BAL_S_FCAT, L_S_SORT TYPE BAL_S_SORT. CALL FUNCTION 'BAL_DSP_PROFILE_SINGLE_LOG_GET' IMPORTING E_S_DISPLAY_PROFILE = G_S_DISPLAY_PROFILE EXCEPTIONS OTHERS = 0. * C_S_DISPLAY_PROFILE-TITLE = 'Log de procesos Estandard'(SET). C_S_DISPLAY_PROFILE-HEAD_TEXT = 'Relacion documentacion nuevas'(RAF). C_S_DISPLAY_PROFILE-HEAD_SIZE = 35. C_S_DISPLAY_PROFILE-TREE_SIZE = 22. C_S_DISPLAY_PROFILE-DISVARIANT-REPORT = SY-REPID. C_S_DISPLAY_PROFILE-DISVARIANT-HANDLE = 'LOG'. C_S_DISPLAY_PROFILE-SHOW_ALL = 'X'. CLEAR L_S_FCAT. L_S_FCAT-REF_TABLE = 'ZWSD_LOG_PD_DOCU'. L_S_FCAT-REF_FIELD = 'FECHA'. L_S_FCAT-COL_POS = 3. * L_S_FCAT-OUTPUTLEN = 11. APPEND L_S_FCAT TO C_S_DISPLAY_PROFILE-MESS_FCAT. CLEAR L_S_FCAT. L_S_FCAT-REF_TABLE = 'ZWSD_LOG_PD_DOCU'. L_S_FCAT-REF_FIELD = 'HORA'. L_S_FCAT-COL_POS = 4. * L_S_FCAT-OUTPUTLEN = 10. APPEND L_S_FCAT TO C_S_DISPLAY_PROFILE-MESS_FCAT. CLEAR L_S_FCAT. L_S_FCAT-REF_TABLE = 'ZWSD_LOG_PD_DOCU'. L_S_FCAT-REF_FIELD = 'ENTREGA'. L_S_FCAT-COL_POS = 3. L_S_FCAT-OUTPUTLEN = 10. APPEND L_S_FCAT TO C_S_DISPLAY_PROFILE-MESS_FCAT. * C_S_DISPLAY_PROFILE-CLBK_UCOM-USEREXITT = CONST_CALLBACK_FORM. C_S_DISPLAY_PROFILE-CLBK_UCOM-USEREXITP = SY-REPID. C_S_DISPLAY_PROFILE-CLBK_UCOM-USEREXITF = 'BAL_CALLBACK_UCOMM'. C_S_DISPLAY_PROFILE-USE_GRID = 'X'. C_S_DISPLAY_PROFILE-EXP_LEVEL = 2. ENDFORM. "CREATE_DISPLAY_PROFILE ************************************************************************ *&---------------------------------------------------------------------* * FORM BAL_CALLBACK_UCOMM *&---------------------------------------------------------------------* ************************************************************************ FORM BAL_CALLBACK_UCOMM CHANGING C_S_USER_COMMAND_DATA TYPE BAL_S_CBUC. DATA WA_VALOR TYPE BAL_S_CBUC. CASE C_S_USER_COMMAND_DATA-LIST_FIELD. WHEN 'VBELN'. MOVE-CORRESPONDING C_S_USER_COMMAND_DATA TO WA_VALOR. SET PARAMETER ID 'VF' FIELD WA_VALOR-LIST_VALUE. CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN. WHEN 'ENTREGA' . MOVE-CORRESPONDING C_S_USER_COMMAND_DATA TO WA_VALOR. SET PARAMETER ID 'VL' FIELD WA_VALOR-LIST_VALUE. CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN. ENDCASE. C_S_USER_COMMAND_DATA-UCOMM_EXEC = 'X'. ENDFORM. "BAL_CALLBACK_UCOMM
__________________
Ing. José Ernesto Vera Osorno ABAP Software Libre |
Herramientas | Buscar en Tema |
Desplegado | |
|
|