*&———————————————————————*
*& Form CREATE_SD
*&———————————————————————*
* text
*———————————————————————-*
* –> p1 text
* <-- p2 text
*———————————————————————-*
FORM CREATE_SD
* TABLES I_VBELN
USING INT_PUR_ORDER
SUCCESS
.
* 1. lösche alte SD-Aufträge
* 2. lese die interne Bestellung
* 3. Aufteilen der Bestellung nach Debitor
* 4. anlegen von SD-Aufträgen, gruppiert nach Debitor
* 5. Tabellenpflege ZNEBP_BELEGE_SD
* lese die Belegnummern aus Tabelle
CLEAR I_ZNEBP_BELEGE_SD[].
SELECT * FROM ZNEBP_BELEGE_SD INTO I_ZNEBP_BELEGE_SD WHERE
EBELN = INT_PUR_ORDER.
APPEND I_ZNEBP_BELEGE_SD.
ENDSELECT.
* lösche die gelesenen SD-Aufträge
LOOP AT I_ZNEBP_BELEGE_SD.
ORDER_HEADER_CH_INX-UPDATEFLAG = ‚D‘.
CLEAR SD_RETURN[].
CALL FUNCTION ‚BAPI_SALESORDER_CHANGE‘
EXPORTING
SALESDOCUMENT = I_ZNEBP_BELEGE_SD-NEBP_SD
* ORDER_HEADER_IN =
ORDER_HEADER_INX = ORDER_HEADER_CH_INX
TABLES
RETURN = SD_RETURN
.
* Alles klar?
READ TABLE SD_RETURN WITH KEY TYPE = ‚E‘.
* BREAK PBOLLIG.
IF SY-SUBRC EQ 0.
CALL FUNCTION ‚BAPI_TRANSACTION_ROLLBACK‘.
ELSE.
CALL FUNCTION ‚BAPI_TRANSACTION_COMMIT‘
EXPORTING
WAIT = ‚X‘.
* löschen des Eintrags aus der Referenztabelle
ENDIF.
DELETE FROM ZNEBP_BELEGE_SD WHERE
EBELN = I_ZNEBP_BELEGE_SD-EBELN AND
NEBP_SD = I_ZNEBP_BELEGE_SD-NEBP_SD.
ENDLOOP.
COMMIT WORK AND WAIT.
CLEAR I_ZNEBP_BELEGE_SD[].
* hole Details zur internen Bestellung
CALL FUNCTION ‚BAPI_PO_GETDETAIL1‘
EXPORTING
PURCHASEORDER = INT_PUR_ORDER
ACCOUNT_ASSIGNMENT = ‚X‘
IMPORTING
POHEADER = POHEADER
TABLES
RETURN = TBEST_RETURN
POITEM = POITEM
POACCOUNT = POACCOUNT
POSCHEDULE = POSCHEDULE.
* Welche SD-Auftragsart soll verwendet werden?
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_DOC_TYPE WHERE
KART EQ ‚SD_DOCTYP‘.
IF SY-SUBRC 0.
I_DOC_TYPE = ‚ZI02‘. „Standartwert
ENDIF.
* zu verwendender Buchungskreis
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_SALES_ORG WHERE
KART EQ ‚BUKRS‘.
IF SY-SUBRC 0.
I_SALES_ORG = ‚1000‘. „Standartwert
ENDIF.
* zu verwendender Vertriebsweg
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_DISTR_CHAN WHERE
KART EQ ‚DISTR_CHAN‘.
IF SY-SUBRC 0.
I_DISTR_CHAN = ’10‘. „Standartwert
ENDIF.
* zu verwendende Sparte
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_DIVISION WHERE
KART EQ ‚SPARTE‘.
IF SY-SUBRC 0.
I_DIVISION = ’10‘. „Standartwert
ENDIF.
* zu verwendendes Werk
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_PLANT WHERE
KART EQ ‚SD_PLANT‘.
IF SY-SUBRC 0.
I_PLANT = ‚100‘. „Standartwert
ENDIF.
* zu verwendende Mengeneinheit
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_MEINS WHERE
KART EQ ‚MEINS_SD‘.
IF SY-SUBRC 0.
I_MEINS = ‚ZPR‘. „Standartwert
ENDIF.
ORDER_HEADER_IN-DOC_TYPE = I_DOC_TYPE.
ORDER_HEADER_IN-SALES_ORG = I_SALES_ORG.
ORDER_HEADER_IN-DISTR_CHAN = I_DISTR_CHAN.
ORDER_HEADER_IN-DIVISION = I_DIVISION.
ORDER_HEADER_IN-PURCH_NO_C = INT_PUR_ORDER.
ORDER_HEADER_INX-DOC_TYPE = ‚X‘.
ORDER_HEADER_INX-SALES_ORG = ‚X‘.
ORDER_HEADER_INX-DISTR_CHAN = ‚X‘.
ORDER_HEADER_INX-DIVISION = ‚X‘.
ORDER_HEADER_INX-PURCH_NO_C = ‚X‘.
SORT POITEM BY PO_ITEM.
SORT POACCOUNT BY COSTCENTER PO_ITEM.
PERFORM CLEAR_SD_TAB.
CLEAR I_VBELN[].
* Für die Aufteilung nach Debitor ist die Tabelle POACCOUNT führend
* Füllen der ersten beiden Spalten der internen Tabelle
* Nontwendig für Gruppenstufenbildung
LOOP AT POACCOUNT.
MOVE POACCOUNT-COSTCENTER TO I_POACCOUNT-COSTCENTER_S.
MOVE POACCOUNT-PO_ITEM TO I_POACCOUNT-PO_ITEM_S.
MOVE-CORRESPONDING POACCOUNT TO I_POACCOUNT.
APPEND I_POACCOUNT.
ENDLOOP.
SORT I_POACCOUNT BY COSTCENTER_S PO_ITEM_S.
LOOP AT I_POACCOUNT.
* BREAK PBOLLIG.
READ TABLE POITEM WITH KEY
PO_ITEM = I_POACCOUNT-PO_ITEM
INTO I_POITEM.
APPEND I_POITEM.
* ist die Position mit Löschkennzeichen versehen,
* dann brauchen wir sie nicht weiter zu betrachten.
IF I_POITEM-DELETE_IND = ‚L‘ OR SY-SUBRC 0.
CLEAR I_POITEM[].
CONTINUE.
ENDIF.
I_MENGE = I_MENGE + I_POACCOUNT-QUANTITY.
ORDER_ITEMS_IN-ITM_NUMBER = I_POITEM-PO_ITEM.
ORDER_ITEMS_IN-PO_ITM_NO = I_POITEM-PO_ITEM.
ORDER_ITEMS_IN-MATERIAL = I_POITEM-MATERIAL.
ORDER_ITEMS_IN-PLANT = I_PLANT.
ORDER_ITEMS_IN-TARGET_QTY = I_MENGE.
ORDER_ITEMS_IN-TARGET_QU = I_MEINS.
APPEND ORDER_ITEMS_IN.
ORDER_ITEMS_INX-ITM_NUMBER = I_POITEM-PO_ITEM.
ORDER_ITEMS_INX-PO_ITM_NO = I_POITEM-PO_ITEM.
ORDER_ITEMS_INX-MATERIAL = ‚X‘.
ORDER_ITEMS_INX-UPDATEFLAG = ‚I‘.
ORDER_ITEMS_INX-PLANT = ‚X‘.
ORDER_ITEMS_INX-TARGET_QTY = ‚X‘.
ORDER_ITEMS_INX-TARGET_QU = ‚X‘.
APPEND ORDER_ITEMS_INX.
ORDER_SCHEDULE_IN-ITM_NUMBER = I_POITEM-PO_ITEM.
ORDER_SCHEDULE_IN-SCHED_LINE = SY-TABIX.
ORDER_SCHEDULE_IN-REQ_QTY = I_MENGE.
APPEND ORDER_SCHEDULE_IN.
ORDER_SCHEDULES_INX-ITM_NUMBER = I_POITEM-PO_ITEM.
ORDER_SCHEDULES_INX-SCHED_LINE = SY-TABIX.
ORDER_SCHEDULES_INX-UPDATEFLAG = ‚I‘.
ORDER_SCHEDULES_INX-REQ_QTY = ‚X‘.
APPEND ORDER_SCHEDULES_INX.
CLEAR I_MENGE.
ORDER_PARTNERS-PARTN_ROLE = ‚AG‘.
SELECT SINGLE KUNNR FROM ZSD_ROBBKSDEB INTO I_KUNNR WHERE
KOSTL EQ POACCOUNT-COSTCENTER AND DATBI GE SY-DATUM.
ORDER_PARTNERS-PARTN_NUMB = I_KUNNR.
CLEAR SD_RETURN[].
IF I_KUNNR IS INITIAL.
CONCATENATE ‚Debitor zur Kostenstelle:‘ I_POACCOUNT-COSTCENTER ‚fehlt in der Tabelle ZSD_ROBBKSDEB‘
INTO SD_RETURN-MESSAGE SEPARATED BY SPACE.
APPEND SD_RETURN.
* Fall kein Debitor gepflegt ist soll eine Meldung ausgegeben werden.
CALL FUNCTION ‚Z_POPUP_RETURN_PARAM‘
TABLES
RETURN = SD_RETURN.
ENDIF.
CLEAR SD_RETURN[].
I_ORDER_EXTENSION-STRUCTURE = ‚BAPE_VBAK‘.
IF POACCOUNT-COSTCENTER IS INITIAL.
I_ORDER_EXTENSION-VALUEPART1+10 = ‚9999999‘.
ELSE.
I_ORDER_EXTENSION-VALUEPART1+10 = POACCOUNT-COSTCENTER.
ENDIF.
APPEND I_ORDER_EXTENSION.
APPEND ORDER_PARTNERS.
* bei erreichen des letzten Datensatzes zur Kostenstelle wird der Beleg angelegt.
AT END OF COSTCENTER_S.
CALL FUNCTION ‚BAPI_SALESORDER_CREATEFROMDAT2‘
EXPORTING
* SALESDOCUMENTIN =
ORDER_HEADER_IN = ORDER_HEADER_IN
ORDER_HEADER_INX = ORDER_HEADER_INX
IMPORTING
SALESDOCUMENT = VBELN
TABLES
RETURN = SD_RETURN
ORDER_ITEMS_IN = ORDER_ITEMS_IN
ORDER_ITEMS_INX = ORDER_ITEMS_INX
ORDER_PARTNERS = ORDER_PARTNERS
ORDER_SCHEDULES_IN = ORDER_SCHEDULE_IN
ORDER_SCHEDULES_INX = ORDER_SCHEDULES_INX
EXTENSIONIN = I_ORDER_EXTENSION
.
READ TABLE SD_RETURN WITH KEY TYPE = ‚E‘.
* BREAK PBOLLIG.
IF SY-SUBRC EQ 0.
CALL FUNCTION ‚BAPI_TRANSACTION_ROLLBACK‘.
ELSE.
CALL FUNCTION ‚BAPI_TRANSACTION_COMMIT‘
EXPORTING
WAIT = ‚X‘
* IMPORTING
* RETURN =
.
* CLEAR I_ZNEBP_BELEGE_SD[].
I_ZNEBP_BELEGE_SD-EBELN = INT_PUR_ORDER.
I_ZNEBP_BELEGE_SD-ZDEBT = I_KUNNR.
I_ZNEBP_BELEGE_SD-NEBP_SD = VBELN.
APPEND I_ZNEBP_BELEGE_SD.
* I_VBELN = VBELN.
* APPEND I_VBELN.
ENDIF.
PERFORM CLEAR_SD_TAB.
ENDAT.
ENDLOOP.
* Festschreiben der Belegnummern in der Tabelle nur dann, wenn auch Sätze
* vorhanden sind.
DESCRIBE TABLE I_ZNEBP_BELEGE_SD LINES ZEILEN.
IF ZEILEN > 0.
SUCCESS = ‚X‘.
LOOP AT I_ZNEBP_BELEGE_SD.
INSERT INTO ZNEBP_BELEGE_SD VALUES I_ZNEBP_BELEGE_SD.
ENDLOOP.
COMMIT WORK AND WAIT.
ENDIF.
ENDFORM. “ CREATE_SD