Code: Alles auswählen.
Loop at p_vbrk assigning field-symbol(<p_vbrk>).
SELECT objky kschl erdat vstat parnr
APPENDING CORRESPONDING FIELDS OF TABLE p_nast
FROM nast
WHERE objky EQ <p_vbrk>-vbeln AND
kschl EQ 'X'.
ENDLOOP.
SORT p_nast.
*Doppelte Einträge aus NAST Tabelle löschen.
delete adjacent duplicates from p_nast comparing objky.
*Wenn der Status nicht gleich 1 ist, soll die Fehlertabelle gefüllt werden.
LOOP AT p_nast ASSIGNING <p_nast>.
IF <p_nast>-vstat NE 1.
LOOP AT p_vbrk ASSIGNING <p_vbrk>
WHERE vbeln EQ <p_nast>-objky.
INSERT ZFI_FEHLER FROM <p_vbrk>.
ENDLOOP.
ENDIF.
ENDLOOP.
*Ab hier nur werden nur noch die Einträge mit Status = 1 benötigt.
DELETE p_nast WHERE vstat = '0' OR vstat = '2'.
Das hängt vom Tabellenschlüssel ab. Wenn Du keinen vergibst, vergibt SAP einen Defaultschlüssel, der im wesentlichen alle zeichenartigen Spalten der Tabelle von links nach rechts umfasst. Dein Status 2 wird auch Bestandteil dieses Schlüssels sein. KSCHL ist bei Dir immer 'X' (laut SELECT-Bedingung). Der Fall, dass die Zeile mit dem Status 1 gelöscht wird, kann dann und nur dann passieren, wenn es Zeilen mit demselben OBJKY gibt, bei denen der Status 1 ein größeres ERDAT hat, vorausgesetzt, dass die Reihenfolge der Spalten in Deiner Tabelle dieselbe ist wie in Deinem SELECT-Statement (was ich leider nicht weiß).Ich bin mir zwar nicht ganz sicher, ob bei Delete adjacent dublicates wirklich dann auch immer die Zeile mit dem Status 2 gelöscht wird und nicht plötzlich die mit Status 1.
Code: Alles auswählen.
DELETE p_nast WHERE vstat = '0' OR vstat = '2'.
Code: Alles auswählen.
types: BEGIN OF ty_vbrk,
vbeln TYPE vbrk-vbeln,
fkart TYPE vbrk-fkart,
fkdat TYPE vbrk-fkdat,
rfbsk TYPE vbrk-rfbsk,
END OF ty_vbrk,
BEGIN OF ty_nast,
objky TYPE nast-objky,
kschl TYPE nast-kschl,
erdat TYPE nast-erdat,
vstat TYPE nast-vstat,
END OF ty_nast.
TYPES: tty_vbrk TYPE TABLE OF ty_vbrk,
tty_nast TYPE TABLE OF ty_nast.
data: gt_nast TYPE tty_nast,
gt_vbrk type tty_vbkr.
PERFORM f_nast USING gt_vbrk CHANGING gt_nast.
Loop at p_vbrk assigning field-symbol(<p_vbrk>).
SELECT objky kschl erdat vstat parnr
APPENDING CORRESPONDING FIELDS OF TABLE p_nast
FROM nast
WHERE objky EQ <p_vbrk>-vbeln AND
kschl EQ 'X'.
ENDLOOP.
SORT p_nast.
*Doppelte Einträge aus NAST Tabelle löschen.
delete adjacent duplicates from p_nast comparing objky.
*Wenn der Status nicht gleich 1 ist, soll die Fehlertabelle gefüllt werden.
LOOP AT p_nast ASSIGNING <p_nast>.
IF <p_nast>-vstat NE 1.
LOOP AT p_vbrk ASSIGNING <p_vbrk>
WHERE vbeln EQ <p_nast>-objky.
INSERT ZFI_FEHLER FROM <p_vbrk>.
ENDLOOP.
ENDIF.
ENDLOOP.
*Ab hier nur werden nur noch die Einträge mit Status = 1 benötigt.
DELETE p_nast WHERE vstat = '0' OR vstat = '2'.
Code: Alles auswählen.
SELECT objky kschl erdat vstat parnr
FROM nast
INTO CORRESPONDING FIELDS OF TABLE p_table
WHERE objky EQ <p_vbrk>-vbeln
AND kschl EQ 'X'.
AND NOT EXISTS (
SELECT vstat
FROM nast
WHERE objky EQ <p_vbrk>-vbeln
AND kschl EQ 'X'
AND vstat EQ '1' ).
Melde mich mal so halb Off-Topic dazu:DeathAndPain hat geschrieben: ↑20.01.2020 14:00Spätestens jetzt ist der Zeitpunkt gekommen, sich davon zu verabschieben und Tabellen des Typs SORTED oder gar HASHED zu verwenden.
Code: Alles auswählen.
types: BEGIN OF ty_vbrk,
vbeln TYPE vbrk-vbeln,
fkart TYPE vbrk-fkart,
fkdat TYPE vbrk-fkdat,
rfbsk TYPE vbrk-rfbsk,
END OF ty_vbrk,
BEGIN OF ty_nast,
objky TYPE nast-objky,
kschl TYPE nast-kschl,
erdat TYPE nast-erdat,
vstat TYPE nast-vstat,
END OF ty_nast.
TYPES: tty_vbrk TYPE TABLE OF ty_vbrk,
tty_unsorted_nast TYPE STANDARD TABLE OF ty_nast WITH EMPTY KEY,
tty_nast TYPE SORTED TABLE OF ty_nast WITH NON-UNIQUE KEY objky vstat.
data: gt_nast TYPE tty_nast,
gt_vbrk type tty_vbrk,
gt_unsorted_nast TYPE tty_unsorted_nast,
p_nast TYPE tty_nast.
PERFORM f_nast USING gt_vbrk CHANGING gt_nast.
Loop at p_vbrk assigning field-symbol(<p_vbrk>).
SELECT objky kschl erdat vstat parnr
APPENDING CORRESPONDING FIELDS OF TABLE gt_unsorted_nast
FROM nast
WHERE objky EQ <p_vbrk>-vbeln AND
kschl EQ 'X'.
ENDLOOP.
p_nast[] = gt_unsorted_nast[]. " aus unsortierter in sortierte Tabelle übertragen - das System sortiert dabei automatisch passend
FREE gt_unsorted_nast.
* Wenn es zu einem Beleg keinen Eintrag mit Status 1 gibt, soll die Fehlertabelle gefüllt werden.
LOOP AT p_vbrk assigning <p_vbrk>.
CHECK NOT LINE_EXISTS( p_nast[ objky = <p_vbrk>-VBELN vstat = '1' ] ).
INSERT ZFI_FEHLER FROM <p_vbrk>.
ENDLOOP
*Ab hier nur werden nur noch die Einträge mit Status = 1 benötigt.
DELETE p_nast WHERE vstat <> '1'.
Ja, aber:Und ja warum Delete p_nast where vstat = '0'. or vstat = '2' - weiß ich auch nicht. Es führt doch auch zum Ziel, oder nicht? ;)