CORRESPONDING

Jeder kennt den Befehl MOVE-CORRESPONDING um alle Felder der einen Struktur in die entsprechenden Felder einer anderen Struktur zu kopieren oder SELECT … INTO CORRESPONDING FIELDS um einen Datenbank-Select in die gleichnamigen Felder der internen Tabelle oder Struktur einzulesen.

Mit Netweaver Release 7.40 ist ein neuer CORRESPONDING dazu gekommen. Ausnahmsweise eine Spracherweiterung, die wirklich eindeutig und auf Anhieb zu verstehen ist:

itab_ziel = CORRESPONDING #( itab_quelle MAPPING ziel_feld = quell_feld ).

Eine wirklich schöne und elegante Erweiterung des ABAP Sprachschatzes.

Genauere und weitere Informationen findet ihr hier: ABAP News for Release 7.40 SP05

Codebeispiel

TYPES: BEGIN OF ty_mat,
         matnr TYPE matnr,
         werks TYPE werks_d,
         lgort TYPE lgort_d,
         menge TYPE p DECIMALS 2,
       END OF ty_mat.

DATA gt_mat TYPE STANDARD TABLE OF ty_mat.
DATA gt_mard TYPE STANDARD TABLE OF mard.


START-OF-SELECTION.
  SELECT * FROM mard INTO TABLE gt_mard UP TO 20 ROWS.

  gt_mat = CORRESPONDING #( gt_mard MAPPING menge = labst ).

CORRESPONDING mit separater Wertzuweisung

Bei der Verwendung von CORRESPONDING kann man Werte gleicher Feldnamen zuweisen. Mit dem Zusatz MAPPING können Ausnahmen definiert werden.

TYPES:
  BEGIN OF ts_1,
    matnr TYPE matnr,
    mng   TYPE i,
    flag  TYPE abap_bool,
  END OF ts_1,
  BEGIN OF ts_2,
    matnr TYPE matnr,
    menge TYPE i,
  END OF ts_2.

DATA dst TYPE ts_1.
DATA src TYPE ts_2.

src-matnr = 'ABCD'.
src-menge = 100.

dst = CORRESPONDING #( src MAPPING mng = menge ).

Was macht man jedoch, wenn man der Zielstruktur noch einen Wert zuweisen möchte, der nicht in der Quellstruktur vorkommt?

Hierfür kann man den Zusatz BASE nutzen:

dst = VALUE #( BASE CORRESPONDING #( src MAPPING mng = menge ) flag = 'X' ).

Dies kann natürlich auch mit cond verbunden werden:

dst = VALUE #( BASE CORRESPONDING #(
        src MAPPING mng = menge )
        flag = COND #( 
                WHEN src-menge > 0 THEN 'H' 
                WHEN src-menge < 0 THEN 'S' 
                ELSE 'X' )  ).