Ich bräuchte mal eine elegante Lösung für MOVE-CORRESPONDING EXCLUDING

Getting started ... Alles für einen gelungenen Start.
6 Beiträge Seite 1 von 1
6 Beiträge Seite 1 von 1

Ich bräuchte mal eine elegante Lösung für MOVE-CORRESPONDING EXCLUDING

Beitrag von DeathAndPain (Top Expert / 1051 / 122 / 230 ) » 23. Mai 2019 13:27

Hallo zusammen,

folgender Codeausschnitt:

Code: Alles auswählen.

  LOOP AT ABWESENHEITEN ASSIGNING FIELD-SYMBOL(<ABWESENHEITEN>).
*   Feldsymbol <M> auf Tabellenzeile mit Personalnummer aus aktueller Abwesenheit setzen.
*   Sofern diese Tabellenzeile noch nicht existiert, wird sie bei dieser Gelegenheit angelegt.
    ASSIGN M[ PERNR = <ABWESENHEITEN>-PERNR ] TO FIELD-SYMBOL(<M>).
    IF SY-SUBRC <> 0.
      INSERT VALUE #( PERNR = <ABWESENHEITEN>-PERNR ) INTO TABLE M.
      ASSIGN M[ PERNR = <ABWESENHEITEN>-PERNR ] TO <M>.
      ASSIGN MITARBEITER_DATA[ PERNR = <M>-PERNR ] TO FIELD-SYMBOL(<MITARBEITER_DATA>).
      IF SY-SUBRC = 0.
        MOVE-CORRESPONDING <MITARBEITER_DATA> TO <M>.
      ENDIF.
    ENDIF.

    APPEND <ABWESENHEITEN> TO <M>-ABWESENHEITEN.
  ENDLOOP.
Obenstehender Code dumpt leider in der Zeile mit dem MOVE-CORRESPONDING. Wie im Code erkennbar zeigt <M> auf eine Zeile der internen Tabelle M, und das ist eine sortierte Tabelle mit UNIQUE KEY PERNR. Obgleich oben im Code klar erkennbar ist, dass <MITARBEITER_DATA>-PERNR und <M>-PERNR gleich sein müssen (denn darüber wird das Feldsymbol <MITARBEITER_DATA> ja zugewiesen), dumpt er mir beim MOVE-CORRESPONDING weg mit der Begründung, ich würde in der Zieltabelle ein Schlüsselfeld überschreiben, was nicht zulässig ist, da Schlüsselfelder nur lesend angesprochen werden dürfen.

Was ich an dieser Stelle also bräuchte (um nicht alle relevanten Komponenten einzeln aufzählen zu müssen), wäre so etwas wie:

Code: Alles auswählen.

MOVE-CORRESPONDING <MITARBEITER_DATA> TO <M> EXCLUDING PERNR.
Diese Syntax gibt es aber leider nicht. Fälle jemandem eine elegante Lösung für dieses Problem ein?



Re: Ich bräuchte mal eine elegante Lösung für MOVE-CORRESPONDING EXCLUDING

Beitrag von DeathAndPain (Top Expert / 1051 / 122 / 230 ) » 23. Mai 2019 14:59

Das haut aber nicht hin, weil ich solch 7.40-Operator ja nur im Rahmen einer Komplettzuweisung nutzen kann. Bei

Code: Alles auswählen.

<M> = CORRESPONDING #( <MITARBEITER_DATA> EXCEPT PERNR ).
würde er die Spalte PERNR initial machen und dadurch in diesem Falle sogar tatsächlich versuchen, die Schlüsselspalte der Tabelle mit einem anderen Wert zu überschreiben!

Re: Ich bräuchte mal eine elegante Lösung für MOVE-CORRESPONDING EXCLUDING

Beitrag von black_adept (Top Expert / 3243 / 54 / 568 ) » 23. Mai 2019 15:45

Coding umstellen. Erst eine Struktur füllen und dann komplett via INSERT einfügen weil du beim Befüllen der Struktur noch ein Move-Corresponding machen kannst.
P.S. Die folgenden Codeschnipsel machen das Selbe.

Code: Alles auswählen.

INSERT VALUE #( PERNR = <ABWESENHEITEN>-PERNR ) INTO TABLE M.
      ASSIGN M[ PERNR = <ABWESENHEITEN>-PERNR ] TO <M>.

Code: Alles auswählen.

INSERT VALUE #( PERNR = <ABWESENHEITEN>-PERNR ) INTO TABLE M ASSIGNING <M>.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
DeathAndPain (24. Mai 2019 18:31)

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Ich bräuchte mal eine elegante Lösung für MOVE-CORRESPONDING EXCLUDING

Beitrag von ewx (Top Expert / 3963 / 164 / 366 ) » 23. Mai 2019 16:56

Du kannst auch den Datenteil separat als ALIAS definieren:

Code: Alles auswählen.

TYPES: BEGIN OF ts_data,
         a TYPE i,
         b TYPE i,
         c TYPE i,
       END OF ts_data,
       BEGIN OF ts_struc,
         k TYPE n LENGTH 1.
    INCLUDE TYPE ts_data AS data.
TYPES: END OF ts_struc,
tt_table TYPE SORTED TABLE OF ts_struc WITH UNIQUE KEY k.
DATA data TYPE tt_table.
DATA new TYPE ts_struc.

INSERT VALUE #( k = '1' a = 1 b = 1 c = 1 ) INTO TABLE data.

new-k = '1'.
new-a = 2.
new-b = 2.
new-c = 2.

READ TABLE data ASSIGNING FIELD-SYMBOL(<data>) INDEX 1.
IF sy-subrc = 0.
  MOVE-CORRESPONDING new TO <data>-data.
ENDIF.
Ist halt insofern nicht schön, weil man dafür die Strukturdefinition ändern muss, auf die man evtl. gar keinen Zugriff hat.
Löst aber das Problem.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
DeathAndPain (24. Mai 2019 18:40)


Re: Ich bräuchte mal eine elegante Lösung für MOVE-CORRESPONDING EXCLUDING

Beitrag von DeathAndPain (Top Expert / 1051 / 122 / 230 ) » 24. Mai 2019 18:44

Pfiffig ist es auf jeden Fall, danke.
black_adept hat geschrieben:Coding umstellen. Erst eine Struktur füllen und dann komplett via INSERT einfügen weil du beim Befüllen der Struktur noch ein Move-Corresponding machen kannst.
In diesem Fall könnte ich das machen, da die Zeile ohnehin neu eingefügt werden soll. Aber dann bräuchte ich halt wieder eine Workareastruktur zum Aufbau der Tabellenzeile und wäre damit letztlich wieder auf Pre-7.40-Codingniveau. Das hätte ich mir gerne erspart.

Aber dass der INSERT-Befehl den Zusatz ASSIGNING unterstützt, war mir nicht bekannt. Das ist auf jeden Fall klasse, vielen Dank!

Seite 1 von 1

Aktuelle Forenbeiträge

BAPI_PO_CREATE1 und Einkaufsinfosatz
vor 13 Stunden von SweetRuedi 1 / 28
Format xx oder xx-xx oder xx-xx-xx
Gestern von black_adept 5 / 171
Salv Table - Layouts speichern
Gestern von ewx 2 / 66
Quellcodeänderung mehrerer Programme
vor 2 Tagen von Tron 9 / 287
WCOCO: Gruppe für Betragsfelder 0S01
vor 2 Tagen von SAP_ENTWICKLER 1 / 40

Unbeantwortete Forenbeiträge

BAPI_PO_CREATE1 und Einkaufsinfosatz
vor 13 Stunden von SweetRuedi 1 / 28
WCOCO: Gruppe für Betragsfelder 0S01
vor 2 Tagen von SAP_ENTWICKLER 1 / 40
CAS-Nr.: Chemical Abstracs Service
vor 4 Tagen von SAP_ENTWICKLER 1 / 74
Interaktives Skript, Rolle IC-Manager
vor einer Woche von erubadhron86 1 / 113
Wie findet man das Rahmenprogramm eines Infosets?
vor einer Woche von DeathAndPain 1 / 130