ABAP - Schlüsselwortdokumentation →  ABAP - Referenz →  Objekte und Werte erzeugen →  VALUE - Wertoperator → 

VALUE - interne Tabellen

Syntax

... VALUE dtype|#( [let_exp]
                   [BASE itab]
                   [FOR for_exp1
                    FOR for_exp2
                    ... ]
                   ( line_spec1 )
                   ( line_spec2 )
                     ... ) ...


Zusätze:

1. ... BASE itab

2. ... FOR for_exp

Wirkung

Wenn dtype ein tabellarischer Datentyp ist bzw. # für einen solchen steht, werden wie folgt die Tabellenzeilen der konstruierten Tabelle erzeugt:

Die konstruierten Zeilen müssen der Anforderung der Anweisung INSERT für das Einfügen von Arbeitsbereichen über Tabellenschlüssel genügen und somit kompatibel zum Zeilentyp sein, mit einer Ausnahme: Bei der Konstruktion einer Standardtabelle, bei der die Zeilen ohnehin nur angehängt werden, kann der Wert bei Zeilentypen c und x kürzer als die Zeilenlänge sein und wird dann rechts mit Leerzeichen bzw. hexadezimal 0 aufgefüllt.

Wenn der VALUE-Operator als Quelle einer Zuweisung an eine interne Tabelle verwendet wird, wird diese nach der Auswertung eines eventuellen LET-Ausdrucks erst initialisiert bzw. bekommt den Inhalt von itab zugewiesen und dann werden die Angaben line_spec ausgewertet und direkt in die Zieltabelle eingefügt.

Hinweise

Zusatz 1

... BASE itab

Wirkung

Vor der Angabe der einzufügenden Zeilen kann ein Zusatz BASE gefolgt von einer internen Tabelle itab angegeben werden, wobei es sich um eine funktionale Operandenposition handelt. Der Zeilentyp von itab muss in den Zeilentyp des Rückgabewerts konvertierbar sein. Wenn BASE angegeben ist, wird dem Rückgabewert der Inhalt von itab zugewiesen bevor die einzelnen Zeilen eingefügt werden. Wenn das Zeichen # für den Typ des Rückgabewerts angegeben ist und der Typ nicht aus der Operandenposition des Konstruktorausdrucks bestimmt werden kann, wird für diesen der Typ von itab verwendet, falls dieser erkennbar ist.

Hinweise

Zusatz 2

... FOR for_exp

Wirkung

Die Angabe eines oder mehrerer direkt aufeinanderfolgender beliebiger Iterationsausdrücke mit FOR bewirkt, dass die in line_spec konstruierten Zeilen für jede Iteration des letzten FOR-Ausdrucks in die Zieltabelle eingefügt werden. Bei der Konstruktion der Tabellenzeilen in line_spec können die dort sichtbaren lokalen Arbeitsbereiche und Feldsymbole der Iterationsausdrücke zur Konstruktion der Tabellenzeilen verwendet werden.

Hinweise

Beispiel

Konstruktion von internen Tabelle mit elementarem Zeilentyp. jtab wird mit drei Zeilen befüllt, itab mit sechs Zeilen. Die erste eingefügte Zeile von itab ist initial und die letzten drei Zeilen werden der zuvor gefüllten Tabelle jtab entnommen.

TYPES t_itab TYPE TABLE OF i WITH EMPTY KEY.

DATA(jtab) = VALUE t_itab( ( 10 ) ( 20 ) ( 30 ) ).

DATA(itab) = VALUE t_itab( ( ) ( 1 ) ( 2 ) ( LINES OF jtab ) ).

cl_demo_output=>display( itab ).

Beispiel

Konstruktion einer internen Tabelle mit elementarem Zeilentyp vom Typ string und Befüllen mit drei Zeilen. Das Ergebnis ist eine Tabelle, die den vorherigen, den aktuellen und den nächsten Tag in der Formatierung für die aktuelle Sprachumgebung enthält. Das aktuelle Datum wir mit einer Methode besorgt. Damit die Methode nur einmal aufgerufen werden muss, wird der Rückgabewert in einem LET-Ausdruck einem lokalen Hilfsfeld zugewiesen.

CLASS date DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS get RETURNING VALUE(d) TYPE d.
ENDCLASS.

CLASS date IMPLEMENTATION.
  METHOD get.
    d = sy-datlo.
  ENDMETHOD.
ENDCLASS.

TYPES t_date_tab TYPE TABLE OF string  WITH EMPTY KEY.

DATA date_tab TYPE t_date_tab.

START-OF-SELECTION.

  date_tab = VALUE #(
               LET d = date=>get( ) IN
               ( |{ CONV d( d - 1 ) DATE = ENVIRONMENT }| )
               ( |{         d       DATE = ENVIRONMENT }| )
               ( |{ CONV d( d + 1 ) DATE = ENVIRONMENT }| ) ).

Beispiel

Konstruktion einer internen Tabelle mit strukturiertem Zeilentyp und Befüllen mit zwei Zeilen, wobei die Strukturen komponentenweise mit Werten versorgt werden.

TYPES: BEGIN OF t_struct,
         col1 TYPE i,
         col2 TYPE i,
       END OF t_struct,
       t_itab TYPE TABLE OF t_struct  WITH EMPTY KEY.

DATA itab TYPE t_itab.

itab = VALUE #( ( col1 = 1 col2 = 2 )
                ( col1 = 3 col2 = 4 ) ).

Beispiel

Konstruktion einer Ranges-Tabelle und Befüllen mit vier Zeilen, wobei von der Kurzschreibweise für strukturierte Zeilentypen Gebrauch gemacht wird.

DATA itab TYPE RANGE OF i.

itab = VALUE #( sign = 'I'  option = 'BT' ( low = 1  high = 10 )
                                          ( low = 21 high = 30 )
                                          ( low = 41 high = 50 )
                            option = 'GE' ( low = 61 )  ).

Beispiel

Konstruktion einer internen Tabelle mit tabellarischem Zeilentyp und Befüllen mit zwei Zeilen. Die erste Zeile bekommt eine zuvor befüllte Tabelle zugewiesen. Die zweite Zeile wird mit VALUE konstruiert.

TYPES: t_itab1 TYPE TABLE OF i        WITH EMPTY KEY,
       t_itab2 TYPE TABLE OF t_itab1  WITH EMPTY KEY.

DATA itab1 TYPE t_itab1.
DATA itab2 TYPE t_itab2.

itab1 = VALUE #( ( 1 ) ( 2 ) ( 3 ) ).
itab2 = VALUE #( ( itab1 )
                 ( VALUE t_itab1( ( 4 ) ( 5 ) ( 6 ) ) ) ).

Beispiel

Verwendung von BASE. Bei der Konstruktion von tab1 und tab2 wird der Tabellentyp von base1 bzw. base2 übernommen. Dies ist bei der Konstruktion von tab3 nicht möglich, da der Zeilentyp von base2 nicht strukturiert ist und damit nicht zur Angabe einzelner Komponenten in den folgenden Klammern passt. Für tab3 wird explizit der Typ itab2 angegeben. Dies ist möglich, da der Zeilentyp von base2 in dessen Zeilentyp konvertierbar ist. Da sortierte Tabellen konstruiert werden, liegen die Zeilen der Ergebnisse auch sortiert vor.

TYPES:
  itab1 TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line,
  BEGIN OF struct,
    col1 TYPE c LENGTH 2,
    col2 TYPE c LENGTH 2,
    col3 TYPE c LENGTH 2,
  END OF struct,
  itab2 TYPE SORTED TABLE OF struct WITH UNIQUE KEY col1 col2 col3.

DATA(base1) = VALUE itab1(
                ( `x1y1z1` )
                ( `x2y2z2` )
                ( `x3y3z3` ) ).
DATA(base2) = VALUE itab2(
                ( col1 = 'x1' col2 = 'y1' col3 = 'z1' )
                ( col1 = 'x2' col2 = 'y2' col3 = 'z2' )
                ( col1 = 'x3' col2 = 'y3' col3 = 'z3' ) ).

DATA(tab1) = VALUE #( BASE base1
               ( `A1B1B1` )
               ( `A2B2B2` ) ).

DATA(tab2)  = VALUE #(
                BASE base2
                ( col1 = 'A1' col2 = 'B1' col3 = 'C1' )
                ( col1 = 'A2' col2 = 'B2' col3 = 'C2' ) ).

DATA(tab3) = VALUE itab2( BASE base1
               ( col1 = 'A1' col2 = 'B1' col3 = 'C1' )
               ( col1 = 'A2' col2 = 'B2' col3 = 'C2' ) ).

cl_demo_output=>write(   tab1  ).
cl_demo_output=>write(   tab2 ).
cl_demo_output=>display( tab3 ).

Beispiel

Verwendung von BASE für das Anhängen von Zeilen an vorhandene Zeilen einer internen Tabelle.

TYPES itab TYPE TABLE OF string WITH EMPTY KEY.

DATA(itab) =
  VALUE itab(
    ( `a` ) ( `b` ) ( `c` ) ).

...

itab =
  VALUE #(
    BASE itab
    ( `d` ) ( `e` ) ( `f` ) ).

cl_demo_output=>display( itab ).

Beispiel

Verwendung von BASE für das Anhängen von Zeilen an eine interne Tabelle in einer Schleife. Nach der Ausgabe wird gezeigt, wie die gleiche Funktionalität auch mit einem Iterationsausdruck mit FOR bewirkt werden kann.

DATA itab TYPE TABLE OF i WITH EMPTY KEY.

DO 10 TIMES.
  itab = VALUE #( BASE itab ( ipow( base = sy-index exp = 2 ) ) ).
ENDDO.

cl_demo_output=>display( itab ).

DATA jtab LIKE itab.
jtab = VALUE #( FOR j = 1 UNTIL j > 10
                ( ipow( base = j exp = 2 ) ) ).
ASSERT jtab = itab.

Beispiele zu Tabellen-Comprehensions

Siehe Beispiele zu Tabellen-Comprehensions.

Hinweis

Siehe auch die Beispiele zum Instanzierungsoperator NEW.



Weiterlesen
VALUE - line_spec