MB_DOCUMENT_BEFORE_UPDATE

<< 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.