Code: Alles auswählen.
LOOP AT p_table ASSIGNING FIELD-SYMBOL(<p_table>).
SELECT objky kschl erdat vstat parnr
INTO CORRESPONDING FIELDS OF TABLE p_nast
FROM nast
WHERE objky EQ <p_table>-vbeln AND
kschl EQ 'X'.
IF sy-subrc NE 0.
INSERT ZFI_FEHLER FROM <p_table>.
ENDIF.
Code: Alles auswählen.
types:BEGIN OF ty_vbrk,
vbeln TYPE c LENGTH 30,
fkart TYPE vbrk-fkart,
fkdat TYPE vbrk-fkdat,
rfbsk TYPE vbrk-rfbsk,
END OF ty_vbrk.
TYPES: tty_vbrk TYPE TABLE OF ty_vbrk,
tty_nast TYPE TABLE OF ty_nast.
data: gt_nast TYPE tty_nast,
gt_sap TYPE tty_vbrk.
PERFORM f_nast USING gt_sap CHANGING gt_nast.
FORM f_nast
USING p_table TYPE tty_vbrk CHANGING p_nast TYPE tty_nast.
LOOP AT p_table ASSIGNING FIELD-SYMBOL(<p_table>).
SELECT objky kschl erdat vstat parnr
appending CORRESPONDING FIELDS OF TABLE p_nast
FROM nast
WHERE objky EQ <p_table>-vbeln AND
kschl EQ 'X'.
IF sy-subrc NE 0.
INSERT zfi_fehler from <p_table>.
ENDIF.
ENDLOOP.
ENDFORM.
Trotzdem ist genau das die Ursache. Wenn Du einen INSERT zfi_fehler from <p_table>. machst, dann beachtet er keine Unterfeldgrenzen, sondern schreibt Byte für Byte den Inhalt von <p_table> in die Datenbankzeile. Das geht schief ab dem ersten Feld, dessen Länge nicht übereinstimmt. Bei Dir ist das gleich das allererste Feld.Das Feld VBELN hat in der Tabelle ZFI_FEHLER eine Länge nur von 10. Alle anderen Felder sind gleichlang. Aber genau dieses Feld wird ja trotz der unterschiedlichen Definition gefüllt. Alle anderen Felder, die für mich gleich aussehen, werden nicht gefüllt.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag (Insgesamt 4):
jocoder • abuma • Sonne1234 • Legxis
Code: Alles auswählen.
BEGIN OF ty_bkpf,
bukrs TYPE bkpf-bukrs,
blart TYPE bkpf-blart,
bldat TYPE bkpf-bldat,
budat TYPE bkpf-budat,
* xblnr TYPE c LENGTH 10,
xblnr type bkpf-xblnr,
END OF ty_bkpf,
BEGIN OF ty_vbrk,
vbeln type vbrk-vbeln,
fkart TYPE vbrk-fkart,
fkdat TYPE vbrk-fkdat,
rfbsk TYPE vbrk-rfbsk,
END OF ty_vbrk.
DATA: gt_bkpf TYPE STANDARD TABLE OF ty_bkpf,
gt_vbrk TYPE STANDARD TABLE OF ty_vbrk.
SELECT bukrs blart bldat budat xblnr
FROM bkpf
INTO CORRESPONDING FIELDS OF TABLE gt_bkpf
WHERE bukrs IN so_bukrs AND
blart IN so_blart AND
cpudt IN so_cpudt AND
awtyp IN so_awtyp.
SELECT vbeln fkart fkdat rfbsk
INTO CORRESPONDING FIELDS OF TABLE gt_vbrk
FROM vbrk FOR ALL ENTRIES IN gt_bkpf
WHERE vbeln EQ gt_bkpf-xblnr.
ENDIF.
Code: Alles auswählen.
DATA xblnr_as_vbeln TYPE STANDARD TABLE OF vbeln WITH EMPTY KEY.
SELECT bukrs blart bldat budat xblnr
FROM bkpf
INTO CORRESPONDING FIELDS OF TABLE gt_bkpf
WHERE bukrs IN so_bukrs AND
blart IN so_blart AND
cpudt IN so_cpudt AND
awtyp IN so_awtyp.
xblnr_as_vbeln = VALUE #( FOR <zeile> IN gt_bkpf ( CONV vbeln( <zeile> ) ).
SELECT vbeln fkart fkdat rfbsk
INTO CORRESPONDING FIELDS OF TABLE gt_vbrk
FROM vbrk FOR ALL ENTRIES IN xblnr_as_vbeln
WHERE vbeln EQ xblnr_as_vbeln-table_line.
FREE xblnr_as_vbeln.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Sonne1234
Code: Alles auswählen.
DATA xblnr_as_vbeln TYPE STANDARD TABLE OF vbeln WITH EMPTY KEY.
Finde ich von der Benamung her ungünstig. tab_vbeln
DATA tab_vbeln TYPE STANDARD TABLE OF vbeln WITH EMPTY KEY.
tab_vbeln = VALUE #( FOR <zeile> IN gt_bkpf ( CONV vbeln( <zeile>-xblnr ) ).
Es fehlte das -xblnr um das korrekte Feld anzusprechen.
----
Du kannst auch gleich einen Join verwenden, wenn du die Werte aus gt_bkpf nicht brauchst .
SELECT v~vbeln, v~fkart, v~fkdat, v~rfbsk
FrOM bkpf AS b
INNER JOIN vbrk as v ON vbeln = b~xblnr
INTO TABLE @DATA(tab_vbrk)
WHERE b~bukrs IN @so_bukrs AND
b~blart IN @so_blart AND
b~cpudt IN @so_cpudt AND
b~awtyp IN @so_awtyp.
Mir ist da ein kleiner Fehler unterlaufen, der sich bei Verwendung der (an sich hervorragenden) 7.40-Notation gerne mal einschleicht:Wenn ich das Coding genauso, wie von dir unter a beschrieben, aufbaue, wird anschließend leider nichts mehr selektiert.
XBLNR_AS_VBELN erhält dann die Werte Buchungskreis und Belegnummer. Das sind die beiden Felder, die in meiner Tabelle gt_bkpf als erstes definiert worden sind.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Sonne1234