Toolbar beeinflussen

Mit dem folgenden Beispielprogramm wollen wir zeigen, wie Sie eigene Knöpfe in die ALV-Grid-Toolbar einbauen können. Allerdings wollen wir es nicht bei einem Knopf belassen, sondern wollen hier den Zustand „gedrückt“ oder „nicht gedrückt“ verwalten.

Beschreibung

Das Programm erzeugt ein einfaches ALV-Grid mit den ersten zwanzig Einträgen der Ländertabelle. Dabei erzeugen wir einen eigenen „normalen“ Druckknopf.

Nachdem der Anwender diesen Druckknopf betätigt hat, wird das Ereignis SET_TOOLBAR_INTERACTIVE aufgerufen und die Toolbar wird erneut aufgebaut. Diesmal bekommt der Knopf jedoch den Zustand „gedrückt“.


Unser eigener Druckknopf im Originalzustand

Der gleiche Druckknopf, nachdem er einmal gedrückt wurde

TIPP:
Der Druckknopf wurde ans Ende der Standard-Druckknöpfe gehängt. Falls Sie ihn lieber am Anfang haben möchten, so müssen Sie den Knopf in der Methode BUILD_TOOLBAR nur zu Beginn der Tabelle einfügen (INSERT … INDEX 1)

Anpassungen

In dem Programm müssen Sie noch das Dynpro 100 anlegen und die Ablauflogik einsetzen (siehe unten). Den GUI-Status müssen Sie nicht definieren; wir nehmen den Standard-Status für Listen.

Coding

*&---------------------------------------------------------------------*
*& Report  ZZ_Toolbar
*&---------------------------------------------------------------------*
REPORT  zz_toolbar.

*** Event-Handler-Class schon hier bekannt machen
CLASS lcl_alv_eventhandler DEFINITION DEFERRED.
*** Event-Handler
DATA evt_handler TYPE REF TO lcl_alv_eventhandler.
*** ALV-Grid
DATA gr_alv      TYPE REF TO cl_gui_alv_grid.
*** CustomContainer des Grid
DATA gr_cc       TYPE REF TO cl_gui_custom_container.
*** Beispieltabelle "Länderbezeichnungen"
DATA gt_t005t    TYPE STANDARD TABLE OF t005t.


*----------------------------------------------------------------------*
*       CLASS lcl_alv_eventhandler DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_alv_eventhandler DEFINITION.

  PUBLIC SECTION.
*** Globales Feld um zu wissen, welchen Zustand der Knopf gerade hat
    DATA gv_pressed TYPE char1.

    METHODS:
*** User-Command auswerten
      handle_user_command      FOR EVENT user_command
            OF cl_gui_alv_grid
            IMPORTING e_ucomm sender,
*** Toolbar beeinflussen
      handle_toolbar           FOR EVENT toolbar
            OF cl_gui_alv_grid
            IMPORTING e_object e_interactive sender,
*** Eigenen Knopf an Toolbar anbauen
      build_toolbar 
            IMPORTING i_object TYPE REF TO cl_alv_event_toolbar_set.

ENDCLASS.                    "lcl_alv_eventhandler DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_alv_eventhandler IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_alv_eventhandler IMPLEMENTATION.

  METHOD handle_user_command.
*** HandleUserCommand                  ***
*>>> Hierdurch wird die Methode "HANDLE_TOOLBAR" erneut durchlaufen
    CALL METHOD gr_alv->set_toolbar_interactive.

  ENDMETHOD.                           "handle_user_command

  METHOD handle_toolbar.
*** HandleToolbar                      ***
    CALL METHOD build_toolbar
      EXPORTING
        i_object = e_object.

  ENDMETHOD.                    "handle_toolbar

  METHOD build_toolbar.
*** Toolbar erweitern

    DATA: ls_toolbar  TYPE stb_button.

*** Trenner
    CLEAR ls_toolbar.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO i_object->mt_toolbar.
*** Icon "Test"
    CLEAR ls_toolbar.
    MOVE 'TEST     '              TO ls_toolbar-function.
    MOVE 'Test'                   TO ls_toolbar-quickinfo.
    MOVE 'Testknopf'              TO ls_toolbar-text.
    IF gv_pressed = space.
*** Knopf war nicht gedrückt
      gv_pressed = 'X'.
      MOVE icon_led_green           TO ls_toolbar-icon.
      MOVE space                    TO ls_toolbar-checked.
    ELSE.
*** Knopf war gedrückt
      gv_pressed = space.
      MOVE icon_led_red             TO ls_toolbar-icon.
      MOVE 'X'                      TO ls_toolbar-checked.
    ENDIF.
    APPEND ls_toolbar TO i_object->mt_toolbar.

  ENDMETHOD.                    "build_toolbar

ENDCLASS.                    "lcl_alv_eventhandler IMPLEMENTATION


START-OF-SELECTION.
  CALL SCREEN 100.

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.

  SET PF-STATUS 'STLI' OF PROGRAM 'SAPMSSY0'.
  PERFORM init_alv.

ENDMODULE.                 " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  CASE sy-ucomm.
    WHEN 'BACK' OR '%EX' OR 'RW'.
      SET SCREEN 0.
      LEAVE SCREEN.
  ENDCASE.

ENDMODULE.                 " USER_COMMAND_0100  INPUT

*&---------------------------------------------------------------------*
*&      Form  init_alv
*&---------------------------------------------------------------------*
FORM init_alv.

  DATA ls_layout TYPE lvc_s_layo.

*** Nur einmal die Routine durchlaufen
  CHECK NOT gr_alv IS BOUND.

*** CustomContainer instanziieren
  CREATE OBJECT gr_cc
    EXPORTING
      container_name              = 'ALV'.

*** ALV starten
  CREATE OBJECT gr_alv
    EXPORTING
      i_parent          = gr_cc
       i_appl_events     = 'X'.

*** Ereignisbehandler
  CREATE OBJECT evt_handler.
  SET HANDLER evt_handler->handle_toolbar      FOR gr_alv.
  SET HANDLER evt_handler->handle_user_command FOR gr_alv.

*** Beispieldaten lesen
  SELECT * FROM t005t INTO TABLE gt_t005t UP TO 20 ROWS.

*** ALV-Grid ausgeben
  CALL METHOD gr_alv->set_table_for_first_display
    EXPORTING
      i_structure_name = 'T005T'
      is_layout        = ls_layout
    CHANGING
      it_outtab        = gt_t005t
    EXCEPTIONS
      OTHERS           = 4.

ENDFORM.                    "init_alv

Ablauflogik Dynpro 100

PROCESS BEFORE OUTPUT.
MODULE status_0100.
*
PROCESS AFTER INPUT.
MODULE user_command_0100.

 

Enno Wulff
follow me