|
<< Click to Display Table of Contents >> Navigation: All About ABAP Technique > English > ABAP Tutorial > ABAP Workbench Tools > Enhancement > Business Add-Ins (BADI) > Business Add-Ins (BADI) Examples > ZUPDATE_PO_EXCHGRATE > MB_DOCUMENT_BEFORE_UPDATE |
METHOD IF_EX_MB_DOCUMENT_BADI~MB_DOCUMENT_BEFORE_UPDATE .
BREAK ABAP07.
DATA GV_EXRT TYPE P DECIMALS 5.
DATA GV_MKPF LIKE LINE OF XMKPF.
DATA GV_MSEG LIKE LINE OF XMSEG.
DATA GV_EBELN TYPE EBELN.
DATA GV_WAERS TYPE WAERS.
DATA GV_TVAL1 TYPE P DECIMALS 2.
DATA GV_TVAL2 TYPE P DECIMALS 2.
READ TABLE XMKPF INDEX 1 INTO GV_MKPF.
READ TABLE XMSEG INDEX 1 INTO GV_MSEG.
* Jika ada No PO baru melakukan Checking dibawah ini
IF GV_MSEG-EBELN IS NOT INITIAL.
*--------------------------------------------------------------------*
* check currency, continue if currency <> 'IDR', and it is relevant to Purchase doc
* get currency of po doc
SELECT SINGLE WAERS FROM EKKO INTO GV_WAERS
WHERE EBELN = GV_MSEG-EBELN.
CHECK GV_WAERS <> 'IDR' AND GV_MSEG-VPRSV = 'V'.
BREAK ABAP08.
* create document
IF GV_MSEG-BWART = '101'.
** check if this is 1st delivery
* SELECT SINGLE ebeln INTO gv_ebeln FROM ekbe
* WHERE ebeln = gv_mseg-ebeln.
*
** continue if this is 1st delivery
* CHECK sy-subrc <> 0.
DATA: LV_KUFIX.
SELECT SINGLE KUFIX INTO LV_KUFIX
FROM EKKO
WHERE
EBELN = GV_MSEG-EBELN.
IF LV_KUFIX NE 'X'.
*--------------------------------------------------------------------*
* get exchange rate per posting date
CALL FUNCTION 'READ_EXCHANGE_RATE'
EXPORTING
DATE = GV_MKPF-BUDAT
FOREIGN_CURRENCY = GV_WAERS
LOCAL_CURRENCY = 'IDR'
IMPORTING
EXCHANGE_RATE = GV_EXRT
EXCEPTIONS
NO_RATE_FOUND = 1
NO_FACTORS_FOUND = 2
NO_SPREAD_FOUND = 3
DERIVED_2_TIMES = 4
OVERFLOW = 5
ZERO_RATE = 6
OTHERS = 7.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* update po
DATA GV_POHDR TYPE BAPIMEPOHEADER.
DATA GV_POHDRX TYPE BAPIMEPOHEADERX.
DATA GT_RETURN TYPE BAPIRETTAB .
DATA GV_RETURN LIKE LINE OF GT_RETURN.
GV_POHDR-EX_RATE_FX = 'X'.
GV_POHDRX-EX_RATE_FX = 'X'.
GV_POHDR-EXCH_RATE = GV_EXRT.
GV_POHDRX-EXCH_RATE = 'X'.
GV_POHDR-PO_NUMBER = GV_MSEG-EBELN.
GV_POHDRX-PO_NUMBER = GV_MSEG-EBELN.
CALL FUNCTION 'BAPI_PO_CHANGE'
EXPORTING
PURCHASEORDER = GV_POHDR-PO_NUMBER
POHEADER = GV_POHDR
POHEADERX = GV_POHDRX
TABLES
RETURN = GT_RETURN.
READ TABLE GT_RETURN WITH KEY ID = '06' NUMBER = '023' INTO GV_RETURN.
IF SY-SUBRC = 0.
COMMIT WORK.
ELSE.
ENDIF.
ENDIF.
ELSE. "cancel document
* check value in PO = value in cancel doc
* 1st check value in cancel doc
DATA GT_MSEG TYPE TY_T_MSEG.
DATA WA_MSEG LIKE LINE OF XMSEG.
LOOP AT XMKPF INTO GV_MKPF.
REFRESH GT_MSEG.
LOOP AT XMSEG INTO GV_MSEG WHERE MBLNR = GV_MKPF-MBLNR.
CLEAR WA_MSEG.
WA_MSEG-EBELN = GV_MSEG-EBELN.
WA_MSEG-MENGE = GV_MSEG-MENGE.
COLLECT WA_MSEG INTO GT_MSEG.
ENDLOOP.
ENDLOOP.
*check value in PO = value in cancel doc
* qty belum cancel
READ TABLE GT_MSEG INDEX 1 INTO GV_MSEG.
SELECT SUM( MENGE ) INTO GV_TVAL1
FROM MSEG
WHERE EBELN = GV_MSEG-EBELN
AND BWART = '101'.
* qty sudah cancel
SELECT SUM( MENGE ) INTO GV_TVAL2
FROM MSEG
WHERE EBELN = GV_MSEG-EBELN
AND BWART = '102'.
* sisa yg belum dicancel
GV_TVAL1 = GV_TVAL1 - GV_TVAL2.
* jika sisa yg belum cancel = qty yg akan dicancel,
* maka update PO
IF GV_TVAL1 = GV_MSEG-MENGE AND GV_MSEG-MENGE <> 0 .
GV_POHDR-EX_RATE_FX = ''.
GV_POHDRX-EX_RATE_FX = 'X'.
GV_POHDR-PO_NUMBER = GV_MSEG-EBELN.
CALL FUNCTION 'BAPI_PO_CHANGE'
EXPORTING
PURCHASEORDER = GV_POHDR-PO_NUMBER
POHEADER = GV_POHDR
POHEADERX = GV_POHDRX
TABLES
RETURN = GT_RETURN.
READ TABLE GT_RETURN WITH KEY ID = '06' NUMBER = '023' INTO GV_RETURN.
IF SY-SUBRC = 0.
COMMIT WORK.
ELSE.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.