[ABAP] Popup mit einspaltige Auswahl (Tabelle) anzeigen

TYPES: BEGIN OF t_line,
         vorname TYPE char255,
         name    TYPE char255,
         age     TYPE i,
       END OF t_line.

DATA: it_selection TYPE STANDARD TABLE OF t_line.
DATA: lv_choise TYPE i.

it_selection = VALUE #( ( vorname = 'Horst' name = 'Lehmann' age = '70' )
                        ( vorname = 'Udo' name = 'Beyer' age = '50' )
                        ( vorname = 'Heinz' name = 'Schmidt' age = '50' ) ).

CALL FUNCTION 'POPUP_WITH_TABLE_DISPLAY'
  EXPORTING
    endpos_col   = 20
    endpos_row   = 20
    startpos_col = 3
    startpos_row = 3
    titletext    = 'Auswahl'
  IMPORTING
    choise       = lv_choise
  TABLES
    valuetab     = it_selection
  EXCEPTIONS
    break_off    = 1
    OTHERS       = 2.

IF sy-subrc <> 0.
ELSE.
  IF lv_choise EQ 0.
    WRITE 'Nichts ausgewählt.'.
  ELSE.
    WRITE: / 'Zeile: ', lv_choise.
    WRITE: / 'Wert:', it_selection[ lv_choise ]-name.
  ENDIF.
ENDIF.

[ABAP] ALV – Auswahlpopup für Selektion einer Anzeigevariante anzeigen

DATA: ls_variant LIKE disvariant.
DATA: lv_exit TYPE c.

PARAMETERS p_vari LIKE disvariant-variant.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_vari.

  CLEAR ls_variant.

  ls_variant-report = sy-repid.
  ls_variant-username = sy-uname.

  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
    EXPORTING
      is_variant    = ls_variant
      i_save        = 'A'
    IMPORTING
      e_exit        = lv_exit
      es_variant    = ls_variant
    EXCEPTIONS
      not_found     = 1
      program_error = 2
      OTHERS        = 3.

  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    IF lv_exit EQ space.
      p_vari = ls_variant-variant.
    ENDIF.
  ENDIF.

[ABAP] Alle Elemente des Selektionsbildschirmes auslesen

DATA: it_fields TYPE STANDARD TABLE OF dynpread.
DATA: wa_field LIKE LINE OF it_fields.
DATA: lv_field_type TYPE c.
FIELD-SYMBOLS: <field> TYPE any.

PARAMETERS: ... " irgendwelche Selektionsparameter auf dem Selektionsbild plazieren

AT SELECTION-SCREEN.
  " Dynpro Feldwerte lesen vor Feldtransport
  CALL FUNCTION 'DYNP_VALUES_READ'
  EXPORTING
    dyname                   = sy-repid
    dynumb                   = sy-dynnr
    request                  = 'A' " alle Elemente auslesen
    perform_conversion_exits = ' '
    perform_input_conversion = ' '
  TABLES
    dynpfields               = it_fields
  EXCEPTIONS
    OTHERS                   = 11.
    
START-OF-SELECTION.
  " ausgelesene Elemente und deren Werte ausgeben
  LOOP AT it_fields INTO wa_field.
    ASSIGN (wa_field-fieldname) TO <field>.
    DESCRIBE FIELD <field> TYPE lv_field_type.
    WRITE: / |{ <field> }: { lv_field_type }|.
  ENDLOOP.

[ABAP] Eigene F4-Suchhilfe anzeigen (Funktionsbaustein)

TYPES: BEGIN OF ty_mara,
         matnr TYPE mara-matnr,
         ernam TYPE mara-ernam,
       END OF ty_mara.

DATA: it_mara TYPE TABLE OF ty_mara.
DATA: it_return TYPE TABLE OF ddshretval.

PARAMETERS: p_matnr TYPE mara-matnr.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_matnr.

  CLEAR: it_mara.

  SELECT matnr, ernam FROM mara
    INTO CORRESPONDING FIELDS OF TABLE @it_mara
    UP TO 20 ROWS
    ORDER BY matnr.

* F4-Hilfe mit Übergabe der anzuzeigenden Werte in interner Tabelle
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'MATNR'       " Spalte der internen Tabelle bei value_tab
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      dynprofield     = 'P_MATNR'     " Name des Dynpro-Feldes für die automatische Werterückgabe
      value_org       = 'S'           " Werteübergabe: C: zellenweise, S: strukturiert
      window_title    = 'Auswahl'
    TABLES
      value_tab       = it_mara       " Übergabe-Tabelle mit Werten für die Anzeige und Auswahl
      return_tab      = it_return     " Rückgabe-Tabelle mit den ausgewählten (geklickten) Elementen
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.

  IF sy-subrc = 0.
    IF lines( it_return ) > 0.
      MESSAGE it_return[ 1 ]-fieldval TYPE 'S'.
    ENDIF.
  ENDIF.

[ABAP] Oberflächenelemente per Button ausblenden

TABLES: sscrfields.

CONSTANTS: BEGIN OF e_status,
             open  TYPE i VALUE 0,
             close TYPE i VALUE 1,
           END OF e_status.

DATA: status_blk2 TYPE i.

SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE title1.
PARAMETERS: p1 TYPE string.
SELECTION-SCREEN: END OF BLOCK blk1.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON (4) btn_oc USER-COMMAND btn_cmd_oc.
SELECTION-SCREEN COMMENT 6(25) lbl_oc.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN: BEGIN OF BLOCK blk2 WITH FRAME TITLE title2.
PARAMETERS: s1 TYPE string MODIF ID b2.
PARAMETERS: s2 TYPE string MODIF ID b2.
SELECTION-SCREEN: END OF BLOCK blk2.

INITIALIZATION.
  title1 = 'Kundennummer'.
  title2 = 'Eingabe'.

  lbl_oc  = 'Eingabe'.

  status_blk2 = e_status-close.

  PERFORM set_btn_icon USING status_blk2 CHANGING btn_oc.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN INTO DATA(wa).
    CASE wa-group1.       " Name der Modifikationsgruppe
      WHEN 'B2'.          " wenn in Modifikationsgruppe 'B2'
        IF status_blk2 = e_status-open.
          wa-active = '1'.
        ELSE.
          wa-active = '0'.
        ENDIF.
    ENDCASE.

    MODIFY SCREEN FROM wa.
  ENDLOOP.

  PERFORM set_btn_icon USING status_blk2 CHANGING btn_oc.

AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'BTN_CMD_OC'.
      IF status_blk2 = e_status-open.
        status_blk2 = e_status-close.
      ELSE.
        status_blk2 = e_status-open.
      ENDIF.
  ENDCASE.

FORM set_btn_icon USING iv_status TYPE i CHANGING btn_icon TYPE any.
  CASE iv_status.
    WHEN e_status-close.
      btn_icon = icon_data_area_expand.
    WHEN e_status-open.
      btn_icon = icon_data_area_collapse.
  ENDCASE.
ENDFORM.

[ABAP] Subscreens auf dem Selektionsbild verwenden und per Pushbutton umschalten

SELECTION-SCREEN COMMENT /1(50) comm1.
SELECTION-SCREEN SKIP.

* TabStrip als Containerobjekt, ohne Tabs
SELECTION-SCREEN BEGIN OF TABBED BLOCK sub FOR 3 LINES.
SELECTION-SCREEN END OF BLOCK sub.

* Umschaltbuttons
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
SELECTION-SCREEN PUSHBUTTON (10) btn_1 USER-COMMAND btn_back.
SELECTION-SCREEN PUSHBUTTON (10) btn_2 USER-COMMAND btn_fwd.
SELECTION-SCREEN END OF LINE.

* SUBSCREEN 1
SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE title1.
PARAMETERS: p1 TYPE string.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN END OF SCREEN 100.

* SUBSCREEN 2
SELECTION-SCREEN BEGIN OF SCREEN 200 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE title2.
PARAMETERS: p2 TYPE string.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN END OF SCREEN 200.

* SUBSCREEN 3
SELECTION-SCREEN BEGIN OF SCREEN 300 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE title3.
PARAMETERS: p3 TYPE string.
SELECTION-SCREEN END OF BLOCK b3.
SELECTION-SCREEN END OF SCREEN 300.

INITIALIZATION.
  comm1 = 'Beispiel für die Verwendung von Subscreens'.

  title1 = 'Sub1'.
  title2 = 'Sub2'.
  title3 = 'Sub3'.

  btn_1 = |{ icon_column_left }Zurück|.
  btn_2 = |{ icon_column_right }Vor|.

* Subscreen 100 anzeigen
  sub-prog = sy-repid.
  sub-dynnr = 100.

  p1 = '11'.
  p2 = '22'.
  p3 = '33'.

AT SELECTION-SCREEN.

  CASE sy-dynnr.
    WHEN 100.
      IF sy-ucomm = 'BTN_BACK'.
        sub-dynnr = 300.
      ELSEIF sy-ucomm = 'BTN_FWD'.
        sub-dynnr = 200.
      ENDIF.
    WHEN 200.
      IF sy-ucomm = 'BTN_BACK'.
        sub-dynnr = 100.
      ELSEIF sy-ucomm = 'BTN_FWD'.
        sub-dynnr = 300.
      ENDIF.
    WHEN 300.
      IF sy-ucomm = 'BTN_BACK'.
        sub-dynnr = 200.
      ELSEIF sy-ucomm = 'BTN_FWD'.
        sub-dynnr = 100.
      ENDIF.
  ENDCASE.

START-OF-SELECTION.

  WRITE: / p1, p2, p3.

[ABAP] Verwendung von Tabstips auf dem Selektionsbildschirm

Variante 1 (Tabstrip (TabControl) verwenden)

* Tabstrip erzeugen, 10 Zeilen hoch
SELECTION-SCREEN BEGIN OF TABBED BLOCK tbl FOR 10 LINES.
SELECTION-SCREEN TAB (15) tbl_tab1 USER-COMMAND tab1 DEFAULT SCREEN 9001.
SELECTION-SCREEN TAB (15) tbl_tab2 USER-COMMAND tab2 DEFAULT SCREEN 9002.
SELECTION-SCREEN END OF BLOCK tbl.

* Subscreen 9001 für Tab1
SELECTION-SCREEN BEGIN OF SCREEN 9001 AS SUBSCREEN.
PARAMETERS: pa_test.
SELECTION-SCREEN END OF SCREEN 9001.

* Subscreen 9002 für Tab2
SELECTION-SCREEN BEGIN OF SCREEN 9002 AS SUBSCREEN.
PARAMETERS: pa_test2.
SELECTION-SCREEN END OF SCREEN 9002.

INITIALIZATION.
* Tabnamen vergeben
  tbl_tab1 = 'Tab1'.
  tbl_tab2 = 'Tab2'.

* aktiven Tab setzen, Großbuchstaben beachten
  tbl-activetab = 'TAB1'.
  tbl-dynnr = 9001.
  tbl-prog  = sy-repid.

AT SELECTION-SCREEN.
* Ereignis bei Klick auf Tabstrip abfangen
  CASE sy-ucomm.
    WHEN 'TAB1'.
      MESSAGE 'TAB1' TYPE 'S'.
    WHEN 'TAB2'.
      MESSAGE 'TAB2' TYPE 'S'.
  ENDCASE.

START-OF-SELECTION.
  WRITE: / 'Aktiver Tab:', tbl-activetab.
  WRITE: / 'Aktiver Tab Subscreen:', tbl-dynnr.
  WRITE: / 'Programmname:', tbl-prog.

Variante 2 (zuletzt gewählen Tabstrip zwischenspeichern)

* nach Listenverarbeitung wieder zurück zum Selektionsbildschirm
* und dort den letzten gewählten Tab anzeigen
CONSTANTS: gv_tbl_memory TYPE c LENGTH 10 VALUE 'TBL_ACTIVE'.

* Tabstrip erzeugen, 20 Zeilen hoch
SELECTION-SCREEN BEGIN OF TABBED BLOCK tbl FOR 10 LINES.
SELECTION-SCREEN TAB (15) tbl_tab1 USER-COMMAND tab1 DEFAULT SCREEN 9001.
SELECTION-SCREEN TAB (15) tbl_tab2 USER-COMMAND tab2 DEFAULT SCREEN 9002.
SELECTION-SCREEN END OF BLOCK tbl.

* Subscreen 9001 für Tab1
SELECTION-SCREEN BEGIN OF SCREEN 9001 AS SUBSCREEN.
PARAMETERS: pa_test.
SELECTION-SCREEN END OF SCREEN 9001.

* Subscreen 9002 für Tab2
SELECTION-SCREEN BEGIN OF SCREEN 9002 AS SUBSCREEN.
PARAMETERS: pa_test2.
SELECTION-SCREEN END OF SCREEN 9002.

INITIALIZATION.
* Tabnamen vergeben
  tbl_tab1 = 'Tab1'.
  tbl_tab2 = 'Tab2'.

* Zustand des Tabstrips aus dem Zwischenspeicher holen
  IMPORT tbl FROM MEMORY ID gv_tbl_memory.

AT SELECTION-SCREEN.
  CASE sy-ucomm.
    WHEN 'TAB1'.
      MESSAGE 'TAB1' TYPE 'I'.
    WHEN 'TAB2'.
      MESSAGE 'TAB2' TYPE 'I'.
  ENDCASE.

START-OF-SELECTION.
* Zustand des Tabstrips in den Zwischenspeicher ablegen
  EXPORT tbl TO MEMORY ID gv_tbl_memory.

  WRITE: / 'Aktiver Tab:', tbl-activetab.
  WRITE: / 'Aktiver Tab Subscreen:', tbl-dynnr.
  WRITE: / 'Programmname:', tbl-prog.