FOR-Operator

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
17 Beiträge • Seite 1 von 2 (current) Nächste
17 Beiträge Seite 1 von 2 (current) Nächste

FOR-Operator

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Moin,

irgendwie hab ich FOR noch nicht verstanden. Folgende Anweisung funktioniert nicht:

Code: Alles auswählen.

tab_with_another_struct =                          "Diese Tabelle soll gefüllt werden
     value #( for struct in source_tab             "mit allen daten aus source_tab
                    ( corresponding #( struct )    "source_tab hat eine andere Feldreihenfolge 
                      mapping date = sy-datum ) ).   "date gibt es in der source_tab nicht
                                                   "darum muss ich es selbst füllen
Fehlermeldung: "MAPPING konnte nicht interpretiert werden....". Mit der kann man natürlich nichts anfangen, wenn man die Ursache finden will.

Beide Tabellen sind vollständig typisiert. Welchen Fehler mache ich?


Ralf
Zuletzt geändert von ralf.wenzel am 01.09.2020 19:10, insgesamt 1-mal geändert.
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

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



Re: FOR-Operator

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Ach, hab ich das vergessen zu schreiben: BASE hab ich nicht, zu altes SP. Mit BASE hätte ich es gewusst ;)


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: FOR-Operator

Beitrag von black_adept (Top Expert / 3946 / 105 / 886 ) »
Bitte korrektes Coding angeben - die Anzahl der schließenden Klammern ist ungleich der Anzahl der öffnenden Klammern.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: FOR-Operator

Beitrag von black_adept (Top Expert / 3946 / 105 / 886 ) »
P.S. DAS ist genau der Grund warum ich meist auf FOR verzichte. Folgendes halte ich einfach für übersichtlicher.

Code: Alles auswählen.

tab_with_another_struct = corresponding #( source_tab ). " Alles bis auf das Datumsfeld ist schon richtig
wa-date = sy-datum.
modify tab_with_another_struct  from wa transporting date where date <> wa-date.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: FOR-Operator

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
black_adept hat geschrieben:
01.09.2020 18:26
Bitte korrektes Coding angeben - die Anzahl der schließenden Klammern ist ungleich der Anzahl der öffnenden Klammern.
Richtig, es fehlte eine schließende Klammer. Sorry.

Und: Das andere Konstrukt ist besser, aber LERNEN will ich das mit FOR trotzdem ;)


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: FOR-Operator

Beitrag von DeathAndPain (Top Expert / 1796 / 214 / 396 ) »
Na, also es funktioniert schon deshalb nicht, weil das MAPPING außerhalb der CORRESPONDING-Klammern steht. Du kannst aber nur innerhalb des CORRESPONDING mappen; FOR kennt kein MAPPING.

Ohne es ausprobiert zu haben (bin zu faul, mir jetzt passende Felder zu deklarieren), sollte es so gehen:

Code: Alles auswählen.

tab_with_another_struct =                          "Diese Tabelle soll gefüllt werden
     value #( for struct in source_tab             "mit allen daten aus source_tab
                    ( corresponding #( struct mapping date = sy-datum ) ) ).
Anmerkungen:
  • Wie beim Loop empfieht sich Feldsymbol statt Workarea. Also for <struct> statt for struct.
  • Der CORRESPONDING # kann auch direkt interne Tabellen wandeln, so dass sich die Frage stellt, ob Du FOR und VALUE hier überhaupt brauchst. Müsste ich aber auch erst ausprobieren; das sind Befehle, die zwar sehr schön sind, die man aber so selten braucht, dass ich die Syntax nicht zu 100% sicher aus dem Kopf hinkriege. Ich würde aber vermuten, dass es geht, und zwar so:

    tab_with_another_struct = corresponding #( source_tab mapping date = sy-datum ).
Ich bin übrigens nicht der Meinung, dass black_adepts oldschool-Variante hier schöner oder besser zu lesen ist. Das ist eine Frage der Gewohnheit. 7.40-Syntax ist furchtbar, wenn man zum ersten Mal damit konfrontiert wird, und genial, wenn man sie drauf hat. Man muss sich also dazu zwingen, den Kram zu benutzen - genau das hat Ralf ja offenbar auch vor. Und wenn man es öfter macht, dann liest man diese Konstrukte entspannt runter und kriegt Magenkrämpfe beim Anblick der alten, mehrzeiligen Ansätze, erst recht wenn der steinalte MODIFY noch zum Einsatz kommt.

Mittlerweile komme ich sogar zunehmend gut mit dem REDUCE zurecht. Bei dem habe ich am Anfang noch nicht mal verstanden, was er tut und wozu er da ist. Der ist in meinen Augen nochmal ein Zacken schärfer als FOR - und dennoch nützlich, wenn man sich an ihn gewöhnt hat!

Re: FOR-Operator

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Die Antwort ist korrekt. Die Klammer musste nur versetzt werden. War klar, dass das nur ne Kleinigkeit ist.

Allerdings muss ich beim Mapping Feldnamen der Quellstruktur angeben - und sy-datum ist natürlich keins davon. Das gilt übrigens für alle corresponding-Varianten, auch für die von Death&Pain.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: FOR-Operator

Beitrag von DeathAndPain (Top Expert / 1796 / 214 / 396 ) »
Du hast recht: was Du hier brauchst, ist kein Mapping, sondern gezieltes Ersetzen des Wertes einer Spalte.

Ich hab mir jetzt doch mal den Spaß gemacht zu fummeln, wie man das hinkriegt. Das Folgende (mit willkürlichen Beispieltypisierungen für die beteiligten Tabellen) hat bei mir ohne Fehler kompiliert und sollte den Zweck eigentlich erfüllen, auch wenn ich es nicht mit konkreten Werten ausprobiert habe:

Code: Alles auswählen.

types: begin of type_line_of_the_other_struct,
         wert type c,
         date type d,
       END OF type_line_of_the_other_struct,
       type_of_the_other_struct type TABLE OF type_line_of_the_other_struct,

       begin of type_of_source_tab_line,
         wert type c,
         wert2 type n,
       END OF TYPE_OF_SOURCE_TAB_LINE,
       type_of_source_tab type table of type_of_source_tab_line.

DATA: source_tab type type_of_source_tab,
      tab_with_another_struct TYPE type_of_the_other_struct.

tab_with_another_struct = VALUE #( FOR <struct> IN source_tab ( CORRESPONDING #( BASE ( CORRESPONDING type_line_of_the_other_struct( <struct> ) ) VALUE type_line_of_the_other_struct( date = sy-datum ) ) ) ).
Wobei ich wette, dass ein black_adept hier Wege finden würde, das kürzer zu schreiben. Und einräume, dass die Lesbarkeit meiner Lösung sich in Grenzen hält, so dass sich in dem Fall vielleicht doch ein herkömmlicher LOOP anbieten würde.

Re: FOR-Operator

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Ich habe leider kein BASE zur Verfügung, unser Release ist zu alt.

Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: FOR-Operator

Beitrag von DeathAndPain (Top Expert / 1796 / 214 / 396 ) »
Meines Wissens war BASE von Anfang an dabei. Das ganze CORRESPONDING #() kam ja erst mit Release 7.40, und da war - im Jahre 2015 - auch schon die BASE-Option drin, wie sich auch hier nachlesen lässt:

https://blogs.sap.com/2015/10/25/abap-7 ... reference/

Re: FOR-Operator

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Hatte ich auch erst gedacht, aber:
Horst Keller hat geschrieben:Of course, it is a common use case to add new values to existing values. Therefore, with Release 740, SP08 there is a new addition BASE for constructor expressions NEW, VALUE and CORRESPONDING that allows you to give the expressions a start value.
https://blogs.sap.com/2014/09/29/abap-n ... pressions/

Re: FOR-Operator

Beitrag von DeathAndPain (Top Expert / 1796 / 214 / 396 ) »
Da muss man ja richtig Pech haben und auf einem Release zwischen 2013 und 2015 sitzen, so dass man schon 7.40, aber noch nicht den neuen Kram hat.

Ich kann mich erinnern, dass der APPEND sich anfangs komisch verhalten hat. Nach meiner Erinnerung ging APPEND VALUE #( ... ) TO itab. nicht, weil er die Raute nicht auflösen konnte (obwohl der Datentyp statisch eindeutig ist). Eines Tages ging's. Kann gut sein, dass wir da ein neues Support Package (oder gar 7.50?) eingespielt hatten. Insofern scheint sich noch ein bisschen was getan zu haben, ja.

Re: FOR-Operator

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Richtig. Einen Releasewechsel habe ich angeregt, der ist aber derart aufwändig, dass ich das nicht durchbekommen habe. Der Testerei der Prozesse wegen.

Und NUR ABAP Updaten geht halt nicht ;)


Ralf *fühlt sich immer komisch, wenn er „Top Expert“ bei seinen Postings liest....
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: FOR-Operator

Beitrag von black_adept (Top Expert / 3946 / 105 / 886 ) »
Als was willst du dich denn sehen? Kannst ja mal anregen diese Titel rauszuwerfen oder "Top Expert" in "Lichtgestalt" umzuwandeln

edit: typo
Zuletzt geändert von black_adept am 04.09.2020 11:52, insgesamt 2-mal geändert.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Vergleichbare Themen

2
Antw.
2312
Views
operator
von kostonstyle » 06.05.2008 08:51 • Verfasst in ABAP® für Anfänger
1
Antw.
1553
Views
dynamischer Operator
von bliP! » 22.05.2006 14:24 • Verfasst in ABAP Objects®
6
Antw.
2668
Views
String in Operator?
von Murdock » 20.08.2012 16:50 • Verfasst in ABAP® für Anfänger
7
Antw.
2554
Views
Wie funktioniert der Z-Operator?
von DeathAndPain » 14.09.2017 18:10 • Verfasst in ABAP® für Anfänger
8
Antw.
224
Views
IN-OPERATOR - wer gewinnt?
von msfox » 07.09.2023 11:05 • Verfasst in ABAP® für Anfänger

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.