CORRESPONDING MAPPING mit Expression

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
11 Beiträge • Seite 1 von 1
11 Beiträge Seite 1 von 1

CORRESPONDING MAPPING mit Expression

Beitrag von Radinator (ForumUser / 87 / 13 / 7 ) »
Hellöle 👋

Ich bin vor kurzem auf das CORRESPONDING Keyword gestoße weil ich nach einer Möglichkeit gesucht habe die Daten von iTab1 in iTab2 zu kopieren und es möglichst kurz (in LoC) erledigen wollte.
In dem Kontext (nach etwas suchen) bin ich auf das besagte Keyword gestoßen und da ich in der iTab1 2 Felder hatte (bei waren vom Typ PARTNER aus BUT000) und in der Zieltabelle war nur noch 1 Feld ich ich wollte eine Verdichtung erreichen. Quasi sowas die "wenn iTab1-kunnr is initial dann iTab1-lifnr sonst iTab1-kunnr" dachte ich kann ja das via CORRESPONDING in der MAPPING Klausel mache.

Leider stellte sich heraus, dass der Vorrat an verfügbaren Symbolen (Variablennamen) sich lediglich auf die Spaltennamen aus iTab1 beschränkt und ich *keine* Expression verwenden kann.
In der Doku zu CORRESPONDING wird (soweit ich das gelesen habe) nirgends explizit darauf hingewiesen, dass Expressions als Quelle nicht verwendet werden können.

Hat jemand das gleiche oder einen ähnlichen Fall schon mal gehabt und dafür ne Lösung gefunden? Also wie ich in der MAPPING Klausel eine Expression (SWITCH #() o.ä.) verwenden kann?

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: CORRESPONDING MAPPING mit Expression

Beitrag von black_adept (Top Expert / 4149 / 133 / 958 ) »
Der 1. Satz des von dir genannten Links sagt doch, dass man nur Komponenten der Quell bzw. Zielstruktur verwenden darf, wodurch expressions implizit ausgeschlossen sind.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: CORRESPONDING MAPPING mit Expression

Beitrag von Radinator (ForumUser / 87 / 13 / 7 ) »
Ok, dass die Expressions implizit ausgeschlossen sind wenn nur Quelll- und Zielkomponenten genannt werden, das wusste ich nicht. Jetzt schon. 😅

Mit der Aussage "Der 1. Satz..." beziehst du dich auf den Satz "Mapping-Vorschrift für den..." oder "Hinter MAPPING werden mit t1, t2, ..."?

Re: CORRESPONDING MAPPING mit Expression

Beitrag von 19KnarfRed81 (ForumUser / 28 / 14 / 3 ) »
Also du willst eine Tabelle kopieren und dabei einzelne Felder in Abhängigkeit anders belegen? Das sollte so eigentlich klappen.

Code: Alles auswählen.

DATA target TYPE mara_tab.
DATA source TYPE mara_tab.

source = VALUE #( mandt = '600'
                  vpsta = '0'
                  ( matnr = '00000000000076964'  )
                  ( matnr = '00000000000076182'  )
                  ( matnr = '00000000000076162'  )
                  ( matnr = '00000000000076165'  )
                  ( matnr = '00000000000076150'  )
                  ( matnr = '00000000000075274'  )
                  ( matnr = '00000000000075275'  )
                  ( matnr = '00000000000074094'  )
                  ( matnr = '00000000000074868'  )
                  ( matnr = '00000000000102906'  ) ).

target = VALUE mara_tab( FOR <l> IN source
                         ( VALUE #( BASE CORRESPONDING #( <l> )
                                    vpsta = COND #( WHEN <l>-matnr+16(1) = '8' THEN 'X' ELSE <l>-vpsta ) ) ) ).

cl_demo_output=>display_data( target ).

Re: CORRESPONDING MAPPING mit Expression

Beitrag von Radinator (ForumUser / 87 / 13 / 7 ) »
Ok jetzt muss ich doch etwas ausholen 😅

Grob geht es darum die ACDOCA auszulesen und die zwei Partner Felder auf 1 einziges Zielfeld zu reduzieren, zusätzlich will ich den Inhalt des Feldes SGTXT durch eine Funktion "escapen" (Steuerzeichen raus, Semikolon entfernen und Gänsefüschen verdoppeln) da ich das am Ende in eine CSV Datei schreiben will.

Vom Code her (etwas abgewandelt, aber ich denke der Grundgedanke bleibt erhalten):

Code: Alles auswählen.

types:
  begin of source_table_type,
    entry_id type i,
    partner1 type partner,
    partner2 type partner,
    text type string,
  end of source_table_type,
  begin of target_table_type,
    entry_id type i,
    partner type partner,
    text type string,
  end of target_table_type.
  
data source_table type sorted table of source_table_type with unique key entry_id.
data target_table type sorted table of target_table_type with unique key entry_id.

source_table = value #( 
  ( entry_id = 1 partner1 = '100123456' partner2 = '' text = '"Entry 1!"' )
  ( entry_id = 1 partner1 = '' partner2 = '200123456' text = '"Entry 2! Text Blah;"' )
  ( entry_id = 1 partner1 = '100789123' partner2 = '' text = '"Ich; mag; Züge?"' )
  ( entry_id = 1 partner1 = '' partner2 = '200147852' text = 'Schraubschlüssel 2"' )
).


target_table = corresponding #( source_table
                                mapping   entry_id = entry_id
                                          partner = cond #( when partner1 is initial then partner2
                                                            when partner2 is initial then partner1
                                                            else '' )
                                          text = me->escape_text( text ) )
Die IDE gibt mir halt bei der Zeile mit dem cond #( ... ) folgende Meldung: Es existiert keine Komponente mit Namen "COND".

Die target_table soll am Ende so ähnlich aussehen:

Code: Alles auswählen.

target_table = value #( 
  ( entry_id = 1 partner = '100123456' text = '"""Entry 1!"""' )
  ( entry_id = 1 partner = '200123456' text = '"""Entry 2! Text Blah,"""' )
  ( entry_id = 1 partner = '100789123' text = '"""Ich; mag; Züge?"""' )
  ( entry_id = 1 partner = '200147852' text = 'Schraubschlüssel 2"""' )
).
Aktuell mach ich das source_tab -> target_tab halt folgendermaßen:

Code: Alles auswählen.

loop at source_table assigning field-symbol(<line>).
  insert value target_table_type( 
    entry_id = <line>-entry_id
    partner = cond #( when <line>-partner1 is initial then <line>-partner2
                      when <line>-partner2 is initial then <line>-partner1
                      else '' )
    text = me->escape_text( conv string( <line>-text ) )                      
  ) into table target_table.
endloop.
Mein "Problem" besteht darin, dass ich bei der Verwendung von CORRESPONDING mit MAPPING "nur" 2 Zeilen angeben müsste wärend es halt jetzt (von knapp 30 Spalten) halt alle sind und ich bei zwei was extriges machen muss und den Rest schreiben muss weil es sonst nicht übernommen werden würde.

Edit: Verdammt, den Teil hier vergessen. Ich werd mir mal den Ansatz mit VALUE und FOR anschauen.

Re: CORRESPONDING MAPPING mit Expression

Beitrag von 19KnarfRed81 (ForumUser / 28 / 14 / 3 ) »
Also ich sehe immer noch nicht, warum der von dir beschriebene Usecase so nicht zu realisieren wäre. 🤔 Du musst halt nur im CORRESPONDING die beiden Felder "partner1" und "partner2" mit EXCEPT ausklammern. Dann füllst du "partner" und "text " anschließend individuell.

Direkt im MAPPING-Statement kannst du keine Expressions nutzen, weil hier nur Strukturfelder erlaubt sind.

Re: CORRESPONDING MAPPING mit Expression

Beitrag von black_adept (Top Expert / 4149 / 133 / 958 ) »
Radinator hat geschrieben:
19.11.2025 15:55
Mein "Problem" besteht darin, dass ich bei der Verwendung von CORRESPONDING mit MAPPING "nur" 2 Zeilen angeben müsste wärend es halt jetzt (von knapp 30 Spalten) halt alle sind und ich bei zwei was extriges machen muss und den Rest schreiben muss weil es sonst nicht übernommen werden würde.
Moin Radinator,
kann es sein dass du den Zusatz "BASE" bei VALUE noch nicht in Erwägung gezogen hast, so wie er auch bei 19KnarfRed81s Post verwendet wird?
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: CORRESPONDING MAPPING mit Expression

Beitrag von Radinator (ForumUser / 87 / 13 / 7 ) »
Weil ich bei Verwendung von Mapping mit EXCEPT die originale Datei 2x anfassen müsste. Einmal mit CORRESPONDING um alle Sachen rüber zu kopieren und dann einmal per LOOP AT mit Field Symbols um die ausgenommen Felder sonder zu behandeln.

Wie schon beschrieben wollte ich das ganzen in möglichst wenig LoC machen. Da wir hier zwar von Satzzahlen im 100k Bereich reden, das Bottleneck wo anders liegt und die aktuelle Lösung mit mehr LoC funktioniert werde ich da nicht viel ändern müssen.

Ich mein mein Beispiel war (wie der Name schon sagt) nur ein Beispiel, ich wollte halt generell wissen wie man sowas lösen kann. Da ich jetzt weiß, dass CORRESPONDING nur Komponentennamen aber keinen Expression erlaubt und du mir mit dem VALUE und FOR sowie dem MAPPING EXCEPT + Spezialbehandlung schon zwei neue Wege gezeigt hast kann ich den Post schließen. Vielen Dank schon mal!

Re: CORRESPONDING MAPPING mit Expression

Beitrag von Radinator (ForumUser / 87 / 13 / 7 ) »
@black_adept: Ich hab die Version mit VALUE mir zwar mal angeschaut aber dann verworfen weil ich "was neues" ausprobieren wollte. Und neu = besser ;)
Wie in meinem Abschluss Post geschrieben hab ich jetzt 2 neue Ansätze, die ich verwenden kann wenn ich mal wieder den Fall habe.

Re: CORRESPONDING MAPPING mit Expression

Beitrag von DeathAndPain (Top Expert / 1994 / 270 / 419 ) »
Also ich halte den Ansatz von 19KnarRed81 auch für den richtigen. MAPPING gibt Formeln halt nicht her, aber sein Ansatz ist genau das, was man eleganterweise an dieser Stelle braucht.

Und wenn wir von elegant sprechen: Deinen COND

Code: Alles auswählen.

partner = cond #( when partner1 is initial then partner2
                  when partner2 is initial then partner1
                                           else '' )
halte ich auch für suboptimal. Stattdessen könntest Du einfach schreiben

Code: Alles auswählen.

partner = cond #( when partner1 is initial then partner2
                                           else partner1 )
mit exakt demselben Ergebnis (und zwar auch dann, wenn beide leer sind. Ich bin ohnehin kein Fan davon, im ELSE-Block das zu schreiben, was der COND sowieso auch den ELSE-Block ausgeben würde.). Wenn Du erwartest, dass in den meisten Fällen partner1 gefüllt sein wird und partner2 nur als Notnagel für die Ausnahmefälle dient, würde ich das sogar im Code veranschaulichen und schreiben:

Code: Alles auswählen.

partner = cond #( when partner1 is not initial then partner1
                                               else partner2 )

Re: CORRESPONDING MAPPING mit Expression

Beitrag von Radinator (ForumUser / 87 / 13 / 7 ) »
Der Grund warum ich einen ELSE Block drinnen hab ist weil mal geplant war (sofern beide Partner Felder leer sind) nen Default-Wert anzugeben um zu signalisieren entweder ist was schief gelaufen oder zeigen, dass beide leer sind. Die Ausgabe enthät den PK der Tabelle, daher ist es (sollte es mal zu dem Fall kommen) recht einfach die Zeile zu finden. Die Verteilung sollte in etwa 50/50 sein, aber man kann ja nie wissen ;)

Ich gebe dir Recht, dass es viel besser wäre den ELSE Teil wegzulassen. Ist halt ein Relikt aus den Anforderungen.

Seite 1 von 1

Vergleichbare Themen

5
Antw.
2219
Views
Logical expression IN
von hbahnen » 03.05.2006 00:39 • Verfasst in ABAP® Core
1
Antw.
7032
Views
CDS View, Problem mit Case expression
von RaCDigger » 02.02.2017 15:36 • Verfasst in ABAP® Core
12
Antw.
5489
Views
Regulär Expression Stringsuche inkl. Sonderzeichen
von VB2012 » 24.09.2012 14:45 • Verfasst in ABAP® für Anfänger
0
Antw.
3974
Views
OR Mapping
von yuro » 27.01.2015 00:11 • Verfasst in ABAP Objects®
3
Antw.
4567
Views
Hilfe bei Mapping
von ABAP_User » 10.05.2011 17:49 • Verfasst in ABAP® für Anfänger

Aktuelle Forenbeiträge

Hilfe bei REUSE_ALV_GRID_DISPLAY
vor 9 Stunden von JHM 5 / 205
Export/Import Eclipse-Projekt
vor 4 Tagen von ralf.wenzel gelöst 3 / 1277

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.