interne Bestellung anlegen

FORM INT_BEST  TABLES
TEKPO STRUCTURE BEKPO
TEKET STRUCTURE BEKET
TEKKN STRUCTURE EKKNU
TKOMV STRUCTURE KOMV
USING  I_EKKO STRUCTURE EKKO
NEBP_EBELN TYPE ZNEBP_BELEGE-NEBP_EBELN
NB_EBELN TYPE ZNEBP_BELEGE-NB_EBELN.
*                  CHANGING
*                         PAR1.

*  Welche Materialnummer soll denn für die interne Bestellung gelten?
CLEAR I_LIFNR_TAB[].
SELECT * FROM ZNEBP_LIEFERANT INTO I_LIFNR_TAB. „Lieferant ableiten
APPEND I_LIFNR_TAB.
ENDSELECT.
LOOP AT I_LIFNR_TAB.
IF I_EKKO-EKGRP BETWEEN I_LIFNR_TAB-EKGRP_LOW AND I_LIFNR_TAB-EKGRP_HIGH.
I_MATERIAL = I_LIFNR_TAB-MABNR.
I_SPARTE   = I_LIFNR_TAB-SPARTE.
ENDIF.
ENDLOOP.

*  SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_WERT WHERE
*    KART EQ ‚MATINT1‘.
*  IF SY-SUBRC EQ 0.
*    I_MATERIAL = I_WERT.
*  ELSE.
*    CLEAR TBEST_RETURN[].
*    TBEST_RETURN-MESSAGE = ‚Materialnummer in der Tabelle ZNEBP_KONSTANTE ist nicht gepflegt‘.
*    CALL FUNCTION ‚Z_POPUP_RETURN_PARAM‘
*      TABLES
*        RETURN = TBEST_RETURN.
*  ENDIF.
* Welche Mengeneinheit wird verwendet?
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_MEINS WHERE
KART EQ ‚MEINS_PUR‘.
IF SY-SUBRC 0.
I_MEINS = ‚ZPR‘. „Standardwert
ENDIF.

“ Ermitteln des Nettopreises aus 1 EUR + Zuschläge
CLEAR I_COND[].
* Zuschläge Sparte
PERFORM ZUSCHLAG_ERMITTELN.
*  SELECT * FROM A998 INNER JOIN KONP ON KONP~KNUMH = A998~KNUMH
*    INTO CORRESPONDING FIELDS OF I_COND WHERE
*          A998~KAPPL =  ‚V‘
*    AND   A998~KSCHL IN (‚ZCZ‘,’ZOHZ‘)
*    AND   DATBI      >= SY-DATUM
*    AND   SPART      =  10.
*    APPEND I_COND.
*  ENDSELECT.
**  Zuschlag Material übersteuert die Sparte
*  SELECT SINGLE * FROM A996 INNER JOIN KONP ON KONP~KNUMH = A996~KNUMH
*    INTO CORRESPONDING FIELDS OF I_COND WHERE
*         A996~KAPPL =   ‚V‘
*    AND  A996~KSCHL IN  (‚ZCZ‘,’ZOHZ‘)
*    AND  DATBI      >=  SY-DATUM
*    AND  MATNR      =   I_WERT.
*  APPEND I_COND.

*  CLEAR I_COND_KBETR.
* Wenn Zuschlag auf Materialebene vorhanden, dann lösche hier den Zuschlag
* auf Spartenebene
*  SORT I_COND BY MATNR DESCENDING.
*  DELETE ADJACENT DUPLICATES FROM I_COND COMPARING KSCHL.

*  LOOP AT I_COND.
*    I_COND_KBETR = I_COND_KBETR + I_COND-KBETR.
“ in der Tabelle KONP ist der Prozentsatz um eine Dezimalstelle nach
“ rechts verrutscht. Z.B. KBETR = 44,80 => 4,480 %
*    I_COND_KBETR = I_COND_KBETR / 10.
“ so, nun den absoluten Betrag errechnen
*   I_NETPR = 1 + 1 * ( I_COND_KBETR / 100 ).
*    I_COND-I_NETPR = 1. “ der Zuschlag wird direkt der Menge zugegeben
*    MODIFY I_COND.
*  ENDLOOP.

“ BAPI-Strukturen initialisieren
CLEAR POHEADER.
CLEAR POHEADERX.
CLEAR POITEM[].
CLEAR POITEMX[].
CLEAR POACCOUNT[].
CLEAR POACCOUNTX[].
CLEAR POSCHEDULE[].
CLEAR POSCHEDULEX[].
CLEAR POADDRDELIVERY[].
“ Kopfdaten übernehmen
POHEADER-COMP_CODE = ‚1000‘.
POHEADER-DOC_TYPE = ‚NEBP‘.
*  POHEADER-VENDOR = I_EKKO-LIFNR.
* Wenn die ext. Bestellnummer mit 45… beginnt, dann ist die aufrufende
* Quelle die Bestellschreibung, sonst Aufwandbuchung
* In dieser Abhängigkeit wird entweder das Materialcenter als Lieferant eingetragen
* oder der Lieferant wird aus der Ableitung gezogen.
CLEAR I_BEST.
FIND FIRST OCCURRENCE OF ‚4‘ IN NB_EBELN MATCH OFFSET OFFS.
IF SY-SUBRC = 0 AND OFFS EQ 0.
I_BEST = ‚X‘.
ENDIF.
FIND FIRST OCCURRENCE OF ’63‘ IN NB_EBELN MATCH OFFSET OFFS.
IF SY-SUBRC = 0 AND OFFS EQ 0.
I_BEST = ‚X‘.
ENDIF.

IF I_BEST = ‚X‘. „es ist also eine Bestellung
*    SELECT * FROM ZNEBP_LIEFERANT INTO I_LIFNR_TAB. „Lieferant ableiten
*      APPEND I_LIFNR_TAB.
*    ENDSELECT.
LOOP AT I_LIFNR_TAB.
IF I_EKKO-EKGRP BETWEEN I_LIFNR_TAB-EKGRP_LOW AND I_LIFNR_TAB-EKGRP_HIGH.
POHEADER-VENDOR = I_LIFNR_TAB-LIFNR.
POHEADER-PUR_GROUP = I_LIFNR_TAB-EKGRP_INT.
ENDIF.
ENDLOOP.
*    POHEADER-VENDOR = ‚0080453100‘.

ELSE.
POHEADER-VENDOR = I_EKKO-LIFNR.
POHEADER-PUR_GROUP = I_EKKO-EKGRP.
ENDIF.
POHEADER-PURCH_ORG = ‚200‘.
*  POHEADER-PUR_GROUP = ‚910‘.
POHEADER-ITEM_INTVL = ‚0000‘.
POHEADER-PMNTTRMS = ‚ZN00‘.

POHEADERX-COMP_CODE = ‚X‘.
POHEADERX-DOC_TYPE = ‚X‘.
POHEADERX-ITEM_INTVL = ‚X‘.
POHEADERX-VENDOR = ‚X‘.
POHEADERX-PMNTTRMS = ‚X‘.
POHEADERX-PURCH_ORG = ‚X‘.
POHEADERX-PUR_GROUP = ‚X‘.
POHEADERX-PMNTTRMS = ‚X‘.

“ Positionsdaten
LOOP AT TEKPO.
*   SD-Auftrag zur Position bereits fakturiert?
PERFORM CHECK_PURPO
TABLES I_FAKT
USING
NEBP_EBELN
TEKPO-EBELP.
*   Bestellposition kostenlos?
IF TEKPO-UMSON = ‚X‘.
UPDATE ZNEBP_BELEGE SET NEBP_EBELN = ‚NV‘
WHERE NB_EBELN = NB_EBELN
AND NB_POS = TEKPO-EBELP.
COMMIT WORK AND WAIT.
CONTINUE.
ENDIF.
*    Kontierungsartfilter
CLEAR TBEST_RETURN[].
CLEAR MSG.
CLEAR P_KOART[].
SELECT ZNEBP_FILTER~ZSIGN ZNEBP_FILTER~ZOPTION ZNEBP_FILTER~LOW ZNEBP_FILTER~HIGH
FROM ZNEBP_FILTER
INTO (P_KOART-SIGN, P_KOART-OPTION, P_KOART-LOW, P_KOART-HIGH) WHERE
FART = ‚KOART‘.
APPEND P_KOART.
ENDSELECT.

IF NOT TEKPO-KNTTP IN P_KOART.
*     Wenn der SD-Beleg zu dieser Position bereits fakturiert wurde,
*     dann darf er nie den Status NV erhalten.
READ TABLE I_FAKT WITH KEY POS = TEKPO-EBELP LOCK = ‚X‘.
IF SY-SUBRC 0.
UPDATE ZNEBP_BELEGE SET NEBP_EBELN = ‚NV‘
WHERE NB_EBELN = NB_EBELN
AND NB_POS = TEKPO-EBELP.
COMMIT WORK AND WAIT.
CONTINUE.
ENDIF.
ENDIF.

*    Positionstypfilter
*    Customizing lesen
CLEAR I_PSTYP.
SELECT SINGLE * FROM T163Y
INTO CORRESPONDING FIELDS OF I_PSTYP WHERE
PSTYP = TEKPO-PSTYP.
IF SY-SUBRC 0.
I_PSTYP-EPSTP = ‚ ‚.
ENDIF.

CLEAR TBEST_RETURN[].
CLEAR MSG.
CLEAR P_PSTYP[].
SELECT ZNEBP_FILTER~ZSIGN ZNEBP_FILTER~ZOPTION ZNEBP_FILTER~LOW ZNEBP_FILTER~HIGH
FROM ZNEBP_FILTER
INTO (P_PSTYP-SIGN, P_PSTYP-OPTION, P_PSTYP-LOW, P_PSTYP-HIGH) WHERE
FART = ‚PSTYP‘.
APPEND P_PSTYP.
ENDSELECT.

IF NOT I_PSTYP-EPSTP IN P_PSTYP.
READ TABLE I_FAKT WITH KEY POS = TEKPO-EBELP LOCK = ‚X‘.
IF SY-SUBRC 0.
UPDATE ZNEBP_BELEGE SET NEBP_EBELN = ‚NV‘
WHERE NB_EBELN = NB_EBELN
AND NB_POS = TEKPO-EBELP.
COMMIT WORK AND WAIT.
CONTINUE.
ENDIF.
ENDIF.
*   Zuschlag für Sparte oder Material? —————————————
*   Centerzuschlag
PERFORM ZUSCHLAG.
*    CLEAR I_COND.
*    READ TABLE I_COND WITH KEY MATNR = I_MATERIAL KSCHL = ‚ZCZ‘ INTO I_COND.
*    IF SY-SUBRC 0.  „kein Materialzuschlag, dann Spartenzuschlag
*      READ TABLE I_COND WITH KEY SPART = SPARTE KSCHL = ‚ZCZ‘ INTO I_COND.
*    ENDIF.
*    I_COND_KBETR    =   I_COND_KBETR + I_COND-KBETR.
**   Overheadzuschlag
*    CLEAR I_COND.
*    READ TABLE I_COND WITH KEY MATNR = I_MATERIAL KSCHL = ‚ZOHZ‘ INTO I_COND.
*    IF SY-SUBRC 0.  „kein Materialzuschlag, dann Spartenzuschlag
*      READ TABLE I_COND WITH KEY SPART = SPARTE KSCHL = ‚ZOHZ‘ INTO I_COND.
*    ENDIF.
*    I_COND_KBETR    =   I_COND_KBETR + I_COND-KBETR.
*    I_COND_KBETR = I_COND_KBETR / 10.
*    I_NETPR = 1.
*   ————————————————————————–
POITEM-PO_ITEM = TEKPO-EBELP.
*   Text und Menge aus externer Bestellung übernehmen
CLEAR C_MENGE.
WRITE TEKPO-MENGE TO C_MENGE.
CONCATENATE C_MENGE TEKPO-TXZ01 INTO POITEM-SHORT_TEXT SEPARATED BY SPACE.
*    POITEM-SHORT_TEXT = TEKPO-TXZ01.
POITEM-MATERIAL = I_MATERIAL.
POITEM-EMATERIAL = I_MATERIAL.
POITEM-DELETE_IND = TEKPO-LOEKZ.
POITEM-PLANT = ‚200‘.
*    POITEM-MATL_GROUP = ‚91000‘.
READ TABLE TKOMV INTO I_TKOMV WITH KEY
KSCHL = ‚NAVS‘
KPOSN = TEKPO-EBELP.
“ Nettowert + MwSt
POITEM-QUANTITY = ( I_TKOMV-KAWRT +  I_TKOMV-KBETR ) * ( 1 + ( I_COND_KBETR / 100 ) ).

POITEM-PO_UNIT = I_MEINS.
POITEM-PO_UNIT_ISO = I_MEINS.
POITEM-ACCTASSCAT = TEKPO-KNTTP.
POITEM-TAX_CODE = ‚N0‘.

POITEM-NET_PRICE = I_NETPR.
*    POITEM-ITEM_CAT = TEKPO-PSTYP.
POITEM-ITEM_CAT = ‚ ‚.
POITEM-TRACKINGNO = NB_EBELN.
POITEM-DELETE_IND = TEKPO-LOEKZ.
*    POITEM-PERIOD_IND_EXPIRATION_DATE = ‚T‘.
APPEND POITEM.

POITEMX-PO_ITEM = TEKPO-EBELP.
POITEMX-PO_ITEMX = ‚X‘.
POITEMX-SHORT_TEXT = ‚X‘.
POITEMX-MATERIAL = ‚X‘.
POITEMX-DELETE_IND = ‚X‘.
POITEMX-PLANT = ‚X‘.
POITEMX-MATL_GROUP = ‚X‘.
POITEMX-QUANTITY = ‚X‘.
POITEMX-PO_UNIT = ‚X‘.
POITEMX-PO_UNIT_ISO = ‚X‘.
POITEMX-ACCTASSCAT = ‚X‘.
POITEMX-TAX_CODE = ‚X‘.
POITEMX-NET_PRICE = ‚X‘.
POITEMX-ITEM_CAT = ‚X‘.
POITEMX-TRACKINGNO = ‚X‘.
POITEMX-DELETE_IND = ‚X‘.
*    POITEMX-PERIOD_IND_EXPIRATION_DATE.
APPEND POITEMX.
“ Anlieferadresse
POADDRDELIVERY-PO_ITEM = TEKPO-EBELP.
POADDRDELIVERY-ADDR_NO = TEKPO-ADRN2.
APPEND POADDRDELIVERY.
*    poaddrdeliveryX-POITEM = ‚X‘.
*    poaddrdeliveryX-addr_no = ‚X‘.
ENDLOOP.

“ Kontierungsdaten
LOOP AT TEKKN.
* SD-Auftrag zur Position fakturiert?
*    READ TABLE I_FAKT WITH KEY POS = TEKKN-EBELP LOCK = ‚X‘.
*    IF SY-SUBRC = 0.
*      CONTINUE.
*    ENDIF.
*    Filter über Sachkonto
“ führende Nullen entfernen
I_SAKTO_C = TEKKN-SAKTO.
SHIFT I_SAKTO_C LEFT DELETING LEADING ‚0‘.
CLEAR TBEST_RETURN[].
CLEAR MSG.
CLEAR P_SAKTO[].
SELECT ZNEBP_FILTER~ZSIGN ZNEBP_FILTER~ZOPTION ZNEBP_FILTER~LOW ZNEBP_FILTER~HIGH
FROM ZNEBP_FILTER
INTO (P_SAKTO-SIGN, P_SAKTO-OPTION, P_SAKTO-LOW, P_SAKTO-HIGH) WHERE
FART = ‚SAKTO‘.
APPEND P_SAKTO.
ENDSELECT.

IF NOT I_SAKTO_C IN P_SAKTO.
READ TABLE I_FAKT WITH KEY POS = TEKKN-EBELP LOCK = ‚X‘.
IF SY-SUBRC 0.
UPDATE ZNEBP_BELEGE SET NEBP_EBELN = ‚NV‘
WHERE NB_EBELN = NB_EBELN
AND NB_POS = TEKKN-EBELP.
COMMIT WORK AND WAIT.
CONTINUE.
ENDIF.
ENDIF.

*    Ende Filter Sachkonto
*    Filter nach Innenauftrag
IF NOT TEKKN-AUFNR IS INITIAL.
I_AUFNR_C = TEKKN-AUFNR.
SHIFT I_AUFNR_C LEFT DELETING LEADING ‚0‘.
CLEAR TBEST_RETURN[].
CLEAR MSG.
CLEAR P_AUFNR[].
SELECT ZNEBP_FILTER~ZSIGN ZNEBP_FILTER~ZOPTION ZNEBP_FILTER~LOW ZNEBP_FILTER~HIGH
FROM ZNEBP_FILTER
INTO (P_AUFNR-SIGN, P_AUFNR-OPTION, P_AUFNR-LOW, P_AUFNR-HIGH) WHERE
FART = ‚AUFNR‘.
APPEND P_AUFNR.
ENDSELECT.

IF NOT I_AUFNR_C IN P_AUFNR.
READ TABLE I_FAKT WITH KEY POS = TEKKN-EBELP LOCK = ‚X‘.
IF SY-SUBRC 0.
UPDATE ZNEBP_BELEGE SET NEBP_EBELN = ‚NV‘
WHERE NB_EBELN = NB_EBELN
AND NB_POS = TEKKN-EBELP.
COMMIT WORK AND WAIT.
CONTINUE.
ENDIF.
ENDIF.

ENDIF.
* Ende Filter Innenauftrag
POACCOUNT-PO_ITEM = TEKKN-EBELP.
POACCOUNT-SERIAL_NO = SY-TABIX.
READ TABLE TKOMV INTO I_TKOMV WITH KEY
KSCHL = ‚NAVS‘
KPOSN = TEKKN-EBELP.
*   bei Mehrfachkontierung muß der Wert (Bruttobetrag) prozentual
*   aufgeteilt werden.
IF  TEKKN-VPROZ IS INITIAL.
I_VPROZ = 1.
ELSE.
I_VPROZ = TEKKN-VPROZ / 100.
ENDIF.
READ TABLE POITEM INTO I_POITEM WITH KEY
PO_ITEM = POACCOUNT-PO_ITEM.
POACCOUNT-QUANTITY = I_POITEM-QUANTITY * I_VPROZ.
*    POACCOUNT-QUANTITY = ( I_TKOMV-KAWRT + I_TKOMV-KBETR ) * I_VPROZ.
POACCOUNT-COSTCENTER = TEKKN-KOSTL.
POACCOUNT-ORDERID = TEKKN-AUFNR.
POACCOUNT-CO_AREA = ‚1000‘.
“ Sachkonto manipulieren ( 8 voranstellen)
MOVE TEKKN-SAKTO TO I_SAKTO_C.
“ führende Nullen entfernen
SHIFT I_SAKTO_C LEFT DELETING LEADING ‚0‘.
CONCATENATE ‚8‘ I_SAKTO_C INTO I_SAKTO_C.
“ mit führenden Nullen auffüllen
UNPACK I_SAKTO_C TO I_SAKTO_C.
POACCOUNT-GL_ACCOUNT = I_SAKTO_C.
*    –> eingefügt für Mehrfachkontierung
POACCOUNT-SERIAL_NO = TEKKN-ZEKKN.
*    POACCOUNT-DISTR_PERC = TEKKN-VPROZ.
POACCOUNT-COSTCENTER = TEKKN-KOSTL.
*    –> Ende Mehrfachkontierung
APPEND POACCOUNT.

POACCOUNTX-PO_ITEM = TEKKN-EBELP.
POACCOUNTX-PO_ITEMX = ‚X‘.
POACCOUNTX-SERIAL_NO = SY-TABIX.
POACCOUNTX-DELETE_IND = ‚X‘.
POACCOUNTX-QUANTITY = ‚X‘.
POACCOUNTX-COSTCENTER = ‚X‘.
POACCOUNTX-ORDERID = ‚X‘.
POACCOUNTX-CO_AREA = ‚X‘.
POACCOUNTX-GL_ACCOUNT = ‚X‘.
*    –> eingefügt für Mehrfachkontierung
POACCOUNTX-SERIAL_NO = TEKKN-ZEKKN.
*    POACCOUNTX-DISTR_PERC = ‚X‘ .
*    –> Ende Mehrfachkontierung
APPEND POACCOUNTX.
ENDLOOP.
*  Die Bestellmenge wird auf die Summe der Menge der Kontierungselemente gesetzt oder,
*  wenn kein Kontierungselement mehr übrigbleibt soll die Bestellposition auch
*  nicht angelegt werden.
LOOP AT POITEM.
READ TABLE POACCOUNT WITH KEY
PO_ITEM = POITEM-PO_ITEM.
IF SY-SUBRC 0.
*   1. Kein Kontierungselement vorhanden
DELETE POITEM.
READ TABLE POITEMX WITH KEY PO_ITEM = POITEM-PO_ITEM .
IF SY-SUBRC = 0.
DELETE POITEMX INDEX SY-TABIX.
ENDIF.
READ TABLE POADDRDELIVERY WITH KEY PO_ITEM = POITEM-PO_ITEM.
IF SY-SUBRC = 0.
DELETE POADDRDELIVERY INDEX SY-TABIX.
ENDIF.

ELSE.
*   2. Menge anpassen
CLEAR I_MENGE.
LOOP AT POACCOUNT.
IF POACCOUNT-PO_ITEM = POITEM-PO_ITEM.
I_MENGE = I_MENGE + POACCOUNT-QUANTITY.
ENDIF.
ENDLOOP.
POITEM-QUANTITY = I_MENGE.
MODIFY POITEM.
ENDIF.
ENDLOOP.

“ Einteilung
SORT TEKET BY EBELP ASCENDING.
LOOP AT TEKET.
* SD-Auftrag zur Position fakturiert?
*    READ TABLE I_FAKT WITH KEY POS = TEKET-EBELP LOCK = ‚X‘.
*    IF SY-SUBRC = 0.
*      CONTINUE.
*    ENDIF.
WRITE TEKET-EINDT TO POSCHEDULE-DELIVERY_DATE.
AT NEW EBELP.
POSCHEDULE-PO_ITEM = TEKET-EBELP.
*    nur eine Einteilung pro Bestellposition anlegen
POSCHEDULE-SCHED_LINE = ’01‘. „SY-TABIX.
POSCHEDULE-DEL_DATCAT_EXT = ‚T‘.
READ TABLE POITEM INTO I_POITEM WITH KEY
PO_ITEM = POSCHEDULE-PO_ITEM.
IF SY-SUBRC = 0.
*       Hier wird der Menge noch der
POSCHEDULE-QUANTITY = I_POITEM-QUANTITY .
APPEND POSCHEDULE.

POSCHEDULEX-PO_ITEM = TEKET-EBELP.
POSCHEDULEX-SCHED_LINE = ’01‘. „SY-TABIX. “ sonst werden immer nur neue Einteilungen hinzugefügt
POSCHEDULEX-PO_ITEMX = ‚X‘.
POSCHEDULEX-DEL_DATCAT_EXT = ‚X‘.
POSCHEDULEX-DELIVERY_DATE = ‚X‘.
POSCHEDULEX-QUANTITY = ‚X‘.
APPEND POSCHEDULEX.
ENDIF.
ENDAT.

ENDLOOP.
*  Die Einteilungsmengemenge wird auf die Summe der Menge der Kontierungselemente gesetzt oder,
*  wenn kein Kontierungselement mehr übrigbleibt soll die Einteilung auch
*  nicht angelegt werden.
LOOP AT POSCHEDULE.
READ TABLE POACCOUNT WITH KEY
PO_ITEM = POSCHEDULE-PO_ITEM.
IF SY-SUBRC 0.
*   1. Kein Kontierungselement vorhanden
DELETE POSCHEDULE.
ELSE.
*   2. Menge anpassen
CLEAR I_MENGE.
LOOP AT POACCOUNT.
IF POACCOUNT-PO_ITEM = POSCHEDULE-PO_ITEM.
I_MENGE = I_MENGE + POACCOUNT-QUANTITY.
ENDIF.
ENDLOOP.
POSCHEDULE-QUANTITY = I_MENGE.
MODIFY POSCHEDULE.
ENDIF.
ENDLOOP.

* Wenn es noch keine interne Bestellung gibt, dann wollen wir diese anlegen
IF NEBP_EBELN IS INITIAL OR NEBP_EBELN = ‚NV‘.
DESCRIBE TABLE POITEM
LINES ZEILEN.
*    offensichtlich gibt es keine Bestellposition,
*    dann wird auch keine interne Bestellung angelegt
IF ZEILEN  = 0.
EXPPURCHASEORDER = ‚NV‘.
EXPORT EXPPURCHASEORDER TO MEMORY ID ‚NEBP_EXPPURCHASEORDER‘.
EXIT.
ENDIF.
CALL FUNCTION ‚BAPI_PO_CREATE1‘
EXPORTING
POHEADER          = POHEADER
POHEADERX         = POHEADERX
MEMORY_UNCOMPLETE = “
MEMORY_COMPLETE   = “
NO_MESSAGING      = ‚X‘
NO_MESSAGE_REQ    = ‚X‘
IMPORTING
EXPPURCHASEORDER  = EXPPURCHASEORDER
TABLES
RETURN            = TBEST_RETURN
POITEM            = POITEM
POITEMX           = POITEMX
POADDRDELIVERY    = POADDRDELIVERY
POSCHEDULE        = POSCHEDULE
POSCHEDULEX       = POSCHEDULEX
POACCOUNT         = POACCOUNT
POACCOUNTX        = POACCOUNTX.

ELSE.
*    Nach Änderung der Kontierungsdaten in der externen Bestellung wird
*    zunächst das entsprechende Kontierungselement in der int. Bestellung gelöscht,
*    um dann die Kontierungsdaten erneut anzulegen.

* Zunächst mal schauen wie viele Kontierungselemente vorhanden sind.
CALL FUNCTION ‚BAPI_PO_GETDETAIL1‘
EXPORTING
PURCHASEORDER      = NEBP_EBELN
ACCOUNT_ASSIGNMENT = ‚X‘
IMPORTING
POHEADER           = POHEADER
TABLES
RETURN             = TBEST_RETURN
POITEM             = POITEMDEL
POACCOUNT          = POACCOUNTDEL
POSCHEDULE         = POSCHEDULEDEL.

* Soll eine Bestellposition gelöscht werden weil sich die Kontierungsart geändert hat?
LOOP AT POITEMDEL.
READ TABLE POITEM WITH KEY PO_ITEM = POITEMDEL-PO_ITEM.
IF SY-SUBRC 0.
MOVE-CORRESPONDING POITEMDEL TO POITEM.
POITEM-DELETE_IND = ‚L‘.
APPEND POITEM.
POITEMX-PO_ITEM = TEKPO-EBELP.
POITEMX-PO_ITEMX = ‚X‘.
POITEMX-MATERIAL = ‚X‘.
POITEMX-DELETE_IND = ‚X‘.
POITEMX-PLANT = ‚X‘.
POITEMX-MATL_GROUP = ‚X‘.
POITEMX-QUANTITY = ‚X‘.
POITEMX-PO_UNIT = ‚X‘.
POITEMX-PO_UNIT_ISO = ‚X‘.
POITEMX-ACCTASSCAT = ‚X‘.
POITEMX-TAX_CODE = ‚X‘.
POITEMX-NET_PRICE = ‚X‘.
POITEMX-ITEM_CAT = ‚X‘.
POITEMX-TRACKINGNO = ‚X‘.
POITEMX-DELETE_IND = ‚X‘.
APPEND POITEMX.
ENDIF.
ENDLOOP.
* Feststellen welcher Kontierungsbeleg bei der Änderung gelöscht werden soll
* Ist in der Vorgängerbestellung ein Kontierungselement vorhanden dass nun nicht mehr übergeben wurde weil
* im Ursprungsbeleg gelöscht?
LOOP AT POACCOUNTDEL.
READ TABLE POACCOUNT WITH KEY PO_ITEM = POACCOUNTDEL-PO_ITEM SERIAL_NO = POACCOUNTDEL-SERIAL_NO.
IF SY-SUBRC 0. “ in den neuen Kontierungselementen fehlt ein Eintrag
MOVE-CORRESPONDING POACCOUNTDEL TO POACCOUNT. “ Dann mit Löschkennzeichen aufnehmen
POACCOUNT-DELETE_IND = ‚L‘.
APPEND POACCOUNT.

POACCOUNTX-PO_ITEM = POACCOUNTDEL-PO_ITEM.
POACCOUNTX-SERIAL_NO = POACCOUNTDEL-SERIAL_NO.
POACCOUNTX-DELETE_IND = ‚X‘.
POACCOUNTX-QUANTITY = ‚X‘.
POACCOUNTX-COSTCENTER = ‚X‘.
POACCOUNTX-CO_AREA = ‚X‘.
POACCOUNTX-GL_ACCOUNT = ‚X‘.
APPEND POACCOUNTX.
ENDIF.
ENDLOOP.
*    Sind jetzt zu irgendeiner Position keine Kontierungsdaten mehr vorhanden
*    dann setzte das Löschkennzeichen in der Position.
LOOP AT POITEM.
READ TABLE POACCOUNT WITH KEY PO_ITEM = POITEM-PO_ITEM DELETE_IND = ‚L‘.
IF SY-SUBRC = 0.
POITEM-DELETE_IND = ‚L‘.
MODIFY POITEM.
ENDIF.
ENDLOOP.
*    fehlen in der Einteilung etwa noch Daten zur Position?
LOOP AT POSCHEDULEDEL.
READ TABLE POSCHEDULE WITH KEY PO_ITEM = POSCHEDULEDEL-PO_ITEM.
IF SY-SUBRC 0.
MOVE-CORRESPONDING POSCHEDULEDEL TO POSCHEDULE.
APPEND POSCHEDULE.
POSCHEDULEX-PO_ITEM = POSCHEDULEDEL-PO_ITEM.
POSCHEDULEX-SCHED_LINE = ’01‘. „SY-TABIX. “ sonst werden immer nur neue Einteilungen hinzugefügt
POSCHEDULEX-PO_ITEMX = ‚X‘.
POSCHEDULEX-DEL_DATCAT_EXT = ‚X‘.
POSCHEDULEX-DELIVERY_DATE = ‚X‘.
POSCHEDULEX-QUANTITY = ‚X‘.
APPEND POSCHEDULEX.
ENDIF.
ENDLOOP.
*    05.11.2008
*    Es werden nur noch Positionen geändert bei denen das Updateflag gesetzt ist.
LOOP AT TEKPO.
IF TEKPO-UPDKZ = ‚U‘ OR  TEKPO-UPDKZ = ‚I‘.
ELSE.
DELETE POITEM WHERE PO_ITEM = TEKPO-EBELP.
DELETE POITEMX WHERE PO_ITEM = TEKPO-EBELP.
DELETE POACCOUNT WHERE PO_ITEM = TEKPO-EBELP.
DELETE POACCOUNTX WHERE PO_ITEM = TEKPO-EBELP.
DELETE POSCHEDULE WHERE PO_ITEM = TEKPO-EBELP.
DELETE POSCHEDULEX WHERE PO_ITEM = TEKPO-EBELP.
DELETE POADDRDELIVERY WHERE PO_ITEM = TEKPO-EBELP.
ENDIF.
ENDLOOP.

* Bestellung ändern
CALL FUNCTION ‚BAPI_PO_CHANGE‘
EXPORTING
PURCHASEORDER     = NEBP_EBELN
POHEADER          = POHEADER
POHEADERX         = POHEADERX
MEMORY_UNCOMPLETE = “
MEMORY_COMPLETE   = “
NO_MESSAGING      = ‚X‘
NO_MESSAGE_REQ    = ‚X‘
NO_PRICE_FROM_PO  = ‚X‘
TABLES
RETURN            = TBEST_RETURN
POITEM            = POITEM
POITEMX           = POITEMX
POADDRDELIVERY    = POADDRDELIVERY
POSCHEDULE        = POSCHEDULE
POSCHEDULEX       = POSCHEDULEX
POACCOUNT         = POACCOUNT
POACCOUNTX        = POACCOUNTX.

EXPPURCHASEORDER = NEBP_EBELN.
ENDIF.

* Fehler bei der internen Bestellung?
READ TABLE TBEST_RETURN WITH KEY TYPE = ‚E‘.
IF SY-SUBRC EQ 0.
CALL FUNCTION ‚BAPI_TRANSACTION_ROLLBACK‘
*     IMPORTING
*        RETURN =
.
“ Bestellung wurde nicht angelegt
EXPPURCHASEORDER = “.
ELSE.
CALL FUNCTION ‚BAPI_TRANSACTION_COMMIT‘
EXPORTING
WAIT          = ‚X‘
*       IMPORTING
*         RETURN        =
.
ENDIF.

*  Soll bei aktiver Budgetprüfung eine Mail versendet werden?
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE  INTO I_WERT WHERE KART = ‚BUDGET‘ AND WERT = ‚X‘.
IF SY-SUBRC = 0.
READ TABLE TBEST_RETURN WITH KEY NUMBER = 629.
IF SY-SUBRC = 0.
PERFORM NACHRICHT
TABLES
TBEST_RETURN
USING
NB_EBELN.
ENDIF.
ENDIF.
EXPORT EXPPURCHASEORDER TO MEMORY ID ‚NEBP_EXPPURCHASEORDER‘.
EXPORT POITEM TO MEMORY ID ‚NEBP_NB_POITEM‘.
EXPORT TBEST_RETURN TO MEMORY ID ‚NEBP_EX_RETURN‘.

ENDFORM.                    „INT_BEST

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

Schreibe einen Kommentar