Code: Alles auswählen.
REPORT z_auftrag_absagen.
* Internal tables
DATA: gt_vbap TYPE STANDARD TABLE OF vbap,
gt_vbep TYPE STANDARD TABLE OF vbep,
gt_order_item_in TYPE STANDARD TABLE OF bapisditm,
gt_order_item_inx TYPE STANDARD TABLE OF bapisditmx,
gt_return TYPE STANDARD TABLE OF bapiret2_t.
* Structure
DATA: gs_order_item_in TYPE bapisditm,
gs_order_header_in TYPE bapisdh1,
gs_order_header_inx TYPE bapisdh1x,
gs_order_item_inx TYPE bapisditmx.
* Variablen
DATA: gv_simulation TYPE bapiflag-bapiflag,
gv_salesdocument TYPE bapivbeln-vbeln.
* Field-Symbol
FIELD-SYMBOLS <vb> TYPE vbap.
FIELD-SYMBOLS <return> TYPE .
SELECT posnr FROM vbap INTO gs_order_item_in-itm_number
WHERE vbeln = <vb>-vbeln
AND pstyv = 'ZHAU'
AND abgru = space.
gs_order_item_in-reason_rej = 'Z1'.
gs_order_item_inx-updateflag = 'U'.
gs_order_item_inx-itm_number = gs_order_item_in-itm_number.
gs_order_item_inx-reason_rej = 'X'.
APPEND gs_order_item_in TO gt_order_item_in.
APPEND gs_order_item_inx TO gt_order_item_inx.
ENDSELECT.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = gv_salesdocument
order_header_in = gs_order_header_in
order_header_inx = gs_order_header_inx
simulation = gv_simulation
TABLES
return = gt_return
order_item_in = gt_order_item_in
order_item_inx = gt_order_item_inx.
gv_result = gc_erfolg.
LOOP AT gt_return ASSIGNING <return> WHERE type = 'E'.
gv_result = <return>-message.
EXIT.
ENDLOOP.
Code: Alles auswählen.
REPORT zpostion_absagen.
CONSTANTS gc_erfolg TYPE text40 VALUE 'geändert'.
TYPES: BEGIN OF gs_vbep,
vbeln TYPE vbep-vbeln,
posnr TYPE vbep-posnr,
END OF gs_vbep.
TYPES: BEGIN OF gs_vbup,
vbeln TYPE vbup-vbeln,
posnr TYPE vbup-posnr,
lfsta TYPE vbup-lfsta,
END OF gs_vbup.
TYPES: BEGIN OF ls_absage,
vbeln TYPE vbep-vbeln,
posnr TYPE vbep-posnr,
lfsta TYPE vbup-lfsta,
absage type gs_vbup,
END OF ls_absage.
**********************************************************************
* Daten deklaration *
**********************************************************************
* Interne Tabellen
DATA:
lt_absage TYPE STANDARD TABLE OF ls_absage WITH EMPTY KEY,
gt_vbep TYPE STANDARD TABLE OF vbep,
gt_vbup TYPE STANDARD TABLE OF vbup,
gt_return TYPE STANDARD TABLE OF bapiret2,
gt_order_item_in TYPE STANDARD TABLE OF bapisditm,
gt_order_item_inx TYPE STANDARD TABLE OF bapisditmx.
* Strukturen
DATA:
gs_vbep TYPE vbep,
gs_vbup TYPE vbup,
gs_order_header_in TYPE bapisdh1,
gs_order_header_inx TYPE bapisdh1x,
gs_order_item_in TYPE bapisditm,
gs_order_item_inx TYPE bapisditmx.
* Variablen
DATA:
gv_salesdocument TYPE bapivbeln-vbeln,
gv_simulation TYPE bapiflag-bapiflag,
gv_result TYPE text40.
FIELD-SYMBOLS <return> TYPE bapiret2.
**********************************************************************
* Ende Daten deklaration *
**********************************************************************
* Start of Selektion *
**********************************************************************
START-OF-SELECTION.
CLEAR gt_vbup.
BREAK-POINT.
SELECT vbeln posnr lfsta FROM vbup
INTO CORRESPONDING FIELDS OF TABLE gt_vbup.
**********************************************************************
* Ende der Selecion *
**********************************************************************
* Start der Verarbeitung *
**********************************************************************
LOOP AT gt_vbep ASSIGNING FIELD-SYMBOL(<lf_vbep>).
LOOP AT gt_vbup ASSIGNING FIELD-SYMBOL(<lf_vbup>) WHERE vbeln = <lf_vbep>-vbeln
AND posnr = <lf_vbep>-posnr.
ASSIGN lt_absage[ lfsta = <lf_vbup>-lfsta ] TO FIELD-SYMBOL(<lf_absage>).
IF sy-subrc <> 0.
INSERT VALUE #( lfsta = <lf_vbup>-lfsta ) INTO TABLE lt_absage.
ASSIGN lt_absage[ lfsta = <lf_vbup>-lfsta ] TO <lf_absage>.
ENDIF.
READ TABLE gt_vbup INTO gs_vbup
WITH KEY vbeln = <lf_vbup>-vbeln
posnr = <lf_vbup>-posnr
lfsta = <lf_vbup>-lfsta.
IF <lf_vbup>-lfsta = 'A' OR <lf_vbup>-lfsta = 'B'.
APPEND gs_vbup TO gt_vbup.
ENDIF.
ENDLOOP.
ENDLOOP.
gv_result = 'nix gefunden'.
**********************************************************************
* Ende der Verarbeitung *
**********************************************************************
* Funktionsbaustein 'BAPI_SALESORDER_CHANGE' *
**********************************************************************
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = gv_salesdocument
order_header_in = gs_order_header_in
order_header_inx = gs_order_header_inx
simulation = gv_simulation
TABLES
return = gt_return
order_item_in = gt_order_item_in
order_item_inx = gt_order_item_inx.
gv_result = gc_erfolg.
LOOP AT gt_return ASSIGNING <return> WHERE type = 'E'.
gv_result = <return>-message.
EXIT.
IF gv_simulation = 'X'.
CONCATENATE 'TEST: ' gv_result INTO gv_result SEPARATED BY space.
WRITE: /, 'TEST: ', gv_salesdocument, 'wurde abgesagt'.
ELSE.
IF gv_result = gc_erfolg.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
WRITE: /, gv_salesdocument, 'wurde abgesagt'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
ENDIF.
ENDLOOP.
MESSAGE i208(00) WITH gv_result.
Code: Alles auswählen.
LOOP AT gt_vbep ASSIGNING FIELD-SYMBOL(<lf_vbep>).
LOOP AT gt_vbup ASSIGNING FIELD-SYMBOL(<lf_vbup>) WHERE vbeln = <lf_vbep>-vbeln
AND posnr = <lf_vbep>-posnr.
ASSIGN lt_absage[ lfsta = <lf_vbup>-lfsta ] TO FIELD-SYMBOL(<lf_absage>).
IF sy-subrc <> 0.
INSERT VALUE #( lfsta = <lf_vbup>-lfsta ) INTO TABLE lt_absage.
ASSIGN lt_absage[ lfsta = <lf_vbup>-lfsta ] TO <lf_absage>.
ENDIF..
Code: Alles auswählen.
REPORT ZABSAGE.
CONSTANTS GC_ERFOLG TYPE TEXT40 VALUE 'geändert'.
TYPES: BEGIN OF TY_VB,
VBELN TYPE VBUP-VBELN,
POSNR TYPE VBUP-POSNR,
END OF TY_VB.
**********************************************************************
* Daten deklaration Anfang
**********************************************************************
* Interne Tabellen
DATA:
GT_VB TYPE SORTED TABLE OF TY_VB WITH UNIQUE KEY VBELN POSNR,
GT_RETURN TYPE TABLE OF BAPIRET2,
GT_ORDER_ITEM_IN TYPE TABLE OF BAPISDITM,
GT_ORDER_ITEM_INX TYPE TABLE OF BAPISDITMX.
* Variablen
DATA:
GV_SALESDOCUMENT TYPE BAPIVBELN-VBELN,
GV_RESULT TYPE TEXT40,
GV_DUMMY_VBELN TYPE VBUP-VBELN.
* Field-Symbol
FIELD-SYMBOLS <VB> LIKE LINE OF GT_VB.
FIELD-SYMBOLS <RETURN> TYPE BAPIRET2.
**********************************************************************
* Daten deklaration Ende *
**********************************************************************
* Start of Selection *
**********************************************************************
* SD_SALESDOCUMENT_CHANGE
SELECTION-SCREEN BEGIN OF BLOCK B01 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS S_VBELN FOR GV_DUMMY_VBELN.
SELECTION-SCREEN SKIP.
PARAMETERS P_TEST AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK B01.
BREAK-POINT.
START-OF-SELECTION.
SELECT VBELN POSNR INTO TABLE GT_VB FROM VBUP
WHERE VBELN IN S_VBELN
AND LFSTA IN ('A','B').
GV_RESULT = 'nix gefunden'.
LOOP AT GT_VB ASSIGNING <VB>.
AT NEW VBELN.
GV_SALESDOCUMENT = <VB>-VBELN.
CLEAR: GT_RETURN[], GT_ORDER_ITEM_IN[], GT_ORDER_ITEM_INX[].
ENDAT.
APPEND VALUE #( REASON_REJ = 'Z1' ) TO GT_ORDER_ITEM_IN.
APPEND VALUE #(
* ITM_NUMBER = zu klären?!?
REASON_REJ = 'X' ) TO GT_ORDER_ITEM_INX.
ENDLOOP.
**********************************************************************
* Funktionsbaustein 'BAPI_SALESORDER_CHANGE' *
**********************************************************************
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
SALESDOCUMENT = GV_SALESDOCUMENT
ORDER_HEADER_INX = VALUE BAPISDH1X( UPDATEFLAG = 'U' )
SIMULATION = P_TEST
TABLES
RETURN = GT_RETURN
ORDER_ITEM_IN = GT_ORDER_ITEM_IN
ORDER_ITEM_INX = GT_ORDER_ITEM_INX.
**********************************************************************
ASSIGN GT_RETURN[ TYPE = 'E' ]-MESSAGE TO FIELD-SYMBOL(<ERRORMESSAGE>). " Meldung aus Zeile mit Fehler dem Feldsymbol zuordnen
GV_RESULT = SWITCH #( SY-SUBRC WHEN 0 THEN <ERRORMESSAGE> " wenn solch Zeile gefunden, dann Fehlermeldung daraus nehmen
ELSE GC_ERFOLG ). " andernfalls hat alles geklappt
IF P_TEST = 'X'.
gv_result = `Test: ` && GV_RESULT.
WRITE: / 'Test: ', GV_SALESDOCUMENT, 'wurde abgesagt'.
ELSE.
IF GV_RESULT = GC_ERFOLG.
**********************************************************************
* Funktionsbaustein 'BAPI_TRANSACTION_COMMIT' *
**********************************************************************
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
WRITE: /, GV_SALESDOCUMENT, 'wurde abgesagt'.
ELSE.
**********************************************************************
* Funktonsbaustein 'BAPI_TRANSACTION_ROLLBACK' *
**********************************************************************
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
ENDIF.
MESSAGE i208(00) WITH gv_result.
Da wird er stehen, aber da hat die Datenbank keinen Index drauf. Von der VBAP kommend ist das damit keine performante Option.Evtl. steht der Vorgängerbeleg in LIPS-VBELV und LIPS-POSNV.
ja, das wäre sinnvoll.ABAPlerv hat geschrieben: ↑12.04.2022 16:41Hallo,
ich müsste in der VBEP Tabelle den Delivery Block für jede Position ändern.
Ich habe noch nie ein BAPI verwendet und wollte jetzt mal nachfragen, wie ich das machen soll.
1. Frage: Soll ich ein Report schreiben, der einmal ausgeführt wird und den BAPI BAPI_SALESORDER_CHANGE verwendet?
Positionsnummern gibst du im Parameter ORDER_ITEM_IN mit.
Wichtig bei allen BAPIs: Funktionsbaustein BAPI_TRANSACTION_COMMIT aufrufen, wenn das Protokoll keine Fehler zeigt. ansonsten passiert nix!ABAPlerv hat geschrieben: ↑12.04.2022 16:413. Frage: Und wie ändere ich zu einen gegeben VBELN und POSNR die Delivery Block, in welchen Parameter schreibe ich den gewünschten Wert rein?
ORDER_ITEM_IN[1]-POSNR = 10
ORDER_ITEM_INX[1]-POSNR = 10
ORDER_ITEM_INX[1]-UPDATEFLAG = 'U'.
SCHEDULE_LINES[1]-POSNR = 10.
SCHEDULE_LINES[1]-ETENR = 1.
SCHEDULE_LINES[1]-REQ_DLV_BL = 'Z1'.
SCHEDULE_LINESX[1]-POSNR = 10.
SCHEDULE_LINESX[1]-ETENR = 1.
SCHEDULE_LINESX[1]-REQ_DLV_BL = 'X'.
SCHEDULE_LINESX[1]-UPDATEFLAG = 'U'.
ewx hat geschrieben: ↑12.04.2022 18:11ja, das wäre sinnvoll.ABAPlerv hat geschrieben: ↑12.04.2022 16:41Hallo,
ich müsste in der VBEP Tabelle den Delivery Block für jede Position ändern.
Ich habe noch nie ein BAPI verwendet und wollte jetzt mal nachfragen, wie ich das machen soll.
1. Frage: Soll ich ein Report schreiben, der einmal ausgeführt wird und den BAPI BAPI_SALESORDER_CHANGE verwendet?
Positionsnummern gibst du im Parameter ORDER_ITEM_IN mit.
Einteilungen in SCHEDULE_LINES.
für beide Parametertabellen musst du in der jeweils zugehörigen X-Struktur/ Tabelle die Felder ankreuzen, die geändert werden sollen.
ORDER_ITEM_INX
SCHEDULE_LINESX
Zusätzlich musst du in den X-Strukturen das Feld UPDATEFLAG auf "U" für UPDATE setzen.
Wichtig bei allen BAPIs: Funktionsbaustein BAPI_TRANSACTION_COMMIT aufrufen, wenn das Protokoll keine Fehler zeigt. ansonsten passiert nix!ABAPlerv hat geschrieben: ↑12.04.2022 16:413. Frage: Und wie ändere ich zu einen gegeben VBELN und POSNR die Delivery Block, in welchen Parameter schreibe ich den gewünschten Wert rein?
ORDER_ITEM_IN[1]-POSNR = 10
ORDER_ITEM_INX[1]-POSNR = 10
ORDER_ITEM_INX[1]-UPDATEFLAG = 'U'.
SCHEDULE_LINES[1]-POSNR = 10.
SCHEDULE_LINES[1]-ETENR = 1.
SCHEDULE_LINES[1]-REQ_DLV_BL = 'Z1'.
SCHEDULE_LINESX[1]-POSNR = 10.
SCHEDULE_LINESX[1]-ETENR = 1.
SCHEDULE_LINESX[1]-REQ_DLV_BL = 'X'.
Ich hätte vermutet, dass ORDER_HEADER_INX-UPDATEFLAG = 'U' für Update gesetzt werden muss.