Value mit Corresponding und cond Operator, funktioniert nicht bei gleichen Feldnamen

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Value mit Corresponding und cond Operator, funktioniert nicht bei gleichen Feldnamen

Beitrag von Romaniac (Specialist / 208 / 61 / 26 ) »
Hallo zusammen,

einfache Aufgabe, aber keine Lösung mit den neuen Funktionen wenn man ohne Loop auskommen möchte:

Gleiche Felder aus Tabelle 1 sollen in Tabelle 2 übernommen werden, wenn TAB1-SDATE aber leer ist soll es mit heutigen Datum gefüllt werden:

Das funktioniert: (Feldname in Zielstruktur auf sdate_delete geändert, Datum wird gesetzt)

Code: Alles auswählen.

mth_cycles_del = VALUE #( FOR <ls_t811s> IN mt_t811s ( CORRESPONDING #( BASE ( VALUE #( sdate_delete = COND sydatum( WHEN <ls_t811s>-sdate = '00000000' THEN sy-datum ) ) ) <ls_t811s> ) ) ).
Das nicht: (gleicher Feldname in beiden Strukturen, Datum bleibt auf 0000000 )

Code: Alles auswählen.

mth_cycles_del = VALUE #( FOR <ls_t811s> IN mt_t811s ( CORRESPONDING #( BASE ( VALUE #( sdate = COND sydatum( WHEN <ls_t811s>-sdate = '00000000' THEN sy-datum ) ) ) <ls_t811s> ) ) ).
Hat jemand eine Idee wie das trotzdem funktionieren könnte?

Danke und Gruß,

Wolfgang
Geht nicht gibts nicht

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


Re: Value mit Corresponding und cond Operator, funktioniert nicht bei gleichen Feldnamen

Beitrag von black_adept (Top Expert / 3999 / 110 / 907 ) »
Moin Wolfgang,

im Wesentlichen verwendest du die Syntax "CORRESPONDING #( BASE (X) Y )" , wobei "X" als VALUE... COND... definiert ist.

Was hierbei passiert ist folgendes: Falls der BASE Zuatz fehlt initialisiert ABAP die Zielstruktur, andernfalls belegt sie sie mit dem X vor. Danach werden die namensgleichen Felder aus Y in die Zielstruktur übertragen.

Bei dir heißt das: In einem Fall setzt du das Feld SDATE_DELETE im anderen Fall das Feld SDATE. Da aber SDATE in der Struktur <ls_t811s> vorhanden ist, überschreibst du das Feld dann wieder mit dem Wert aus ebendieser Struktur, aber SDATE_DELETE ist nicht vorhanden und wird daher nicht überschrieben (zumindest gehe ich davon aus dass SDATE_DELETE zwar in mth_cycles_del enthalten ist aber nicht in mt_t811s weil ich mir nur so dein Problem erklären kann ).

Du musst also das "VALUE mit dem COND" in den hinteren Teil der Anweisung verfrachten.

Schau dir mal folgendes Beispiel an, das vereinfacht deinem Fall entspricht. So in etwa solltest du das umbauen

Code: Alles auswählen.

REPORT.

TYPES: BEGIN OF lts_datum,
         datum TYPE sydatum,
       END OF lts_datum.

DATA: ls_syst TYPE syst.


ls_syst = CORRESPONDING #( BASE ( syst ) VALUE lts_datum( datum = '11111111' ) ).

BREAK-POINT.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
DeathAndPain

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Value mit Corresponding und cond Operator, funktioniert nicht bei gleichen Feldnamen

Beitrag von Romaniac (Specialist / 208 / 61 / 26 ) »
Hallo black_adept,

ich habe das Beispiel mal vereinfacht, gleicher Ausdruck wie erstes Beispiel:

Code: Alles auswählen.

TYPES:
  BEGIN OF tp_source,
    date TYPE d,
  END OF tp_source,

  BEGIN OF tp_target,
    date TYPE d,
  END OF tp_target.

DATA:
  t_source TYPE STANDARD TABLE OF tp_source,
  t_target TYPE STANDARD TABLE OF tp_target.

* füllen
t_source = VALUE #( ( date = '19000101' )
                    ( date = '00000000' ) ).

t_target = VALUE #( FOR <s_source> IN t_source ( CORRESPONDING #( BASE ( VALUE #( date = COND #( WHEN <s_source>-date = '00000000' THEN sy-datum ) ) ) <s_source> ) ) ).

Das Datum wird nicht gesetzt. Wenn ich es umstelle so wie Du meinst bekomme ich Syntaxfehler: (vorher stand statt da #, da konnte der Compiler aber keinen Typ ableiten)
Debugger.jpg
Geht nicht gibts nicht

Re: Value mit Corresponding und cond Operator, funktioniert nicht bei gleichen Feldnamen

Beitrag von ewx (Top Expert / 4821 / 303 / 633 ) »
Der Zusatz BASE ist in diesem Beispiel mE nicht notwendig.
Wenn du COND verwendest, musst du auch ELSE verwenden.

Re: Value mit Corresponding und cond Operator, funktioniert nicht bei gleichen Feldnamen

Beitrag von Romaniac (Specialist / 208 / 61 / 26 ) »
Hallo EWX,

auch ohne BASE und mit ELSE für COND ist die Compiler-Meldung die Selbe.

Gruß Wolfgang
Geht nicht gibts nicht

Re: Value mit Corresponding und cond Operator, funktioniert nicht bei gleichen Feldnamen

Beitrag von ewx (Top Expert / 4821 / 303 / 633 ) »
BASE ist doch notwendig!

ist im Grunde eine Abwandlung hiervon:
https://tricktresor.de/blog/correspondi ... faultwert/

Code: Alles auswählen.

t_target = VALUE #( FOR <s_source> IN t_source
  ( VALUE #( BASE CORRESPONDING #( <s_source> )
               date = COND #( WHEN <s_source>-date = '00000000' THEN sy-datum
                              ELSE <s_source>-date ) ) ) ).

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
Romaniac


Re: Value mit Corresponding und cond Operator, funktioniert nicht bei gleichen Feldnamen

Beitrag von Romaniac (Specialist / 208 / 61 / 26 ) »
Das wars! Danke Dir!
Geht nicht gibts nicht

Re: Value mit Corresponding und cond Operator, funktioniert nicht bei gleichen Feldnamen

Beitrag von ewx (Top Expert / 4821 / 303 / 633 ) »
gerne. bei diesen Konstrukten muss ich auch immer irgendwo nachgucken, wie das wirklich funktionierte...

Re: Value mit Corresponding und cond Operator, funktioniert nicht bei gleichen Feldnamen

Beitrag von Romaniac (Specialist / 208 / 61 / 26 ) »
Und ob diese eine Zeile es jetzt schöner / lesbarer ist als ein Loop mit 4 Zeilen liegt im Auge des Betrachters :-)
Geht nicht gibts nicht

Re: Value mit Corresponding und cond Operator, funktioniert nicht bei gleichen Feldnamen

Beitrag von DeathAndPain (Top Expert / 1850 / 233 / 402 ) »
Ich würde hier SWITCH statt COND nehmen, dann ist es schon mal ein bisschen übersichtlicher. 🙂

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Romaniac


Re: Value mit Corresponding und cond Operator, funktioniert nicht bei gleichen Feldnamen

Beitrag von black_adept (Top Expert / 3999 / 110 / 907 ) »
Moin Wolfgang,

nachdem ich noch mal drüber geschlafen habe: Deine Zuweisung scheint ja inherent kompliziert und somit fehleranfällig und schwer debug- / wartbar zu sein. Daher noch ein paar Alternativen

Alternative 1: Falls die Tabelle mt_t811S mittels SELECT aus der T811S gefüllt wird und das Feld SDATE nicht noch andere Funktionen hat, könntest du es direct beim SELECT mittels sql-expression "CASE" füllen

Alternative 2: Fast genau so, aber du hast keinen Einfluss auf das Füllen der mt_t811S und bist auf einen halbwegs modernen Release. Dann kannst du mittels

Code: Alles auswählen.

SELECT itab~*, 
       CASE itab~sdate WHEN '00000000' THEN itab~sdate ELSE @sy-datum END AS sdate
FROM mt_t811S as itab
INTO CORRESPONDING FIELDS OF TABLE @mth_cycles_del
aus der itab die Daten in die andere Tabelle überführen ( so in etwa - gerade kein modernes System unter den Fingern ). Da du das Feld SDATE durch das * und die explizite Feldangabe doppelt definiert hast zieht die am weitesten hinten stehende Angabe und das ist das CASE und du bist mehr oder minder gezwungen das INTO CORRESPONDING FIELDS OF zu verwenden

Alternative 3: Ganz anders mit 2 Befehlen, was ich für den Ottonormalprogrammier am verständlichsten halte:

Code: Alles auswählen.

mth_cylces_del = CORRESPONDING #( mt_t811s ).
MODIFY mth_cylces_del FROM VALUE #( sdate = sy-datum ) TRANSPORTING sdate WHERE sdate IS INITIAL.
Bei deinem komplexen Ansatz halte ich es für sehr gut einen Kommentar einzustreuen, der erklärt was zum Geier du dort vorhast. Die 3 Alternativen und hier vorrangig die 3. könnten m.E. ohne Kommentar verwendet werden, da dort eigentlich klar ist was passieren soll.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 4):
ewxRomaniacDeathAndPaintar

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Value mit Corresponding und cond Operator, funktioniert nicht bei gleichen Feldnamen

Beitrag von Romaniac (Specialist / 208 / 61 / 26 ) »
Hallo back_adept,

vielen Dank für Deine nächtliche Aufarbeitung meines Anliegens :-) Ich bin da auch Deiner Meinung, lieber Les- und debugbar als alles in einer Zeile komprimiert, Laufzeit dürfte da ja auch kein Argument sein.

Ursprünglich hatte mich ja ein Kollege gefragt ob das überhaupt gehen würde in einer Zeile, mit einem ganz anderen Ausdruck. Ich habe dann mein funktionierendes Beispiel mit der T811 Tabelle auf Datum umgebaut, ursprünglich hatte ich nur ein X gesetzt in einem Feld, das nur in einer Tabelle vorkommt und darum hat das funktioniert, bei gleichen Feldern bin ich dann auf dieses Problem gestoßen.

Ein schönes Wochendende allen,

Gruß Wolfgang
Geht nicht gibts nicht

Seite 1 von 1

Vergleichbare Themen

0
Antw.
1397
Views
ABAP-interner Bug bei COND-Operator?
von DeathAndPain » 10.08.2018 19:16 • Verfasst in ABAP® für Anfänger
2
Antw.
582
Views
COND #( WHEN x IS NOT INITIAL THEN y ) funktioniert nicht
von Romaniac » 22.05.2022 14:58 • Verfasst in ABAP® Core
7
Antw.
3165
Views
Wie funktioniert der Z-Operator?
von DeathAndPain » 14.09.2017 18:10 • Verfasst in ABAP® für Anfänger
6
Antw.
2668
Views
COND in Schleife
von SaskuAc » 18.06.2018 08:08 • Verfasst in ABAP® für Anfänger
16
Antw.
1525
Views
FOR-Operator
von ralf.wenzel » 01.09.2020 17:19 • Verfasst in ABAP® Core

Über diesen Beitrag



Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

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.