Intento construir dinámicamente una barra de herramientas dependiendo de los criterios dados gracias al evento "barra de herramientas" en la clase cl_gui_alv_grid.

El problema es que la barra de herramientas está obteniendo mi botón personalizado, pero tan pronto como mis criterios ya no coinciden y me gustaría eliminar un botón, la barra de herramientas no se actualiza. Ejemplo aquí abajo

"Refresh button


CLEAR ls_toolbar.
  ls_toolbar-icon        = icon_refresh.
  ls_toolbar-quickinfo   = TEXT-ref.
  ls_toolbar-butn_type   = 0.
  ls_toolbar-text        = TEXT-ref.
  ls_toolbar-function    = 'REFRESH'.
  ls_toolbar-disabled    = abap_false.
  APPEND ls_toolbar      TO e_object->mt_toolbar.

  "Save button
  IF my_criteria is false.
    DELETE e_object->mt_toolbar WHERE function EQ 'SAVE'.
  ELSE.
    CLEAR ls_toolbar.
    ls_toolbar-icon        = icon_system_save.
    ls_toolbar-quickinfo   = TEXT-sav.
    ls_toolbar-butn_type   = 0.
    ls_toolbar-text        = TEXT-sav.
    ls_toolbar-function    = 'LAMA_SAVE'.
    ls_toolbar-disabled    = abap_false.
    APPEND ls_toolbar      TO e_object->mt_toolbar.

  ENDIF.

Cuando creo mi ALV, llamo al método lo_alv-> set_toolbar_interactive ().

Cuando entro al modo de depuración, veo que el botón de guardar se agrega o se elimina, pero no se refleja en la pantalla una vez que la barra de herramientas se ha mostrado al menos una vez.

1
flowx1710 17 sep. 2018 a las 18:34

4 respuestas

La mejor respuesta

Puedo lograr la funcionalidad que está buscando, pero no está claro cuál es su flujo exacto, podría haber varios orígenes del problema. Entonces, aquí hay una breve demostración de cómo debe hacerlo (el programa muestra un botón en la barra de herramientas, hace clic en él y desaparece, el resto del ALV permanece sin cambios).

REPORT zdemo.
CLASS lcl_app DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS pbo.
    CLASS-METHODS on_user_command FOR EVENT user_command OF cl_gui_alv_grid
            IMPORTING sender e_ucomm.
    CLASS-METHODS handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
            IMPORTING e_object e_interactive.
    CLASS-DATA alv_grid TYPE REF TO cl_gui_alv_grid.
    CLASS-DATA flights TYPE TABLE OF sflight.
ENDCLASS.

CLASS lcl_app IMPLEMENTATION.
  METHOD pbo.
    DATA: it_layout  TYPE lvc_s_layo,
          it_fcat    TYPE lvc_t_fcat,
          ls_exclude TYPE ui_func,
          gs_variant TYPE disvariant,
          lt_exclude TYPE ui_functions.

    IF alv_grid IS NOT BOUND.
      SELECT * FROM sflight INTO TABLE flights.

      ls_exclude = cl_gui_alv_grid=>mc_fc_excl_all.
      APPEND ls_exclude TO lt_exclude.

      CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
        EXPORTING i_structure_name = 'SFLIGHT'
        CHANGING ct_fieldcat = it_fcat
        EXCEPTIONS OTHERS = 3.
      CHECK sy-subrc = 0.

      CREATE OBJECT alv_grid
        EXPORTING
          i_parent = cl_gui_container=>screen0.

      SET HANDLER handle_toolbar FOR alv_grid.
      SET HANDLER on_user_command FOR alv_grid.
      CALL METHOD alv_grid->set_table_for_first_display
        EXPORTING
          is_layout            = it_layout
          it_toolbar_excluding = lt_exclude
          is_variant           = gs_variant
        CHANGING
          it_outtab            = flights
          it_fieldcatalog      = it_fcat
        EXCEPTIONS
          OTHERS               = 4.
    ENDIF.
  ENDMETHOD.

  METHOD handle_toolbar.
    DATA ls_toolbar TYPE stb_button.
    IF e_interactive = abap_false.
      " Added the first time only
      ls_toolbar-function  = 'DEMO'.
      ls_toolbar-text      = 'Click me and I will disappear'.
      APPEND ls_toolbar TO e_object->mt_toolbar.
    ENDIF.
  ENDMETHOD.

  METHOD on_user_command.
    IF e_ucomm = 'DEMO'.
      sender->set_toolbar_interactive( ).
    ENDIF.
  ENDMETHOD.
ENDCLASS.

PARAMETERS dummy.

AT SELECTION-SCREEN OUTPUT.
  lcl_app=>pbo( ).
0
Sandra Rossi 18 sep. 2018 a las 12:00

Si creo una instancia de cuadrícula ALV (1), la agrego a un contenedor personalizado principal, configuro sus controladores, la libero con instance1->free() and free instance1 y luego ... agrego una nueva instancia de cuadrícula ALV idéntica (2) a la misma contenedor personalizado, con manejadores, los manejadores de (2) no funcionan (¡los manejadores de (1) tampoco!), y la barra de herramientas de (1) se sigue mostrando.

Para escapar de este estado no amado y obtener una barra de herramientas dinámica ...

Si pongo un cl_gui_cfw=>flush( ) simple entre la creación y liberación de (1) y la creación de (2), los controladores de (2) funcionan como se esperaba, y la barra de herramientas refleja los íconos de la instancia (2) , como se esperaba.

Como se dijo, esto solo es relevante para el caso de dos instancias creadas "de una vez". El problema no ocurre teniendo solo uno.

0
Hartmut P. 27 sep. 2019 a las 14:27

Si no me equivoco, actualizar la cuadrícula ALV no reconstruye la barra de herramientas.

Creo que debe reinicializar la cuadrícula ALV con 'SET_TABLE_FOR_FIRST_DISPLAY' para tener la funcionalidad adicional de la barra de herramientas.

0
Ezgi Kaya 17 sep. 2018 a las 16:23

Sandra Rosssi tiene razón. Hubo dos instancias diferentes del ALVG y se puso complicado con el controlador, por eso la barra de herramientas no se estaba actualizando correctamente.

Gracias a todos,

0
flowx1710 19 sep. 2018 a las 12:07