ABAP - Schlüsselwortdokumentation →  ABAP - Referenz →  Interne Daten verarbeiten →  Zuweisungen →  Strukturkomponenten zuweisen →  CORRESPONDING - Komponentenoperator → 

CORRESPONDING - Grundform

Syntax

... { CORRESPONDING dtype|#( [DEEP]
                             [BASE ( base )]
                             struct|{itab [ duplicates]} ) }
  | { CORRESPONDING dtype|#( [BASE ( base )]
                             struct|{itab [ duplicates]}
                             mapping ) } ...


Zusatz:

... BASE ( base ) ...

Wirkung

Diese Variante des Komponentenoperators CORRESPONDING konstruiert aus den Komponenten eines Parameters struct oder itab ein Ergebnis von dem über dtype oder # angegebenen Zieltyp. Bei struct und itab handelt es sich um allgemeine Ausdruckspositionen.

Wenn der Zusatz DEEP angegeben ist, erfolgt die Zuweisung wie mit dem Zusatz EXPANDING NESTED TABLES zur Anweisung MOVE-CORRESPONDING. Mit einer Mapping-Vorschrift mapping kann die auf Namensgleichheit beruhende Zuweisungsregel von MOVE-CORRESPONDING übersteuert werden. Wenn eine Mapping-Vorschrift angegeben ist, ist der Zusatz DEEP implizit gesetzt und er darf nicht explizit angegeben werden.

Hinweise

struct2 = CORRESPONDING #( struct1 ).
ohne den Zusatz BASE ist nicht das Gleiche wie eine Zuweisung
MOVE-CORRESPONDING struct1 TO struct2.
Während bei MOVE-CORRESPONDING alle nicht gleichnamigen Komponenten in struct2 ihren Wert behalten, bekommen sie bei Zuweisung des Ergebnisses des Konstruktorausdrucks den dort vorhandenen Wert zugewiesen. Dieser ist für nicht berücksichtigte Komponenten initial. Dieses Verhalten kann mit dem Zusatz BASE übersteuert werden.
dobj = CORRESPONDING type( ... ).
wird aus Gründen der Optimierung direkt mit dem Zielobjekt gearbeitet und kein temporäres Ergebnis des Ausdrucks erstellt, das dann zugewiesen wird. Dies ist nicht möglich, wenn Zielobjekt und Parameter identisch sind und eine Mapping-Vorschrift verwendet wird, was beispielsweise das Vertauschen der Inhalte zweier Komponenten ermöglicht. In einem solchen Fall muss eine temporäre Kopie des Zielobjekts erstellt werden, mit der dann gearbeitet wird und es kommt zu einer entsprechenden Warnung von der Syntaxprüfung, die durch ein Pragma ausgeblendet werden kann. Wenn dies erst zur Laufzeit festgestellt wird, fehlt die nötige Information, um die notwendige temporäre Kopie des Zielobjekts zu erstellen, und es kommt zu dem Laufzeitfehler CORRESPONDING_SELF. Siehe das ausführbare Beispiel Reflexive Komponentenzuweisungen.

Beispiel

Zuweisung von vier namensgleichen Komponenten der Standardtabelle spfli_tab an eine temporäre sortierte Tabelle vom Typ flights an einer Operandenposition..

TYPES:
  BEGIN OF flight,
    carrid   TYPE spfli-carrid,
    connid   TYPE spfli-connid,
    cityfrom TYPE spfli-cityfrom,
    cityto   TYPE spfli-cityto,
  END OF flight.
TYPES
  flights TYPE SORTED TABLE OF flight WITH UNIQUE KEY carrid connid.

SELECT *
       FROM spfli
       INTO TABLE @DATA(spfli_tab).

cl_demo_output=>display( CORRESPONDING flights( spfli_tab ) ).

Ausführbare Beispiele

Zusatz

... BASE ( base ) ...

Wirkung

Mit dem Zusatz BASE kann ein Startwert base für die erzeugte Struktur bzw. interne Tabelle angegeben werden. Bei base handelt es sich um eine funktionale Operandenposition an der ein Datenobjekt angegeben werden kann, das in den Zieltyp konvertierbar ist.

Wenn der Zusatz BASE angegeben ist, wird der Wert von base der Zielstruktur bzw. der Zieltabelle nach den allgemeinen Zuweisungsregeln zugewiesen bevor der restliche Ausdruck ausgewertet wird. Dabei kann mit dem Zusatz duplicates hinter itab das Verhalten bezüglich doppelt vorkommender Zeilen in einer Zieltabelle beeinflusst werden.

Hinweise

Beispiel

Zuweisung von Ergebnissen des Komponentenoperators ohne und mit dem Zusatz BASE an vorhandene Strukturen gleichen Inhalts. Der Wert der in der Quellstruktur nicht vorhandenen Komponente bleibt nur bei der Verwendung von BASE erhalten.

DATA:
  BEGIN OF src,
    a TYPE i VALUE 1,
    b TYPE i VALUE 2,
  END OF src,
  BEGIN OF target1,
    b TYPE i VALUE 11,
    c TYPE i VALUE 12,
  END OF target1.
DATA(target2) = target1.

target1 = CORRESPONDING #( src ).
target2 = CORRESPONDING #( BASE ( target2 ) src ).

cl_demo_output=>new( )->write( target1 )->display( target2 ).