[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.

[ABAP] Alle im System verfügbaren Icons und Symbole anzeigen

* Tabelle 'ICON'
* Report 'RSTXICON'

* alle Icons: SHOWICON
* alle Symbole: SHOWSYMB

WRITE: / 'Telefon:', sym_phone AS SYMBOL.
WRITE: / 'Alarm:  ', icon_alarm AS ICON.

Häufig verwendete Icons

Gruppe      Funktion        Icon

Allgemein   Ausführen       ICON_EXECUTE_OBJECT
            Drucken         ICON_PRINT
            Einstellungen   ICON_ACTIVITY
            Excel           ICON_XXL
            Grafik          ICON_GRAPHICS
            Lupe            ICON_SELECT_DETAIL
            Mail            ICON_ADDRESS
            Protokoll       ICON_PROTOCOL
            Rechnen         ICON_CALCULATION
            Verarbeiten     ICON_OPERATION

Datei       Datei neu       ICON_CREATE
            Datei öffnen    ICON_OPEN
            Export          ICON_EXPORT
            Import          ICON_IMPORT
            Ordner zu       ICON_CLOSED_FOLDER
            Ordner offen    ICON_OPEN_FOLDER
            Speichern       ICON_SYSTEM_SAVE

Datensatz   Anzeigen        ICON_DISPLAY, ICON_DISPLAY_TEXT
            Auswahl alle    ICON_SELECT_ALL
            Auswahl keins   ICON_DESELECT_ALL
            Auswahl Block   ICON_SELECT_BLOCK
            Ausschneiden    ICON_SYSTEM_CUT
            Einfügen        ICON_SYSTEM_PASTE
            Einfügen Zeile  ICON_INSERT_ROW
            Filter          ICON_FILTER
            Kopieren        ICON_SYSTEM_COPY, ICON_COPY_OBJECT
            Löschen         ICON_DELETE, ICON_ERASE
            Löschen Zeile   ICON_DELETE_ROW
            Refresh         ICON_REFRESH
            Suchen          ICON_SEARCH
            Undo            ICON_SYSTEM_UNDO

Status      Abbruch         ICON_CANCEL
            Ok              ICON_OKAY, ICON_CHECKED
            Fehler          ICON_INCOMPLETE
            Fertig          ICON_COMPLETE
            Exception       ICON_FAILURE
            LED grün        ICON_GREEN_LIGHT
            LED gelb        ICON_YELLOW_LIGHT
            LED rot         ICON_RED_LIGHT

Navigation  Links           ICON_ARROW_LEFT
            Rechts          ICON_ARROW_RIGHT
            Schließen       ICON_CLOSE

[ABAP] Breakpoints im Code setzen

* Breakpoint im Code setzen, immer aktivieren
BREAK-POINT.

* wenn Benutzer 'XYZ' angemeldet ist, Breakpoint auslösen 
BREAK XYZ.

* wenn Benutzer 'XYZ' angemeldet ist, Breakpoint auslösen
IF sy-uname EQ 'XYZ'.
  BREAK-POINT.
ENDIF.

* Transaktion SAAB: Editieren von Checkpoint-Gruppen und zugehörigen Aktivierungsvarianten.
BREAK-POINT ID ZTEST.

[ABAP] Referenzen, Dereferenzierung, Feldsymbole, Typecast

* allg. Referenz auf irgendwas (data)
DATA: lo_data TYPE REF TO data.

* Referenz auf den allg. Typ object
DATA: lo_obj TYPE REF TO object.

* allg. Feldsymbol
FIELD-SYMBOLS: <fs_any> TYPE ANY.

* dynamic Typecast
lo_obj ?= <fs_any>.

IF lo_obj IS BOUND. " != null
  " lo_obj ist instanziiert

  " Dereferenzierung, Wert an der Stelle der Referenz
  lo_obj->* ...
ELSE.
  " lo_obj ist nicht instanziiert
ENDIF.

[ABAP] Interne Tabelle nach XML exportieren

DATA: ti_t100 TYPE STANDARD TABLE OF t100.
DATA: lv_xml TYPE string.

* Daten abfragen
SELECT * FROM t100 INTO TABLE ti_t100 UP TO 10 ROWS.

* interne Tabelle in XML-String wandeln
CALL TRANSFORMATION id SOURCE data_node = ti_t100 RESULT XML lv_xml.

* Versionsinfo wegschneiden, damit in Excel die Spalte "Version" nicht erscheint
REPLACE FIRST OCCURRENCE OF | version="1.0">| IN ls_xml WITH '>'.

* XML-String in XML-Document wandeln
DATA(lo_xml_doc) = NEW cl_xml_document( ).
lo_xml_doc->parse_string( lv_xml ).

* XML-Document als Datei speichern
lo_xml_doc->export_to_file( 'c:\temp\test.xml' ).

WRITE: / |XML-Datei exportiert.|.

[ABAP] SALV-Table: Funktionsbuttons hinzufügen

Variante 1 (nur wenn in eigenem Dynpro + Container)

SELECT * FROM sflights INTO TABLE @DATA(it_data).

DATA: o_salv TYPE REF TO cl_salv_table.

cl_salv_table=>factory( EXPORTING
                          r_container  = cl_gui_container=>default_screen " Standard-Container der Listausgabe nutzen
                        IMPORTING
                          r_salv_table = o_salv
                        CHANGING
                          t_table      = it_data ).

o_salv->get_functions( )->set_all( ).

* Für diesen Button muss zus. noch ein Event-Handler ausgeprägt werden
o_salv->get_functions( )->add_function( name     = 'MYFUNC'
                                        icon     = |{ icon_complete }|
                                        text     = 'Funktionstext'
                                        tooltip  = 'ToolTipText'
                                        position = if_salv_c_function_position=>right_of_salv_functions ).

o_salv->display( ).

* Erzwingen von cl_gui_container=>default_screen (Listausgabe)
WRITE space.

Variante 2 (PF_STATUS)

* ohne Angabe eines Containers in der factory-Methode:
SELECT * FROM sflights INTO TABLE @DATA(it_data).

DATA: o_salv TYPE REF TO cl_salv_table.

cl_salv_table=>factory( IMPORTING
                          r_salv_table = o_salv
                        CHANGING
                          t_table      = it_data ).

* PF-Status aus Programm SAPLSLVC_FULLSCREEN benutzen
o_salv->set_screen_status( pfstatus      = 'STANDARD_FULLSCREEN'
                           report        = 'SAPLSLVC_FULLSCREEN'
                           set_functions = cl_salv_model_base=>c_functions_all ).

o_salv->display( ).

oder

SELECT * FROM sflights INTO TABLE @DATA(it_data).

DATA: o_salv TYPE REF TO cl_salv_table.

cl_salv_table=>factory( IMPORTING
                          r_salv_table = o_salv
                        CHANGING
                          t_table      = it_data ).

* PF-Status manuelle aus Funktionsgruppe SALV_METADATA_STATUS kopieren
* im lokalen Programm (sy-repid) aufrufen
o_salv->set_screen_status( pfstatus      = 'SALV_TABLE_STANDARD'
                           report        = sy-repid
                           set_functions = cl_salv_model_base=>c_functions_all ).

o_salv->display( ).