METHOD IF_EX_BOM_UPDATE~CHANGE_AT_SAVE.
*DELTA_STZUB Importing CS01_STZUB_TAB
*DELTA_CLRKB Importing CS01_CLRKB_TAB
*DELTA_CLSTB Importing CS01_CLSTB_TAB
*DELTA_DOSTB Importing CS01_DOSTB_TAB
*DELTA_EQSTB Importing CS01_EQSTB_TAB
*DELTA_KDSTB Importing CS01_KDSTB_TAB
*DELTA_MASTB Importing CS01_MASTB_TAB
*DELTA_PRSTB Importing CS01_PRSTB_TAB
*DELTA_STASB Importing CS01_STASB_TAB
*DELTA_STKOB Importing CS01_STKOB_TAB
*DELTA_STPOB Importing CS01_STPOB_TAB
*DELTA_STPUB Importing CS01_STPUB_TAB
*DELTA_STSTB Importing CS01_STSTB_TAB
*DELTA_TPSTB Importing CS01_TPSTB_TAB
*I_AENNR Importing AENNR
*I_DATUV Importing DATUV
*I_STLAL Importing STLAL
IF SY-TCODE = 'CS02' OR SY-TCODE = 'CS01' .
DATA: WA_STPOB TYPE STPOB.
DATA: WA_STPOB1 TYPE STPOB.
DATA: WA_STASB TYPE STASB.
DATA: BEGIN OF WA_EWAHR,
ALPGR TYPE CS_ALPGR,
POSNR TYPE POSNR,
EWAHR TYPE EWAHR,
VBKZ TYPE VBKZ,
ALPRF TYPE CS_ALPRF,
END OF WA_EWAHR.
DATA: IT_STPOB LIKE TABLE OF WA_STPOB.
DATA: IT_EWAHR LIKE TABLE OF WA_EWAHR.
DATA: IT_EWAHR_UP LIKE TABLE OF WA_EWAHR.
DATA: BEGIN OF WA_ALPGR,
ALPGR TYPE CS_ALPGR,
EWAHR TYPE EWAHR,
END OF WA_ALPGR.
DATA: IT_ALPGR LIKE TABLE OF WA_ALPGR.
DATA:LV_FLAG TYPE C,
LV_FLAG1 TYPE C,
LV_FLAG2 TYPE C,
LV_ALPGR TYPE CS_ALPGR,
LV_EWAHR TYPE EWAHR,
LV_MTART TYPE MTART,
LV_POSNR TYPE C LENGTH 6,
LV_DATUB TYPE SY-DATUM.
DATA:WA_MASTB TYPE MASTB.
" zlgp Alternative item: group not is empty
LOOP AT DELTA_MASTB INTO WA_MASTB.
SELECT MTART INTO LV_MTART FROM MARA
WHERE MATNR = WA_MASTB-MATNR.
ENDSELECT.
ENDLOOP.
CHECK LV_MTART = 'ZLGP'.
" Usage probability percent = 100
CLEAR:IT_EWAHR_UP,IT_EWAHR_UP[],IT_EWAHR,IT_EWAHR[],LV_FLAG,LV_FLAG1,LV_FLAG2.
IT_STPOB[] = DELTA_STPOB[].
LOOP AT DELTA_STPOB INTO WA_STPOB .
IF WA_STPOB-VBKZ NE 'D'.
*check valid to date
IF WA_STPOB-VBKZ = 'U'.
READ TABLE IT_STPOB INTO WA_STPOB1 WITH KEY IDNRK = WA_STPOB-IDNRK POSNR = WA_STPOB-POSNR.
IF SY-SUBRC EQ 0.
LOOP AT DELTA_STASB INTO WA_STASB
WHERE STLTY = WA_STPOB-STLTY
AND STLNR = WA_STPOB-STLNR
AND STLKN = WA_STPOB1-STLKN
AND DATUB NE '00000000'.
IF LV_DATUB = '00000000'.
LV_DATUB = WA_STASB-DATUB.
ELSE.
IF LV_DATUB < WA_STASB-DATUB.
LV_DATUB = WA_STASB-DATUB.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ELSEIF WA_STPOB-VBKZ = 'I'.
LV_DATUB = I_DATUV.
ELSE.
READ TABLE IT_STPOB INTO WA_STPOB1 WITH KEY IDNRK = WA_STPOB-IDNRK POSNR = WA_STPOB-POSNR VBKZ = 'U'.
IF SY-SUBRC EQ 0.
CONTINUE.
ENDIF .
LOOP AT DELTA_STASB INTO WA_STASB
WHERE STLTY = WA_STPOB-STLTY
AND STLNR = WA_STPOB-STLNR
AND STLKN = WA_STPOB-STLKN
AND DATUB NE '00000000'.
IF LV_DATUB = '00000000'.
LV_DATUB = WA_STASB-DATUB.
ELSE.
IF LV_DATUB < WA_STASB-DATUB.
LV_DATUB = WA_STASB-DATUB.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
*end
IF LV_DATUB >= I_DATUV.
IF ( WA_STPOB-ALPRF = '01' AND WA_STPOB-EWAHR = 100 )
OR ( WA_STPOB-ALPRF NE '01' AND WA_STPOB-EWAHR NE 100 ) .
MOVE-CORRESPONDING WA_STPOB TO WA_EWAHR.
APPEND WA_EWAHR TO IT_EWAHR.
* if wa_stpob-vbkz eq 'U'.
* append wa_ewahr to it_ewahr_up.
* endif.
ELSE.
IF WA_STPOB-ALPRF = '01' .
IF WA_STPOB-EWAHR NE 100 .
LV_FLAG1 = 'X'.
ENDIF.
ELSE.
IF WA_STPOB-EWAHR EQ 100 .
LV_FLAG2 = 'X'.
ENDIF.
ENDIF.
LV_POSNR = WA_STPOB-POSNR.
EXIT.
ENDIF.
ENDIF.
ENDIF.
CLEAR: WA_STPOB,WA_EWAHR,LV_DATUB,WA_STPOB1.
ENDLOOP.
IF LV_FLAG1 = 'X'.
MESSAGE E008(ZMM) WITH LV_POSNR.
ENDIF.
IF LV_FLAG2 = 'X'.
MESSAGE E009(ZMM) WITH LV_POSNR .
ENDIF.
** Check percentage first , Lisa wong 02/19/2013
CLEAR: LV_FLAG.
SORT IT_EWAHR BY ALPGR.
LOOP AT IT_EWAHR INTO WA_EWAHR .
LV_EWAHR = LV_EWAHR + WA_EWAHR-EWAHR.
AT END OF ALPGR.
IF LV_EWAHR > 100.
LV_FLAG = 'X'.
LV_ALPGR = WA_EWAHR-ALPGR.
EXIT.
ENDIF.
CLEAR:LV_EWAHR.
ENDAT.
ENDLOOP.
IF LV_FLAG = 'X'.
MESSAGE E005(ZMM) WITH LV_ALPGR .
ENDIF.
ENDIF.
* loop at it_ewahr_up into wa_ewahr .
* delete it_ewahr where posnr = wa_ewahr-posnr and vbkz = space.
* clear:wa_ewahr.
* endloop.
*Add by Lisa wong 02/19/2013 start
* SORT IT_EWAHR BY POSNR VBKZ DESCENDING.
* DELETE ADJACENT DUPLICATES FROM IT_EWAHR COMPARING POSNR VBKZ. "Restore on 02/20/2013
DELETE IT_EWAHR WHERE ALPGR = SPACE AND VBKZ = SPACE. "Add by Lisa wong 02/25/2013
*Add by Lisa wong 02/19/2013 End
LOOP AT IT_EWAHR INTO WA_EWAHR .
" if wa_ewahr-alpgr is not initial.
IF WA_EWAHR-ALPGR NE '01'.
LV_POSNR = WA_EWAHR-POSNR.
LV_FLAG = 'X'.
EXIT.
ENDIF.
"endif.
ENDLOOP.
IF LV_FLAG = 'X'.
MESSAGE E006(ZMM) WITH LV_POSNR .
ENDIF.
* clear: lv_flag.
* read table it_ewahr into wa_ewahr with key ALPRF = '01' .
* if sy-subrc ne 0.
* lv_flag = 'X'.
* endif.
* if lv_flag = 'X'.
* message e010(zmm) .
* endif.
ENDMETHOD.
*DELTA_STZUB Importing CS01_STZUB_TAB
*DELTA_CLRKB Importing CS01_CLRKB_TAB
*DELTA_CLSTB Importing CS01_CLSTB_TAB
*DELTA_DOSTB Importing CS01_DOSTB_TAB
*DELTA_EQSTB Importing CS01_EQSTB_TAB
*DELTA_KDSTB Importing CS01_KDSTB_TAB
*DELTA_MASTB Importing CS01_MASTB_TAB
*DELTA_PRSTB Importing CS01_PRSTB_TAB
*DELTA_STASB Importing CS01_STASB_TAB
*DELTA_STKOB Importing CS01_STKOB_TAB
*DELTA_STPOB Importing CS01_STPOB_TAB
*DELTA_STPUB Importing CS01_STPUB_TAB
*DELTA_STSTB Importing CS01_STSTB_TAB
*DELTA_TPSTB Importing CS01_TPSTB_TAB
*I_AENNR Importing AENNR
*I_DATUV Importing DATUV
*I_STLAL Importing STLAL
IF SY-TCODE = 'CS02' OR SY-TCODE = 'CS01' .
DATA: WA_STPOB TYPE STPOB.
DATA: WA_STPOB1 TYPE STPOB.
DATA: WA_STASB TYPE STASB.
DATA: BEGIN OF WA_EWAHR,
ALPGR TYPE CS_ALPGR,
POSNR TYPE POSNR,
EWAHR TYPE EWAHR,
VBKZ TYPE VBKZ,
ALPRF TYPE CS_ALPRF,
END OF WA_EWAHR.
DATA: IT_STPOB LIKE TABLE OF WA_STPOB.
DATA: IT_EWAHR LIKE TABLE OF WA_EWAHR.
DATA: IT_EWAHR_UP LIKE TABLE OF WA_EWAHR.
DATA: BEGIN OF WA_ALPGR,
ALPGR TYPE CS_ALPGR,
EWAHR TYPE EWAHR,
END OF WA_ALPGR.
DATA: IT_ALPGR LIKE TABLE OF WA_ALPGR.
DATA:LV_FLAG TYPE C,
LV_FLAG1 TYPE C,
LV_FLAG2 TYPE C,
LV_ALPGR TYPE CS_ALPGR,
LV_EWAHR TYPE EWAHR,
LV_MTART TYPE MTART,
LV_POSNR TYPE C LENGTH 6,
LV_DATUB TYPE SY-DATUM.
DATA:WA_MASTB TYPE MASTB.
" zlgp Alternative item: group not is empty
LOOP AT DELTA_MASTB INTO WA_MASTB.
SELECT MTART INTO LV_MTART FROM MARA
WHERE MATNR = WA_MASTB-MATNR.
ENDSELECT.
ENDLOOP.
CHECK LV_MTART = 'ZLGP'.
" Usage probability percent = 100
CLEAR:IT_EWAHR_UP,IT_EWAHR_UP[],IT_EWAHR,IT_EWAHR[],LV_FLAG,LV_FLAG1,LV_FLAG2.
IT_STPOB[] = DELTA_STPOB[].
LOOP AT DELTA_STPOB INTO WA_STPOB .
IF WA_STPOB-VBKZ NE 'D'.
*check valid to date
IF WA_STPOB-VBKZ = 'U'.
READ TABLE IT_STPOB INTO WA_STPOB1 WITH KEY IDNRK = WA_STPOB-IDNRK POSNR = WA_STPOB-POSNR.
IF SY-SUBRC EQ 0.
LOOP AT DELTA_STASB INTO WA_STASB
WHERE STLTY = WA_STPOB-STLTY
AND STLNR = WA_STPOB-STLNR
AND STLKN = WA_STPOB1-STLKN
AND DATUB NE '00000000'.
IF LV_DATUB = '00000000'.
LV_DATUB = WA_STASB-DATUB.
ELSE.
IF LV_DATUB < WA_STASB-DATUB.
LV_DATUB = WA_STASB-DATUB.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ELSEIF WA_STPOB-VBKZ = 'I'.
LV_DATUB = I_DATUV.
ELSE.
READ TABLE IT_STPOB INTO WA_STPOB1 WITH KEY IDNRK = WA_STPOB-IDNRK POSNR = WA_STPOB-POSNR VBKZ = 'U'.
IF SY-SUBRC EQ 0.
CONTINUE.
ENDIF .
LOOP AT DELTA_STASB INTO WA_STASB
WHERE STLTY = WA_STPOB-STLTY
AND STLNR = WA_STPOB-STLNR
AND STLKN = WA_STPOB-STLKN
AND DATUB NE '00000000'.
IF LV_DATUB = '00000000'.
LV_DATUB = WA_STASB-DATUB.
ELSE.
IF LV_DATUB < WA_STASB-DATUB.
LV_DATUB = WA_STASB-DATUB.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
*end
IF LV_DATUB >= I_DATUV.
IF ( WA_STPOB-ALPRF = '01' AND WA_STPOB-EWAHR = 100 )
OR ( WA_STPOB-ALPRF NE '01' AND WA_STPOB-EWAHR NE 100 ) .
MOVE-CORRESPONDING WA_STPOB TO WA_EWAHR.
APPEND WA_EWAHR TO IT_EWAHR.
* if wa_stpob-vbkz eq 'U'.
* append wa_ewahr to it_ewahr_up.
* endif.
ELSE.
IF WA_STPOB-ALPRF = '01' .
IF WA_STPOB-EWAHR NE 100 .
LV_FLAG1 = 'X'.
ENDIF.
ELSE.
IF WA_STPOB-EWAHR EQ 100 .
LV_FLAG2 = 'X'.
ENDIF.
ENDIF.
LV_POSNR = WA_STPOB-POSNR.
EXIT.
ENDIF.
ENDIF.
ENDIF.
CLEAR: WA_STPOB,WA_EWAHR,LV_DATUB,WA_STPOB1.
ENDLOOP.
IF LV_FLAG1 = 'X'.
MESSAGE E008(ZMM) WITH LV_POSNR.
ENDIF.
IF LV_FLAG2 = 'X'.
MESSAGE E009(ZMM) WITH LV_POSNR .
ENDIF.
** Check percentage first , Lisa wong 02/19/2013
CLEAR: LV_FLAG.
SORT IT_EWAHR BY ALPGR.
LOOP AT IT_EWAHR INTO WA_EWAHR .
LV_EWAHR = LV_EWAHR + WA_EWAHR-EWAHR.
AT END OF ALPGR.
IF LV_EWAHR > 100.
LV_FLAG = 'X'.
LV_ALPGR = WA_EWAHR-ALPGR.
EXIT.
ENDIF.
CLEAR:LV_EWAHR.
ENDAT.
ENDLOOP.
IF LV_FLAG = 'X'.
MESSAGE E005(ZMM) WITH LV_ALPGR .
ENDIF.
ENDIF.
* loop at it_ewahr_up into wa_ewahr .
* delete it_ewahr where posnr = wa_ewahr-posnr and vbkz = space.
* clear:wa_ewahr.
* endloop.
*Add by Lisa wong 02/19/2013 start
* SORT IT_EWAHR BY POSNR VBKZ DESCENDING.
* DELETE ADJACENT DUPLICATES FROM IT_EWAHR COMPARING POSNR VBKZ. "Restore on 02/20/2013
DELETE IT_EWAHR WHERE ALPGR = SPACE AND VBKZ = SPACE. "Add by Lisa wong 02/25/2013
*Add by Lisa wong 02/19/2013 End
LOOP AT IT_EWAHR INTO WA_EWAHR .
" if wa_ewahr-alpgr is not initial.
IF WA_EWAHR-ALPGR NE '01'.
LV_POSNR = WA_EWAHR-POSNR.
LV_FLAG = 'X'.
EXIT.
ENDIF.
"endif.
ENDLOOP.
IF LV_FLAG = 'X'.
MESSAGE E006(ZMM) WITH LV_POSNR .
ENDIF.
* clear: lv_flag.
* read table it_ewahr into wa_ewahr with key ALPRF = '01' .
* if sy-subrc ne 0.
* lv_flag = 'X'.
* endif.
* if lv_flag = 'X'.
* message e010(zmm) .
* endif.
ENDMETHOD.