CL_SALV_TABLE als Auswahl-Popup

Die Klasse CL_SALV_TABLE ist super für alle Arbeiten rund um Grid-basierte Listen. Der riesengroße Vorteil des CL_SALV_TABLE ist der Umstand, dass man den Feldkatalog nicht selbst ermitteln muss, sondern die anzuzeigende Tabelle einfach der Methode CL_SALV_TABLE=>FACTORY übergeben kann. Das funktioniert selbst mit lokal im Programm definierten internen Tabellen.

Was liegt also näher, um dieses Verfahren auch für die Auswahl von Einträgen aus einer Liste zu verwenden? Um das SALV als Popup anzuzeigen, nutzt du die Methode SET_SCREEN_POPUP. Beim darauffolgenden DISPLAY wird das SALV als Popup angezeigt.

Einschränkungen

Leider hat diese Methode einige Einschränkungen, die es notwendig machen, doch wieder mehr drumherum zu programmieren, als eigentlich notwendig.

  • Es gibt keine Abbrechen-Drucktaste
  • Es kann kein Wert mit Doppelklick ausgewählt werden

Beiden Funktionen sind jedoch notwendig, um dem Anwendenden einen sinnvollen Dialog zu bieten, um einen Eintrag aus einer Liste auszuwählen.

Es gibt zwei schöne Beispiele in der Codezentrale, die zeigen, dass es möglich ist:

Das erste Beispiel verwendet sehr viel Coding, denn die fehlenden Drucktasten werden umständlich durch eine Toolbar und Splitter-Container realisiert. Die Lösung ist sehr schick und einmal programmiert, kann diese auch wieder verwendet werden.

In der zweiten Lösung, in der der SALV-Table als F4-Suchhilfe verwendet wird, fehlt leider der Doppelklick, um einen Eintrag auszuwählen.

Einfache Lösung

Meine Lösung nutzt die Registrierung des Doppelklick-Events vom SALV-Table und wertet den implizit vorhandenen Abbrechen-Funktionscode aus.

CL_SALV_TABLE als Auswahl-Popup

Abbruch

Das SAL-Popup hat zwar keine Abbrechen-Drucktaste, jedoch ist der Funktionscode über die Taste ESC aktiv, so dass der Dialog durch das Drücken der Escape-Taste beendet werden kann.

Der Funktionscode wird in der Systemvariablen SY-UCOMM gespeichert. Alle Funktionscodes der Klasse CL_SALV_TABLE sind in dem Interface IF_SALV_C_FUNCTION verfügbar. Nach Aufruf von salv->display() kann also SY-UCOMM abgefragt werden. Leider ist nach Drücken der Enter-Taste SY-UCOMM leer, so dass nicht nur if_salv_c_function=>continue sondern auch SPACE abgefragt werden müssen.

Doppelklick

Um der anwendenden Person einen Doppelklick zu ermöglichen, registriere ich das Ereignis DOUBLE_CLICK der Klasse CL_SALV_EVENTS_TABLE. Um direkt darauf das Popup auch schließen und die Auswahl bestätigen zu können, rufe ich den Funktionsbaustein SAPGUI_SET_FUNCTIONCODE mit dem Funktionscode für “Continue” auf.

Coding

PARAMETERS p_title TYPE string DEFAULT 'Weekday selection'.

PARAMETERS p_item1 TYPE c LENGTH 30 LOWER CASE DEFAULT 'MONMonday'.
PARAMETERS p_item2 TYPE c LENGTH 30 LOWER CASE DEFAULT 'TUETuesday'.
PARAMETERS p_item3 TYPE c LENGTH 30 LOWER CASE DEFAULT 'WEDWednesday'.
PARAMETERS p_item4 TYPE c LENGTH 30 LOWER CASE DEFAULT 'THUThursday'.
PARAMETERS p_item5 TYPE c LENGTH 30 LOWER CASE DEFAULT 'FRIFriday'.
PARAMETERS p_item6 TYPE c LENGTH 30 LOWER CASE DEFAULT 'SATSaturday'.
PARAMETERS p_item7 TYPE c LENGTH 30 LOWER CASE DEFAULT 'SUNSunday'.
CLASS cancelled DEFINITION INHERITING FROM cx_static_check.
ENDCLASS.

CLASS main DEFINITION.
  PUBLIC SECTION.
    TYPES: BEGIN OF _item,
             key   TYPE c LENGTH 3,
             value TYPE c LENGTH 20,
           END OF _item,
           _items TYPE STANDARD TABLE OF _item WITH DEFAULT KEY.
    METHODS set_items
      IMPORTING
        items TYPE _items.
    METHODS ask
      IMPORTING
        title         TYPE clike
      RETURNING
        VALUE(result) TYPE _item
      RAISING
        cancelled.
  PRIVATE SECTION.
    DATA salv_popup TYPE REF TO cl_salv_table.
    DATA items TYPE _items.


    METHODS: on_double_click FOR EVENT double_click OF cl_salv_events_table
      IMPORTING
        row
        column
        sender.
ENDCLASS.

CLASS main IMPLEMENTATION.
  METHOD set_items.

    me->items = items.
  ENDMETHOD.

  METHOD on_double_click.
    DATA(selections) = salv_popup->get_selections( ).
    selections->set_selected_rows( VALUE #( ( row ) ) ).
*    cl_gui_cfw=>set_new_ok_code( if_salv_c_function=>continue ).
    CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE'
      EXPORTING
        functioncode = if_salv_c_function=>continue.

  ENDMETHOD.

  METHOD ask.
    TRY.
        cl_salv_table=>factory(
          IMPORTING
            r_salv_table   = salv_popup
          CHANGING
            t_table        = items ).
        DATA(display) = salv_popup->get_display_settings( ).
        display->set_list_header( CONV #( title ) ).
        DATA(selections) = salv_popup->get_selections( ).
        selections->set_selection_mode( if_salv_c_selection_mode=>single ).
        selections->set_selected_rows( VALUE #( ( 1 ) ) ).
        DATA(columns) = salv_popup->get_columns( ).
        columns->set_optimize( abap_true ).
        salv_popup->set_screen_popup(
          start_column = 10
          end_column   = 30
          start_line   = 10
          end_line     = 17 ).
        SET HANDLER on_double_click FOR salv_popup->get_event( ).
        salv_popup->display( ).

        CASE sy-ucomm.
          WHEN space OR if_salv_c_function=>continue.
            DATA(selected_rows) = selections->get_selected_rows( ).
            DATA(selected_row) = selected_rows[ 1 ].
            result = items[ selected_row ].
          WHEN if_salv_c_function=>cancel.
            RAISE EXCEPTION TYPE cancelled.
        ENDCASE.

      CATCH cx_salv_msg INTO DATA(error).
        MESSAGE error TYPE 'I'.
    ENDTRY.

  ENDMETHOD.
ENDCLASS.

INITIALIZATION.
  DATA(my_popup) = NEW main( ).

AT SELECTION-SCREEN.
  my_popup->set_items(
    VALUE #(
      ( key = p_item1(3) value = p_item1+3(20) )
      ( key = p_item2(3) value = p_item2+3(20) )
      ( key = p_item3(3) value = p_item3+3(20) )
      ( key = p_item4(3) value = p_item4+3(20) )
      ( key = p_item5(3) value = p_item5+3(20) )
      ( key = p_item6(3) value = p_item6+3(20) )
      ( key = p_item7(3) value = p_item7+3(20) ) ) ).

  TRY.
      DATA(selected_entry) = my_popup->ask( p_title ).

      MESSAGE |you selected { selected_entry-value }| TYPE 'I'.
    CATCH cancelled.
      MESSAGE 'you cancelled the selection' TYPE 'I'.
  ENDTRY.
Enno Wulff
Letzte Artikel von Enno Wulff (Alle anzeigen)