CONSTRUCTOR EXPRESSION | NEW

  • Freitag, 04. März 2016 11:27
Artikel bewerten
(0 Stimmen)

Der neue Instanzierungsoperator NEW und seine Möglichkeiten.

Wir ihr ja mitbekommen habt, stehen uns seit Release 7.40 einige neue Operatoren zur Verfügung.
Einer davon ist der Instanzierungsoperator NEW. Mit diesem werden uns 2 neue Möglichkeiten geboten.

a) Erzeugen einses anonymen (nicht-generischer Datentyp) Datenobjektes.

 ... NEW dtype( value ) ...

Der Operator NEW wirkt wie die Anweisung

 CREATE DATA dref TYPE dtype.

, wobei dref hier für das Resultat steht, das auf das erzeugte anonyme Datenobjekt zeigt.
Das Resultat ist eine Datenreferenzvariable vom statischen Typ dtype.

b) Erzeugen einer Instanz einer Klasse

 ... NEW class( p1 = a1 
p2 = a2
... ) ...

Der Operator NEW wirkt wie die Anweisung

 CREATE OBJECT oref TYPE class.

,  wobei oref hier für das Resultat steht, das auf das erzeugte Objekt zeigt.
Das Resultat ist eine Objektreferenzvariable vom statischen Typ class.

Bei beiden Varianten könnt ihr aber auch statt dtype oder class einfach # setzen. Vorrausgesetzt der Variablentyp wurde vorher
mit "TYPE | TYPE REF TO" bekannt gegeben. Der Datentyp ist muss also eindeutig und vollständig erkennbar sein.

DATA oref TYPE REF TO class.
oref = NEW #( ... ).

Nachdem das Objekt erstellt wurde, wird dieses über die in den Klammern angegebenen Parametern mit Werten versorgt.
Wichtig hierbei ist die Einhaltung der Syntax, welche vom verwendeten Typen abhängig ist. Bei komplexen Typen gibt es spezielle
Arten der Parameterübergabe. Komplexe Typen können zum Beispiel Strukturen, interne Tabellen und Klassen sein.

Im folgenden möchte ich euch ein einfaches Beispiel für die Parameterübergabe bei internen Tabellen zeigen.

Classic Way:

 *== Standard table with Component as TABLE_LINE
*-- define type for table
TYPES tt_itab TYPE STANDARD TABLE OF i WITH DEFAULT KEY .
*-- classic way
DATA: lr_itab TYPE REF TO data.
CREATE DATA lr_itab TYPE tt_itab.
FIELD-SYMBOLS: <fs_itab> TYPE tt_itab.
FIELD-SYMBOLS: <fs_itab_row> like LINE OF <fs_itab>.
*-- dereference to itab
ASSIGN lr_itab->* TO <fs_itab>.
*-- append new value lines
APPEND INITIAL LINE TO <fs_itab> ASSIGNING <fs_itab_row>.
<fs_itab_row> = 100.
APPEND INITIAL LINE TO <fs_itab> ASSIGNING <fs_itab_row>.
<fs_itab_row> = 0.
APPEND INITIAL LINE TO <fs_itab> ASSIGNING <fs_itab_row>.
<fs_itab_row> = 300.

New Way (since 7.40):

Tabelle (einfach):

*== Standard table with Component as TABLE_LINE
*-- define type for table
TYPES tt_itab TYPE STANDARD TABLE OF i WITH DEFAULT KEY .
*-- create new reference for data --> create new table and set values for this table
DATA(lr_itab) = NEW tt_itab( ( 100 ) ( ) ( 300 ) ).
*-- dereference to itab
ASSIGN lr_itab->* TO FIELD-SYMBOL(<fs_itab>).

 Tabelle (mehrspaltig)

*== Table with more components
*-- define type for table
TYPES: tt_data_single TYPE STANDARD TABLE OF i WITH DEFAULT KEY.
TYPES:
  BEGIN OF ty_data_multiple,
    field1 TYPE i,
    field2 TYPE c LENGTH 10,
    field3 TYPE abap_bool,
  END OF ty_data_multiple.
TYPES: tt_data_multiple TYPE STANDARD TABLE OF ty_data_multiple WITH DEFAULT KEY.
*-- and again...create reference for itab -->create new table and set values for this table
DATA(lr_data_multiple) =
  NEW tt_data_multiple( 
                ( field1 = 1 field2 = 'String' field3 = abap_true )
                ( field1 = 2 field2 = 'String' field3 = abap_true )
                      ).
*-- dereference to itab
FIELD-SYMBOLS: <fs_data_multiple_tab> TYPE tt_data_multiple.
ASSIGN lr_data_multiple->* TO <fs_data_multiple_tab>.

Nehmen wir an, dass wir bereits schon eine interne Tabelle mit Daten haben. Besteht hier die Möglichkeit dieses mit dem
NEW zu verbinden? Ja. Hierfür bietet SAP uns den folgende Zusätze

a) BASE:

 *-- create reference for itab -->create new table and set existing itab and new values for this table
DATA(lr_data_multiple_add) =
  NEW tt_data_multiple(
               BASE lr_data_multiple->*
               ( field1 = 2 field2 = 'String' field3 = abap_true )
              ).

b) LINES OF:

 DATA(lr_data_multiple_add) =
  NEW tt_data_multiple(
               ( LINES OF lr_data_multiple->* )
               ( field1 = 2 field2 = 'String' field3 = abap_true )
              ).

In unserem Beispiel hat BASE und LINE OF die selbe Wirkung. LINE OF bietet uns aber noch weiter Möglichkeiten.
Möchten wir zum Beispiel nur die 2. Zeile der vorhanden internen Tabelle übertragen können wir das mit
Hilfe von ...FROM ... TO ... realisieren.

 ( LINES OF lr_data_multiple->* FROM 2 TO 2 )

oder sogar dynamisch mit FROM lines( ) TO lines( )

 ( LINES OF lr_data_multiple->* FROM lines( lr_data_multiple->* ) - 1
                                TO lines( lr_data_multiple->* ) )

Mein Fazit:

Eine durchaus mächtige Funktionalität die uns hier geboten wird. Ich könnte mir hierzu schon ein paar interessante Einsatzmöglichkeiten
vorstellen. Ein Beispiel wäre z.B. das Aufbereiten von Strukturen oder Tabellen, die an einen FuBa übergeben werden. Ich sehe ein
großes Potenzial jedoch habe ich Bedenken in Richtung Sourcecode & Lesbarkeit. Ich denke wir sollten versuchen, diese Funktionalität
so smart wie möglich zu verwenden.

Offiziele SAP Doku: NEW - Instanzierungsoperator

Letzte Änderung am Dienstag, 08 März 2016 12:51
Kommentare einblenden

Copyright © 2017 ABAP-Workbench.de