[ABAP] Tabellentypen mit Beispielen

Übersicht interne Tabellen: Link

Beispieltyp

TYPES: BEGIN OF ty_long,
         posnr   TYPE posnr,
         matnr   TYPE matnr,
         vbeln   TYPE vbeln,
         flag_ok TYPE boolean,
       END OF ty_long.

STANDARD TABLE

* unsortiert, kann mit SORT sortiert werden
* Zugriff über Index und Schlüssel

DATA: it_st TYPE STANDARD TABLE OF ty_long WITH DEFAULT KEY.

SORTED TABLE

* nach definiertem Schlüssel sortiert
* Zugriff über Index und Schlüssel
* wenn Zugriff über Schlüssel
* schnell, da binäre Suche  

* Primary Key: posnr
* Secondary Key: flag
DATA: it_so TYPE SORTED TABLE OF ty_long WITH UNIQUE KEY posnr WITH NON-UNIQUE SORTED KEY flag COMPONENTS flag_ok.

* Primary Key: table_line
DATA: it_sorted TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line.

HASHED TABLE

* Zugriff nur über eindeutigen Schlüssel, kein Index
* Zugriff nur über einen unique-Schlüssel -> jeder Schlüsselwert darf nur einmal vorkommen, sonst Exception
* schnell, wenn alle Schlüsselfelder einbezogen werden

* Primary Key: DEFAULT KEY
DATA: it_hadk TYPE HASHED TABLE OF ty_long WITH UNIQUE DEFAULT KEY.

* Primary Key: posnr
DATA: it_hauk TYPE HASHED TABLE OF ty_long WITH UNIQUE KEY posnr.

* Primary Key: DEFAULT KEY
* Secondary Key: flag 
DATA: it_hask TYPE HASHED TABLE OF ty_long WITH UNIQUE DEFAULT KEY WITH NON-UNIQUE SORTED KEY flag COMPONENTS flag_ok.

* Primary Key: posnr, matnr, vbeln
* Secondary Key: flag 
DATA: it_hauksk TYPE HASHED TABLE OF ty_long WITH UNIQUE KEY posnr matnr vbeln WITH NON-UNIQUE SORTED KEY flag COMPONENTS flag_ok.

[ABAP] Selektionsbild – Funktionstasten einfügen

* im Standard-GUI-Status eines Selektionsbildes sind in der Anwendungsfunktionsleiste (Drucktastenleiste) fünf inaktive Drucktasten definiert
* Schnittstellen-Arbeitsbereich der Struktur SSCRFIELDS aus dem ABAP Dictionary definieren (für Dynpro)
TABLES sscrfields.

* Funktionstaste 1 anlegen
SELECTION-SCREEN: FUNCTION KEY 1.
* Funktionstaste 2 anlegen
SELECTION-SCREEN: FUNCTION KEY 2.
  
INITIALIZATION.

* Funktionstaste 1
  sscrfields-functxt_01 = VALUE smp_dyntxt( icon_id = icon_htm
                                            quickinfo = 'HTML'
                                            icon_text = 'HTML' ).

* Funktionstaste 2
  sscrfields-functxt_02 = VALUE smp_dyntxt( icon_id = icon_payment
                                            quickinfo = 'Verarbeitung'
                                            icon_text = 'Verarbeitung' ).
                                            
AT SELECTION-SCREEN.
* Kommando abfangen (Nummerierung 'FC01' ... 'FC05')
  CASE sscrfields-ucomm.
* wenn Funktionstaste 1 gedrückt
     WHEN 'FC01'.
       MESSAGE sscrfields-ucomm TYPE 'I'.
* wenn Funktionstaste 2 gedrückt
     WHEN 'FC02'.
       MESSAGE sscrfields-ucomm TYPE 'I'.
  ENDCASE.

[ABAP] SALV-Table: Codevorlage mit den wichtigsten Einstellungen

* Beispieldaten
SELECT * FROM t000 INTO TABLE @DATA(it_t000).

* Copy & Paste - fertig
TRY.
* SALV-Table
    DATA: o_salv TYPE REF TO cl_salv_table.

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

* Grundeinstellungen
    o_salv->get_functions( )->set_all( abap_true ).
    o_salv->get_columns( )->set_optimize( abap_true ).
    o_salv->get_display_settings( )->set_list_header( 'Überschrift' ).
    o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
    o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

* Farbe für Spalte setzen
*o_salv->get_columns( )->set_color_column( 'COLOR' ).
* aufsteigend sortieren
*o_salv->get_sorts( )->add_sort( columnname = 'COL1' sequence = if_salv_c_sort=>sort_up ).

* Spaltenüberschriften: technischer Name und Beschreibungstexte
    LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
      DATA(o_col) = <c>-r_column.
* Short Text leer setzen, damit das Autosize für die Spaltenüberschriften funktioniert
      o_col->set_short_text( || ).
* Medium Text leer setzen, damit das Autosize für die Spaltenüberschriften funktioniert
      o_col->set_medium_text( || ).
      o_col->set_long_text( |{ o_col->get_columnname( ) } [{ o_col->get_long_text( ) }]| ).
    ENDLOOP.

    o_salv->display( ).
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] Wildcards (%) im SELECT-Statement verwenden

Beispiel 1: PARAMETERS mit Wildcard (%)

DATA: it_spfli TYPE STANDARD TABLE OF spfli.

PARAMETERS: p_carr TYPE spfli-carrid DEFAULT '%'.
  
* SELECT mit LIKE, für % als Wildcard
SELECT * FROM spfli
  INTO TABLE @it_spfli
  WHERE carrid LIKE @p_carr.

Beispiel 2: WHERE-Clause mit Wildcard (%)

DATA: it_usr TYPE STANDARD TABLE OF usr02 WITH DEFAULT KEY.

* alle Namen, die mit "Z" beginnen
SELECT * FROM usr02 INTO TABLE it_usr WHERE bname LIKE 'Z%'.

[ABAP] GUI-Elemente ohne Dynprodefinition anzeigen

Variante 1 (Listausgabe mit WRITE erzwingen)

START-OF-SELECTION.

  DATA: it_sflight TYPE STANDARD TABLE OF sflight.

  SELECT * FROM sflight INTO TABLE @it_sflight.

* ALV-Grid in Standarddynpro cl_gui_container=>default_screen einbetten
  DATA(o_alv) = NEW cl_gui_alv_grid( i_parent = cl_gui_container=>default_screen ).

  o_alv->set_table_for_first_display( EXPORTING
                                        i_structure_name = 'SFLIGHT'
                                      CHANGING
                                        it_outtab        = it_sflight ).

* Ausgabe von cl_gui_container=>default_screen erzwingen
  WRITE space.

Variante 2 (Aufruf leeres Dynpro 100)

SELECTION-SCREEN BEGIN OF SCREEN 100.
SELECTION-SCREEN END OF SCREEN 100.

START-OF-SELECTION.

  DATA: it_sflight TYPE STANDARD TABLE OF sflight.

  SELECT * FROM sflight INTO TABLE @it_sflight.

* ALV-Grid in Standarddynpro cl_gui_container=>default_screen einbetten
  DATA(o_alv) = NEW cl_gui_alv_grid( i_parent = cl_gui_container=>default_screen ).

  o_alv->set_table_for_first_display( EXPORTING
                                        i_structure_name = 'SFLIGHT'
                                      CHANGING
                                        it_outtab        = it_sflight ).

* leeres Dynpro anzeigen und Ausgabe von cl_gui_container=>default_screen erzwingen
  CALL SCREEN 100.

[ABAP] GUI Containertypen

cl_gui_container

* cl_gui_container=>default_screen
* cl_gui_container=>screen0 ... cl_gui_container=>screen9
  • Fullscreen-Container der Listenausgabe
  • Erzeugung erfolgt z.B. bei WRITE (Bsp.: WRITE space.)
  • können als Basis für weitere Container genommen werden

Beispiel für cl_gui_container: Link

cl_gui_splitter_container

  • Splitter mit Subcontainern
  • benötigt Parent (z.B. cl_gui_container=>screen0, cl_gui_docking_container, cl_gui_custom_container)

Beispiel für cl_gui_splitter_container: Link

cl_gui_docking_container

  • Dock-Seite kann angegeben werden
  • Breite / Höhe kann absolut (extension) oder relativ (ratio) angegeben werden

Beispiel für cl_gui_docking_container: Link

cl_gui_dialogbox_container

  • erzeugt ein neues eigenständiges Fenster
  • Event “on_close” sollte behandelt werden, damit auf das Schließen-Kreuz reagiert werden kann

Beispiel für cl_gui_dialogbox_container: Link

cl_gui_custom_container

  • Containerobjekt zur Verwendung auf Dynpros
  • ein Name muss vergeben werden

Beispiel für cl_gui_custom_container: Link

cl_gui_gos_container

  • Containerobjekt für Anzeige von Generic Object Services (GOS) in der Titlebar
  • beliebige Untercontainer können eingebettet werden

Beispiel für cl_gui_gos_container: Link

cl_gui_container_bar

  • vertikales Tabstrip mit Auswahl-Buttons

Beispiel für cl_gui_container_bar: Link

cl_gui_container_bar_2

  • vertikales Tabstrip mit Auswahl-Buttons und Schließen-Kreuz
  • drei Anzeigemodi (fix (Feste Anordnung), tile (Menü), outlook (Anordnung klappt))

Beispiel für cl_gui_container_bar_2: Link

cl_gui_container_bar_xt

  • vertikales Tabstrip mit Auswahl-Buttons und Schließen-Kreuz
  • zwei Anzeigemodi (fix (Feste Anordnung), outlook (Anordnung klappt))

Beispiel für cl_gui_container_bar_xt: Link

[ABAP] Radiobuttons mit Label und Eingabefeldern in einer Zeile

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE title.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_rb1 RADIOBUTTON GROUP grp1 DEFAULT 'X'.
SELECTION-SCREEN COMMENT (15) lbl1 FOR FIELD p_rb1.
PARAMETERS: p_file1 TYPE localfile.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_rb2 RADIOBUTTON GROUP grp1.
SELECTION-SCREEN COMMENT (15) lbl2 FOR FIELD p_rb2.
PARAMETERS: p_file2 TYPE localfile.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.
  title = 'Auswahl'.
  lbl1 = 'Datei 1:'.
  lbl2 = 'Datei 2:'.

[ABAP] SELECT-OPTIONS Auswahl vorbelegen

Beispiel 1

DATA: gv_num TYPE i.
 
SELECT-OPTIONS: p_num FOR gv_num.
 
INITIALIZATION.
 
* Zahlenwerte 3 und 9
  p_num[] = VALUE #( ( sign = 'I' option = 'EQ' low = 3 )
                     ( sign = 'I' option = 'EQ' low = 9 ) ).

Beispiel 2

DATA: gv_matnr TYPE mara-matnr.
DATA: gv_werks TYPE mard-werks.
  
SELECT-OPTIONS: so_matnr FOR gv_matnr.
SELECT-OPTIONS: so_werks FOR gv_werks.

INITIALIZATION.

* MATNR von / bis
  so_matnr[] = VALUE #( ( sign = 'I' option = 'BT' low = '000000001000000000' high = '000000002000000000' ) ).
  
* Werk 0001
  so_werks[] = VALUE #( ( sign = 'I' option = 'EQ' low = '0001' ) ).

Beispiel 3

DATA: gv_werks TYPE mard-werks.
  
SELECT-OPTIONS: so_werks FOR gv_werks.

INITIALIZATION.
  
* Ausschluss Werk 0001
  so_werks[] = VALUE #( ( sign = 'E' option = 'EQ' low = '0001' ) ).

[ABAP] Alter / obsoleter Code

Weiterführende Infos: Link

alt / obsolet                                       neu

DATA: f1(8) TYPE d. (Längenangaben bei Datentypen)  DATA: f1 TYPE d.
FORM, PERFORM (obsolete Modularisierung)            CLASS DEFINITION, CLASS IMPLEMENTATION + Methoden (Kapselung)
CALL FUNCTION func EXCEPTIONS ...                   CLASS DEFINITION, CLASS IMPLEMENTATION + Methoden (Kapselung)
LIKE, STRUCTURE                                     TYPE, außer bei LIKE LINE OF
LOCAL                                               Verzichten auf Zugriff auf globalen Daten des Rahmenprogramms
FIELD-SYMBOLS: ...                                  LOOP AT ... ASSIGNING FIELD-SYMBOL(<...>)
READ TABLE ... INDEX 1                              itab[ 1 ]
READ TABLE ... ASSIGNING ...                        itab[ ... ]
READ TABLE ... WITH KEY type = '1'                  itab[ type = '1' ]
READ TABLE ... INTO ...                             DATA(var) = itab[ ... ].
READ TABLE ... REFERENCE INTO ...                   DATA(oref) = REF type( itab[ ... ] ).
READ TABLE ... TRANSPORTING NO FIELDS               IF line_exists( itab[ ... ] ). ... ENDIF.
REFRESH                                             CLEAR, FREE
DATA name TYPE ...                                  DATA(name) = VALUE type( ... ).
CLASS class DEFINITION LOAD.                        CLASS class DEFINITION.
INTERFACE intf LOAD.                                INTERFACE intf.
CREATE OBJECT oref EXPORTING ...                    DATA(oref) = NEW class( ... ).
OCCURS                                              Tabellen mit Kopfzeilen sind obsolet, im OO nicht mehr unterstützt
WITH HEADER LINE                                    Tabellen mit Kopfzeilen sind obsolet, im OO nicht mehr unterstützt
RANGES                                              DATA rg_name = TYPE|LIKE RANGE OF type.
MOVE                                                =
COMPUTE                                             weglassen, komplett überflüssig
PACK src TO dest                                    dest = src
TABLES                                              weglassen, komplett überflüssig, außer TABLES sscrfields.
TYPE-POOLS                                          weglassen, komplett überflüssig
DATA - COMMON PART                                  weglassen, komplett überflüssig
TABLES *                                            weglassen, komplett überflüssig
TYPE TABLE                                          TYPE ... TABLE WITH ... KEY (explizite Typisierung)
CHECK SELECT-OPTIONS.                               wird im OO nicht mehr unterstützt

READ, LOOP, INSERT, COLLECT,
APPEND, MODIFY, DELETE                              ohne INTO im OO nicht mehr unterstützt
SELECT * FROM tab.                                  ohne INTO im OO nicht mehr unterstützt, neu: SELECT ... INTO wa
LOOP AT itab.                                       ohne INTO im OO nicht mehr unterstützt, neu: LOOP AT ... INTO wa, ASSIGNING ... oder TRANSPORTING NO FIELDS
LOOP AT screen.                                     nur noch LOOP AT SCREEN INTO DATA(screen_wa).
MODIFY screen.                                      nur noch MODIFY SCREEN FROM screen_wa.
FIELDS obj.                                         ##NEEDED
"#EC ... (Pseudokommentare)                         ## ... (Pragmas)
CALL TRANSACTION ...                                CALL TRANSACTION ... WITH|WITHOUT AUTHORITY-CHECK.
CALL METHOD ...                                     weglassen, nur noch direkter Methodenaufruf
CALL DIALOG ...                                     globale Klassen oder FuBa
CALL CUSTOMER-FUNCTION ...                          CALL BADI ...
LEAVE                                               LEAVE PROGRAM, LEAVE TO TRANSACTION, LEAVE [TO] SCREEN, LEAVE LIST-PROCESSING.
><, =>, =<                                          <>, >=, <=, NE, GE, LE
IS REQUESTED                                        IS SUPPLIED
CATCH SYSTEM-EXCEPTIONS ...                         TRY ... CATCH
SEARCH itab                                         FIND IN TABLE

SELECT a b FROM tbl                                 SELECT a, b FROM tbl
  INTO CORRESPONDING FIELDS OF TABLE itab             INTO CORRESPONDING FIELDS OF TABLE @itab
  WHERE c = v1                                        WHERE c = @v1
  ORDER BY a, b.                                      ORDER BY a, b.

GUID_CREATE                                         cl_system_uuid
GUID_CONVERT                                        cl_system_uuid
SYSTEM_UUID_CREATE                                  cl_system_uuid
SYSTEM_UUID_C_CREATE                                cl_system_uuid
SYSTEM_UUID_C22_CREATE                              cl_system_uuid