ABAP: PopUp mit ALV in Userexit oder ähnlichem

April 20, 2018 0 Von SAP Guy

Ab und zu möchte man ein PopUp in einem Userexit einfügen um den Benutzer auf etwas hinzuweisen oder auch eine Auswahl treffen zu lassen. Wird dabei eine Tabelle benötigt, dann ist ein PopUp mit ALV nützlich. Das ist auch gar nicht mal so schwer zu realisieren.

Ein PopUp darf nur im Dialogmodus, also nicht im Batch- oder Updateprozess angezeigt werden, daher erst einmal prüfen ob der Benutzer sich im Dialogmodus befindet. Zusätzlich kann noch der Transaktionscode abgefragt werden, falls die Anzeige des PopUp mit ALV nur in bestimmten Transaktionen erwünscht ist.

DATA: lv_in_update  LIKE          sy-subrc.
CALL FUNCTION 'TH_IN_UPDATE_TASK'
    IMPORTING
      in_update_task = lv_in_update.
 
  IF ( sy-tcode = 'VL01N' OR sy-tcode = 'VL02N' ) AND
       lv_in_update = 0 AND sy-batch = ''.

Datendeklarationen für ALV:

DATA:   go_alv        TYPE REF TO   cl_salv_table,
        lt_cols       TYPE REF TO   cl_salv_columns_table,
        lr_functions  TYPE REF TO   cl_salv_functions_list.

Nachdem die Daten selektiert wurden kann ein ALV erstellt und angezeigt werden. Es gibt dort extra die Funktion ‘set_screen_popup’ um den ALV als Popup darzustellen. Die Parameter legen die Größe des PopUps fest. Die Spalten sollten optimiert werden, damit die Texte immer vollständig zu lesen sind. Das bringt jedoch den Nachteil, dass man die Breite des Fensters nicht immer ganz genau an den Inhalt anpassen kann.

 TRY.
              cl_salv_table=>factory(
                IMPORTING
                  r_salv_table = go_alv
                CHANGING
                  t_table      = lt_pos ).
            CATCH cx_salv_msg.
          ENDTRY.
 
          lr_functions = go_alv->get_functions( ).
          lr_functions->set_all( 'X' ).
 
          lt_cols = go_alv->get_columns( ).
          lt_cols->set_optimize( ).
 
          IF go_alv IS BOUND.
            go_alv->set_screen_popup(
              start_column = 1
              end_column  = 60
              start_line  = 1
              end_line    = 10
              ).
 
            go_alv->display( ).
          ENDIF.