Interne Tabelle zur Laufzeit generieren

Manchmal ist es notwendig und sinnvoll, eine interne Tabelle erst zur Laufzeit zu generieren. Wenn beispielsweise Berichtsdaten aus verschiedenen Jahren gegliedert ausgegeben werden sollen und für jedes Jahr eine eigene Spalte benötigt wird.

Sicherlich kann man eine bestimmte Anzahl von Spalten vorsehen und nicht benötigte Spalten bei der Ausgabe ausblenden… Eleganter ist jedoch die Verwendung der Methode cl_alv_table_create=>create_dynamic_table.

Mit ihre kann man anhand eines Feldkataloges eine interne Tabelle aufbauen:

CALL METHOD cl_alv_table_create=>create_dynamic_table 
     EXPORTING 
        it_fieldcatalog           = gt_fieldcatalog 
     IMPORTING 
        ep_table                  = gz_table 
     EXCEPTIONS 
        generate_subpool_dir_full = 1 
        OTHERS                    = 2.

Die Bearbeitung der Tabelle ist hinterher allerdings nicht mehr ganz einfach, da nicht mit Spaltennamen gearbeitet werden kann, denn die dynamisch zu generierenden Tabellenspalten kennt der Compiler ja noch nicht.

Es muss hier mit Feldsymbolen gearbeitet werden. Die einzelnen Felder des Arbeitsbereiches werden über den Index (ASSIGN COMPONENT <index>…) des Feldes oder über den Namen (ASSIGN COMPONENT ‘fieldname’…) angesprochen.

Beispiel-Coding

*** Feldkatalog
DATA gt_fcat             TYPE lvc_t_fcat.
*** Datenreferenz für interne Tabelle
DATA gz_table            TYPE REF TO data.
*** Feld-Symbole für:
*>> Zeile des Feldkatalogs
FIELD-SYMBOLS <fcat>     TYPE lvc_s_fcat.
*>> interne Tabelle
FIELD-SYMBOLS <table>    TYPE STANDARD TABLE.
*>> Arbeitsbereich der internen Tabelle
FIELD-SYMBOLS <workarea> TYPE ANY.
*>> Feld des Arbeitsbereiches
FIELD-SYMBOLS <field>    TYPE ANY.

*** Feldkatalog der internen Tabelle aufbauen:
*1* VBELN
APPEND INITIAL LINE TO gt_fcat ASSIGNING <fcat>.
<fcat>-fieldname = 'VBELN'.
<fcat>-tabname   = 'GZ_TABLE'.
<fcat>-ref_field = 'VBELN'.
<fcat>-ref_table = 'VBAK'.

*2* ERDAT
APPEND INITIAL LINE TO gt_fcat ASSIGNING <fcat>.
<fcat>-fieldname = 'ERDAT'.
<fcat>-tabname   = 'GZ_TABLE'.
<fcat>-ref_field = 'ERDAT'.
<fcat>-ref_table = 'VBAK'.

START-OF-SELECTION.
*** Interne Tabelle aus Feldkatalog generieren
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog           = gt_fcat
    IMPORTING
      ep_table                  = gz_table
    EXCEPTIONS
      generate_subpool_dir_full = 1
      OTHERS                    = 2.

*** Datenreferenz dem Feldsymbol <TABLE> zuweisen
  ASSIGN gz_table->* TO <table>.

*** Testdaten in interne Tabelle einfügen
  APPEND '000001234520070107' TO <table>.
  APPEND '112233445520050608' TO <table>.

*** Testdaten auslesen und als Liste ausgeben:
  LOOP  AT <table> ASSIGNING <workarea>.

*** Neue Zeile für jeden Tabelleneintrag
    NEW-LINE.

*** Felder des Arbeitsbereiches ausgeben
    DO.
      ASSIGN COMPONENT sy-index OF STRUCTURE <workarea> TO <field>.
      IF sy-subrc > 0.
*** Kein Feld mehr vorhanden
        EXIT. "from do
      ELSE.
*** Feldwert ausgeben
        WRITE: <field> COLOR COL_TOTAL.
      ENDIF.
    ENDDO.

  ENDLOOP.
Enno Wulff