SD-Beleg anlegen und ändern

*&———————————————————————*
*&      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

Dieser Eintrag wurde veröffentlicht in SAP/ABAP von . Setze ein Lesezeichen zum Permalink.

Schreibe einen Kommentar