Toolbar y funciones propias en ALV: botones que hacen tu trabajo
La barra estándar es solo el principio. Con SALV añades funciones propias con add_function; con ALV Grid, botones en el evento toolbar. Vemos ambos caminos con código ABAP real.
Por Logali Tech 2 min de lectura
Un ALV trae gratis ordenar, filtrar, sumar y exportar. Pero tu negocio casi siempre necesita algo más: un botón “Generar contrato”, un “Guardar cambios”, un “Enviar a aprobación”. Ahí es donde entra la función propia. Y otra vez, SALV y ALV Grid lo resuelven de forma distinta; conviene saber cuál usar.
En SALV: pide el objeto de funciones y añade
Con CL_SALV_TABLE, la barra de herramientas es un objeto (cl_salv_functions_list) que pides al ALV. Primero activas las funciones estándar, luego añades las tuyas.
FORM set_salv_functions.
DATA: lo_functions TYPE REF TO cl_salv_functions_list,
lv_name TYPE salv_de_function,
lv_icon TYPE string,
lv_tooltip TYPE string.
lo_functions = go_salv_table->get_functions( ).
lo_functions->set_all( ).
lv_name = 'RENT'.
lv_icon = icon_rental_agreement.
lv_tooltip = 'Contrato de renta'.
TRY.
lo_functions->add_function(
EXPORTING
name = lv_name
icon = lv_icon
tooltip = lv_tooltip
position = if_salv_c_function_position=>right_of_salv_functions ).
CATCH cx_salv_existing.
CATCH cx_salv_wrong_call.
ENDTRY.
ENDFORM.
set_all( ) habilita la barra completa de fábrica; add_function coloca tu botón a la derecha de las funciones estándar. El TRY ... CATCH no es opcional: la clase avisa por excepción si el nombre ya existe (cx_salv_existing) o la llamada es incorrecta (cx_salv_wrong_call).
Recoger la pulsación: el evento added_function
Añadir el botón es la mitad. Falta reaccionar cuando el usuario lo pulsa. En SALV eso llega por el evento added_function de cl_salv_events_table.
CLASS lcl_salv_event DEFINITION.
PUBLIC SECTION.
METHODS handle_added_function FOR EVENT added_function
OF cl_salv_events_table
IMPORTING e_salv_function.
ENDCLASS.
CLASS lcl_salv_event IMPLEMENTATION.
METHOD handle_added_function.
CASE e_salv_function.
WHEN 'RENT'.
" logica de negocio del boton Contrato
ENDCASE.
ENDMETHOD.
ENDCLASS.
Y el enlace, con el patrón de siempre: pides el objeto de eventos y registras el handler.
FORM set_salv_events.
DATA lo_events TYPE REF TO cl_salv_events_table.
IF go_salv_event IS NOT BOUND.
CREATE OBJECT go_salv_event.
lo_events = go_salv_table->get_event( ).
SET HANDLER go_salv_event->handle_added_function FOR lo_events.
ENDIF.
ENDFORM.
flowchart TB A["get_functions( )"] --> B["set_all( ) - barra estándar"] B --> C["add_function( name = RENT )"] C --> D["Botón visible en la barra"] D -->|"usuario lo pulsa"| E["evento added_function"] E --> F["handle_added_function - CASE RENT"]
En ALV Grid: el evento toolbar
Si trabajas con CL_GUI_ALV_GRID (por ejemplo, porque necesitas edición), la barra se construye en el evento toolbar, añadiendo tu botón a la tabla mt_toolbar:
METHOD handle_toolbar.
DATA ls_toolbar TYPE stb_button.
ls_toolbar-function = 'A_SAVE'.
ls_toolbar-quickinfo = 'Save'.
ls_toolbar-icon = '@F_SAVE@'.
APPEND ls_toolbar TO e_object->mt_toolbar.
ENDMETHOD.
La pulsación se recoge luego en handle_user_command mirando e_ucomm. Es más manual que SALV, pero te da control total sobre la barra.
Cuál usar
- Listado de solo lectura con acciones puntuales: SALV con
add_function. Menos código, excepciones tipadas. - Grid editable o barra muy personalizada:
CL_GUI_ALV_GRIDcon el eventotoolbar.
Un botón propio sin manejador es un botón que engaña al usuario. Añadir la función y registrar el evento son una sola tarea, no dos.
En el próximo post entramos en terreno delicado: el ALV editable, donde el usuario ya no solo lee, sino que escribe, y hay que validar.
¿Te ha resultado útil?
Gracias por tu valoración.
Comentarios
Aún no hay comentarios.