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