Los nervios casi me destrozan, pero misión completada!! Termine mi Máster universitario en investigación en ingeniería de software y sistemas informáticos!!
jueves, 6 de octubre de 2016
lunes, 3 de octubre de 2016
Defensa del trabajo de fin de Máster
Mañana me toca viajar a Madrid a defender mi TFM
"Generación automática de código ABAP para sistemas SAP R3"
Un trabajo con el que me he introducido en las arquitecturas dirigidas a modelos (MDA) y la creación de modelos que generen automáticamente el código utilizando Eclipse Modeling Tools y Acceleo.
...que nervios...
"Generación automática de código ABAP para sistemas SAP R3"
Un trabajo con el que me he introducido en las arquitecturas dirigidas a modelos (MDA) y la creación de modelos que generen automáticamente el código utilizando Eclipse Modeling Tools y Acceleo.
...que nervios...
![]() |
jueves, 2 de junio de 2016
Aun seguimos aqui
Perdón por la inactividad del blog.
No he desaparecido. Y sí, voy a continuar escribiendo pero este año esta siendo complicado.
Es mi ultimo año de Master por la UNED y entre el máster y el trabajo me queda poco tiempo para encargarme del blog.
Lo dicho, perdonar la inactividad.
En breves volveremos.
Un saludo a todos.
No he desaparecido. Y sí, voy a continuar escribiendo pero este año esta siendo complicado.
Es mi ultimo año de Master por la UNED y entre el máster y el trabajo me queda poco tiempo para encargarme del blog.
Lo dicho, perdonar la inactividad.
En breves volveremos.
Un saludo a todos.
miércoles, 9 de marzo de 2016
Clase CL_SALV_TABLE: Toolbar, pulsadores y funciones a medida - parte I
Hasta ahora, hemos explicado como mostrar la información que extraemos de la base de datos y como modificar los atributos de la columnas del listado ALV. Pero los usuarios, rara vez solamente quieren "ver" la información, lo normal es que quieran interactuar con ella de diferentes formas. Por ejemplo ordenar el listado, imprimir el listado descargar el listado en una hoja excel, etc...
Para añadir funcionalidades a medida a los listados ALV, la CL_SALV_TABLE incluye pulsadores y funciones estándar que podemos configurar antes de llamar al método display( ) .
Tambien es posible añadir pulsadores personalizados que llamen a funciones diseñadas para propósitos específicos.
Para crear vuestro propio status de usuario, podeios copiar el status SALV_STANDARD del programa SALV_DEMO_METADATA desde la trnasacción SE38
Si activamos y ejecutamos, aparecerán los pulsadores de nuestro status gui. Pero si los pulsamos, no sucederá nada. Para asignar una función a un pulsador, primero necesitamos implementar una clase de eventos y enlazarla a nuestra clase CL_SALV_TABLE.
1.- Crear la siguiente definición para la clase de eventos CLASS_HANDLE_EVENTS. En este caso, solamente implementamos el evento ON_USER_COMMAND, pero se pueden implementar mas eventos que explicare en otra entrada.
2.- Crear la implementacion de la clase y el método ON_USER_COMMAND.
3.- El ultimo paso es enlazar la clase de eventos con nuestra instancia de la clase CL_SALV_TABLES. Esto significa que cuando se produzca un evento ( doble click, pulsar un boton de la barra de herramientas, etc...) sera "escuchado" por la clase de eventos y ejecutara el metodo asignado al evento.
Como podéis observar el parámetro de entrada e_alv_funcion contiene el código de función del pulsador que ha seleccionado el usuario en la barra de herramientas. Identificando ese código en el método ON_USER_COMMAND podemos identificar, procesar y actuar en función de la acción realizada por del usuario ( por ejemplo grabar los datos, ejecutar una bapi, salir del programa, etc...).
Todo evento que queráis en vuestro ALV tenéis que enlazarlo con la clase CL_SALV_TABLES:
Aquí os dejo un ejemplo completo, Es un listado de materiales, con pulsadores a medida.
No os olvidéis de crear el status gui y añadirle los pulsadores a medida
En la siguiente entrada os mostrare como añadir pulsadores y menús a la barra de herramientas utilizando eventos.
try. cl_salv_table=>factory( importing r_salv_table = gr_table changing t_table = ti_mara ). gr_table->get_functions( )->set_all( if_salv_c_bool_sap=>true ). "TODOS los pulsadores estandard * gr_table->get_functions( )->set_default( if_salv_c_bool_sap=>true ). "Solamente algunos puls estandard gr_table->display( ). catch cx_salv_msg into cx_salv. * Gestionamos las excepciones que puedan suceder gr_msg = cx_salv->get_text( ). message gr_msg type 'E'. catch cx_salv_not_found into cx_not_found. gr_msg = cx_not_found->get_text( ). message gr_msg type 'E' endtry.
![]() |
Toolbar estándar creada con el metodo set_all( if_salv_c_bool_sap=>true ) |
![]() |
Toolbar estándar creada con el metodo set_default( if_salv_c_bool_sap=>true ) |
Tambien es posible añadir pulsadores personalizados que llamen a funciones diseñadas para propósitos específicos.
Para crear vuestro propio status de usuario, podeios copiar el status SALV_STANDARD del programa SALV_DEMO_METADATA desde la trnasacción SE38
- Transacción SE38 -> SALV_DEMO_METADATA -> Status GUI -> SALV_STANDARD
- Situar el cursor sobre Status GUI -> SALV_STANDARD
- Pulsar el botón derecho del ratón -> Copiar
- Introducimos el nombre de nuestro programa y el nuevo nombre del status gui
- En la copia que hemos realizado, añadir los pulsadores a medida que necesitamos.
- Vincular el STATUS GUI al ALV utilizando el método set_screen_status( ).
- Activarlo todo
try. cl_salv_table=>factory( importing r_salv_table = gr_table changing t_table = ti_mara ). gr_table->set_screen_status( pfstatus = 'ZZSTATUS_001' "Nuestro STATUS GUI report = sy-repid set_functions = gr_table->c_functions_all ). gr_table->display( ). catch cx_salv_msg into cx_salv. * Gestionamos las excepciones que puedan suceder gr_msg = cx_salv->get_text( ). message gr_msg type 'E'. catch cx_salv_not_found into cx_not_found. gr_msg = cx_not_found->get_text( ). message gr_msg type 'E' endtry.
Si activamos y ejecutamos, aparecerán los pulsadores de nuestro status gui. Pero si los pulsamos, no sucederá nada. Para asignar una función a un pulsador, primero necesitamos implementar una clase de eventos y enlazarla a nuestra clase CL_SALV_TABLE.
1.- Crear la siguiente definición para la clase de eventos CLASS_HANDLE_EVENTS. En este caso, solamente implementamos el evento ON_USER_COMMAND, pero se pueden implementar mas eventos que explicare en otra entrada.
*---------------------------------------------------------------------* * CLASS class_handle_events DEFINITION *---------------------------------------------------------------------* * define a local class for handling events of cl_salv_table *---------------------------------------------------------------------* class class_handle_events definition. public section. methods: on_user_command for event added_function of cl_salv_events importing e_salv_function. "e_salv_function es como el OK_CODE de las dynpros endclass. "lcl_handle_events DEFINITION
*---------------------------------------------------------------------* * CLASS lcl_handle_events IMPLEMENTATION *---------------------------------------------------------------------* * implement the events for handling the events of cl_salv_table *---------------------------------------------------------------------* class class_handle_events implementation. method on_user_command. case e_salv_function. "Contiene el cod. de funcion del pulsador seleccionado WHEN 'GO_VBELN'. "mensaje por pantalla MESSAGE "Esto es una prueba, funcion GO_VBELN" display like 'I'. ENDCASE. endmethod. endclass. "lcl_handle_events IMPLEMENTATION
3.- El ultimo paso es enlazar la clase de eventos con nuestra instancia de la clase CL_SALV_TABLES. Esto significa que cuando se produzca un evento ( doble click, pulsar un boton de la barra de herramientas, etc...) sera "escuchado" por la clase de eventos y ejecutara el metodo asignado al evento.
Como podéis observar el parámetro de entrada e_alv_funcion contiene el código de función del pulsador que ha seleccionado el usuario en la barra de herramientas. Identificando ese código en el método ON_USER_COMMAND podemos identificar, procesar y actuar en función de la acción realizada por del usuario ( por ejemplo grabar los datos, ejecutar una bapi, salir del programa, etc...).
Todo evento que queráis en vuestro ALV tenéis que enlazarlo con la clase CL_SALV_TABLES:
DATA r_handler_salv_table type REF TO class_handle_events. try. cl_salv_table=>factory( importing r_salv_table = gr_table changing t_table = ti_mara ). gr_table->set_screen_status( pfstatus = 'ZZSTATUS_001' "Nuestro STATUS GUI report = sy-repid set_functions = gr_table->c_functions_all ). * Creamos la instancia de la clase de eventos y registramos el evento on_user_command CREATE OBJECT r_handler_salv_table. set handler r_handler_salv_table->on_user_command for gr_table->get_event( ). gr_table->display( ). catch cx_salv_msg into cx_salv. * Gestionamos las excepciones que puedan suceder gr_msg = cx_salv->get_text( ). message gr_msg type 'E'. catch cx_salv_not_found into cx_not_found. gr_msg = cx_not_found->get_text( ). message gr_msg type 'E' endtry.
Aquí os dejo un ejemplo completo, Es un listado de materiales, con pulsadores a medida.
No os olvidéis de crear el status gui y añadirle los pulsadores a medida
En la siguiente entrada os mostrare como añadir pulsadores y menús a la barra de herramientas utilizando eventos.
![]() |
STATUS GUI de nuestro ALV |
![]() |
CL_SALV_TABLE con pulsadores a medida |
*&---------------------------------------------------------------------* *& Report: ZZCL_SALV_TABLE_FULL_SCREEN *& Autor : David Rueda Barrón *&---------------------------------------------------------------------* *& Creacion de ALV a pantalla completa con la clase CL_SALV_TABLE *& Se añaden 3 pulsadores a medida con un STATUS GUI *& La clase de eventos CLASS_HANDLE_EVENTS recoje los eventos *&---------------------------------------------------------------------* report zzcl_salv_table_full_screen. *---------------------------------------------------------------------* * CLASS class_handle_events DEFINITION *---------------------------------------------------------------------* * define a local class for handling events of cl_salv_table *---------------------------------------------------------------------* class class_handle_events definition. public section. methods: on_user_command for event added_function of cl_salv_events importing e_salv_function. "e_salv_function es como el OK_CODE de las dynpros endclass. "lcl_handle_events DEFINITION *---------------------------------------------------------------------* * CLASS lcl_handle_events IMPLEMENTATION *---------------------------------------------------------------------* * implement the events for handling the events of cl_salv_table *---------------------------------------------------------------------* class class_handle_events implementation. method on_user_command. case e_salv_function. "Contiene el cod. de funcion del pulsador seleccionado WHEN 'GO_VBELN'. "mensaje por pantalla MESSAGE 'Esto es una prueba, funcion GO_VBELN' TYPE 'I'. WHEN 'GO_VF03'. MESSAGE 'Esto es una prueba, funcion GO_VF03' TYPE 'I'. WHEN 'GO_MM02'. MESSAGE 'Esto es una prueba, funcion MM02' TYPE 'I'. ENDCASE. endmethod. endclass. "lcl_handle_events IMPLEMENTATION *---------------------------------------------------------------------* * TIPOS, ESTRUCTURAS y VARIABLES GLOBALES *---------------------------------------------------------------------* types: begin of type_matnr, matnr type mara-matnr, maktx type makt-maktx, mtart type mara-mtart, matkl type mara-matkl, meins type mara-meins, end of type_matnr. * Tabla interna con los datos del ALV data ti_mara type standard table of type_matnr. data gr_table type ref to cl_salv_table. data r_handler_salv_table type REF TO class_handle_events. *Variables globales para gestionar las excepciones data gr_msg type string. data cx_salv type ref to cx_salv_msg. data cx_not_found TYPE ref to cx_salv_not_found. *&---------------------------------------------------------------------* *& START-OF-SELECTION *&---------------------------------------------------------------------* start-of-selection. select m~matnr t~maktx m~mtart m~matkl m~meins into corresponding fields of table ti_mara from mara as m inner join makt as t on m~matnr eq t~matnr and t~spras eq sy-langu. try. cl_salv_table=>factory( importing r_salv_table = gr_table changing t_table = ti_mara ). catch cx_salv_msg into cx_salv. * Gestionamos las excepciones que puedan suceder gr_msg = cx_salv->get_text( ). message gr_msg type 'E'. endtry. try. * Registramos el status gui para el ALV gr_table->set_screen_status( pfstatus = 'ZZSTATUS_001' "Nuestro STATUS GUI report = sy-repid set_functions = gr_table->C_FUNCTIONS_ALL ). * Creamos la instancia de la clase de eventos y registramos el evento on_user_command CREATE OBJECT r_handler_salv_table. SET HANDLER r_handler_salv_table->on_user_command for gr_table->get_event( ). catch cx_salv_msg into cx_salv. gr_msg = cx_salv->get_text( ). message gr_msg type 'E'. catch cx_salv_not_found into cx_not_found. gr_msg = cx_not_found->get_text( ). message gr_msg type 'E'. endtry. gr_table->display( ).
Entradas anteriores:
Entradas siguientes:
Clase CL_SALV_TABLE: Toolbar, pulsadores y funciones a medida - parte II
Suscribirse a:
Entradas (Atom)