*&---------------------------------------------------------------------*
*& Report ZMD04_XX *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
INCLUDE zmd04_XX_top.
INCLUDE zmd04_XX_sel.
START-OF-SELECTION.
IF sel03 = 'X'.
*取数据(需求日期)
PERFORM get_data_by_date.
ELSE.
*取数据(其他方式)
PERFORM get_data_by_others.
ENDIF.
*通过MRP运算得到符合条件的数据(类似TCODE:MD04的处理方式)
PERFORM get_data_from_mrp_calc.
*整理itab.1.将检验批纳入可用数量;2.按可用日期排序
PERFORM data_process_step_one.
IF NOT s_lgort IS INITIAL.
*扣减排除条件库存数据(按MRP范围计算,不考虑后台已排除与MRP相关的
*库存地的扣减,以便与MD04考虑方式一致!)
PERFORM del_speme_from_stock.
ENDIF.
*DATA_OUTPUT_TO_ALV
PERFORM ouput_to_alv.
*&--------------------------------------------------------------------*
*& Form data_output
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM data_output.
DATA:pos TYPE i VALUE 1.
CLEAR wa_fields.
wa_fields-fieldname = 'MATNR'.
wa_fields-seltext_l = '物料代码'.
wa_fields-outputlen = '14'.
wa_fields-key = 'X'.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'MAKTX'.
wa_fields-seltext_l = '物料描述'.
wa_fields-outputlen = 18.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'DELB0'.
wa_fields-seltext_l = 'MRP元素'.
wa_fields-outputlen = 8.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'DAT00'.
wa_fields-seltext_l = '可用日期'.
wa_fields-outputlen = 8.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'DAT01'.
wa_fields-seltext_l = '收货日期'.
wa_fields-outputlen = 8.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'EXTRA'.
wa_fields-seltext_l = 'MRP元素数据'.
wa_fields-outputlen = 15.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'MNG01'.
wa_fields-seltext_l = '收货/需求数量'.
wa_fields-outputlen = 11.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'MNG02'.
wa_fields-seltext_l = '可用量'.
wa_fields-outputlen = 11.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'SPEME'.
wa_fields-seltext_l = '冻结库存量'.
wa_fields-outputlen = 11.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'LGORT'.
wa_fields-seltext_l = '库存'.
wa_fields-outputlen = 4.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'AUSKT'.
wa_fields-seltext_l = '例外'.
wa_fields-outputlen = 3.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'DELNR'.
wa_fields-seltext_l = 'MRP元素号'.
wa_fields-outputlen = 10.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'DELPS'.
wa_fields-seltext_l = 'MRP元素项'.
wa_fields-outputlen = 9.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'BERID'.
wa_fields-seltext_l = 'MRP范围'.
wa_fields-outputlen = 7.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_grid_title = alv_title
i_save = 'X'
it_fieldcat = alv_fields
TABLES
t_outtab = itab "输出内表
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. "data_output
*&---------------------------------------------------------------------*
*& Form get_data_from_mrp_calc
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
*
*----------------------------------------------------------------------*
FORM get_data_from_mrp_calc .
LOOP AT it00.
ON CHANGE OF it00-matnr OR it00-berid.
CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'
EXPORTING
matnr = it00-matnr
werks = it00-werks
berid = it00-berid
IMPORTING
e_mt61d = imt61d
e_mdkp = imdkp
e_cm61m = icm61m
e_mdsta = imdsta
TABLES
mdpsx = imdps
mdezx = imdez
mdsux = imdsu.
IF sy-subrc EQ 0.
MOVE-CORRESPONDING imt61d TO itab.
IF itab-dispo IN s_dispo.
LOOP AT imdez.
MOVE-CORRESPONDING imdez TO itab.
READ TABLE imdps INDEX sy-tabix.
IF sy-subrc EQ 0 AND imdez-delkz = 'AR'.
itab-delnr = imdps-delnr.
itab-delps = imdps-delps.
ENDIF.
APPEND itab.
ENDLOOP.
ENDIF.
CLEAR imt61d.
CLEAR itab.
ENDIF.
ENDON.
ENDLOOP.
ENDFORM. " get_data_from_mrp_calc
*&---------------------------------------------------------------------*
*& Form IT00lgt
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
*
*----------------------------------------------------------------------*
FORM del_speme_from_stock .
LOOP AT itab.
num = sy-tabix.
ON CHANGE OF itab-matnr OR itab-berid.
PERFORM mrp_area USING itab-matnr
itab-werks
itab-berid.
LOOP AT ilgort WHERE berid = itab-berid AND lgort IN s_lgort.
SELECT SINGLE * FROM t001l WHERE werks = ilgort-werks
AND lgort = ilgort-lgort
AND diskz NE ''.
IF sy-subrc NE 0.
itab-mng02 = itab-mng02 - ilgort-labst - ilgort-insme.
ENDIF.
ENDLOOP.
MODIFY itab INDEX num TRANSPORTING mng02.
CLEAR:ilgort,ilgort[].
ENDON.
ENDLOOP.
ENDFORM. " del_speme_from_stock
*&---------------------------------------------------------------------*
*& Form data_process_step_one
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
*
*----------------------------------------------------------------------*
FORM data_process_step_one .
*
DATA: BEGIN OF x_line OCCURS 0,
lines LIKE sy-tabix,
mngxx LIKE itab-mng01,
END OF x_line.
*
LOOP AT itab.
num = sy-tabix.
IF itab-plumi = 'B'.
IF NOT x_line IS INITIAL AND x_line-mngxx NE 0.
APPEND x_line.
CLEAR x_line.
ENDIF.
x_line-lines = num.
ENDIF.
IF itab-delkz = 'QM'.
x_line-mngxx = x_line-mngxx + itab-mng01.
ENDIF.
*一个物料计算结束清空中间结果
AT END OF matnr.
IF NOT x_line IS INITIAL AND x_line-mngxx NE 0.
APPEND x_line.
CLEAR:x_line.
ENDIF.
ENDAT.
CLEAR:itab.
ENDLOOP.
LOOP AT x_line.
READ TABLE itab INDEX x_line-lines.
IF sy-subrc EQ 0.
itab-mng02 = itab-mng02 + x_line-mngxx.
itab-mng01 = itab-mng02.
MODIFY itab INDEX x_line-lines TRANSPORTING mng01 mng02.
ENDIF.
ENDLOOP.
*按收货日期排序
SORT itab BY matnr berid plaab planr dat01.
*重新计算MNG02
DATA x_mng02 LIKE itab-mng02.
DATA: num LIKE sy-tabix.
LOOP AT itab.
num = sy-tabix.
IF itab-plumi NE 'B'.
itab-mng02 = x_mng02 + itab-mng01.
MODIFY itab INDEX num TRANSPORTING mng02.
ENDIF.
x_mng02 = itab-mng02.
ENDLOOP.
ENDFORM. " data_process_step_one
*&---------------------------------------------------------------------*
*& Form itab_cZL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
*
*----------------------------------------------------------------------*
FORM itab_czl .
DATA: zdatum LIKE sy-datum.
DATA: nnn LIKE sy-tabix.
it_itab[] = itab[].
po_itab[] = itab[].
PERFORM calcit_itab.
PERFORM calcpo_itab.
LOOP AT it00.
READ TABLE it_itab WITH KEY matnr = it00-matnr
berid = it00-berid
delkz = 'WB'.
IF sy-subrc EQ 0.
it01-aufnr = it00-aufnr.
it01-rsnum = it00-rsnum.
it01-rspos = it00-rspos.
it01-berid = it00-berid.
it01-matnr = it00-matnr.
it01-prgrp = it00-prgrp.
it01-lbtxt = it00-lbtxt.
it01-normt = it00-normt.
IF it00-kzear IS INITIAL.
it01-m_jxq = it00-enmng - it00-bdmng.
ENDIF.
*取库存地下的冻结库存
PERFORM get_speme_from_mard USING it00-matnr
it00-werks
it00-berid
CHANGING x_speme.
it01-speme = x_speme.
it_itab-mng02 = it_itab-mng02 - x_speme.
CLEAR:x_speme.
it01-m_kyk = it_itab-mng02.
it01-maktx = it_itab-maktx.
it01-werks = it_itab-werks.
it01-dispo = it_itab-dispo.
it01-mng_a = it01-m_kyk + it01-m_jxq.
READ TABLE it_itab WITH KEY delnr = it00-rsnum delps = it00-rspos.
IF sy-subrc EQ 0.
zdatum = it_itab-dat01.
LOOP AT po_itab WHERE matnr = it00-matnr
AND berid = it00-berid
AND delkz NE 'WB'
AND dat01 <= zdatum.
it01-mng_a1 = it01-mng_a1 + po_itab-mng01.
ENDLOOP.
it01-mng_a2 = it01-mng_a + it01-mng_a1.
IF it01-mng_a2 > 0.
it01-mng_a2 = 0.
ENDIF.
ENDIF.
APPEND it01.
ENDIF.
CLEAR it01.
ENDLOOP.
LOOP AT it01.
ON CHANGE OF it01-aufnr OR it01-matnr OR it01-berid.
IF sy-tabix NE 1.
APPEND it01_01.
CLEAR it01_01.
ENDIF.
MOVE it01 TO it01_01.
ENDON.
IF it01-rspos NE it01_01-rspos.
it01_01-rspos = ''.
it01_01-m_jxq = it01_01-m_jxq + it01-m_jxq.
it01_01-mng_a = it01_01-mng_a + it01-m_jxq.
it01_01-mng_a2 = it01_01-mng_a + it01_01-mng_a1.
IF it01_01-mng_a2 > 0.
it01_01-mng_a2 = 0.
ENDIF.
ENDIF.
AT LAST.
APPEND it01_01.
CLEAR it01_01.
ENDAT.
ENDLOOP.
REFRESH: it00,itab,it01,it_itab,po_itab.
ENDFORM. " itab_cZL
*&---------------------------------------------------------------------*
*& Form data_output_iT01
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
*
*----------------------------------------------------------------------*
FORM data_output_it01 .
DATA:pos TYPE i VALUE 1.
CLEAR wa_fields.
wa_fields-fieldname = 'PRGRP'.
wa_fields-seltext_l = '型号'.
wa_fields-outputlen = 12.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'LBTXT'.
wa_fields-seltext_l = '国家'.
wa_fields-outputlen = 12.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'NORMT'.
wa_fields-seltext_l = '颜色'.
wa_fields-outputlen = 12.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'MATNR'.
wa_fields-seltext_l = '物料代码'.
wa_fields-outputlen = '15'.
* wa_fields-KEY = 'X'.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'MAKTX'.
wa_fields-seltext_l = '物料描述'.
* wa_fields-no_out = 'X'.
* wa_fields-DO_SUM = 'X'.
wa_fields-outputlen = 20.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
*
* wa_fields-fieldname = 'DELB0'.
* wa_fields-seltext_l = 'MRP元素'.
* wa_fields-outputlen = 6.
* wa_fields-COL_POS = POS.
* APPEND wa_fields TO ALV_fields.
* POS = POS + 1.
* CLEAR wa_fields.
* wa_fields-fieldname = 'DAT00'.
* wa_fields-seltext_l = '可用日期'.
* wa_fields-outputlen = 8.
* wa_fields-COL_POS = POS.
* APPEND wa_fields TO ALV_fields.
* POS = POS + 1.
* CLEAR wa_fields.
* wa_fields-fieldname = 'DAT01'.
* wa_fields-seltext_l = '收货日期'.
* wa_fields-outputlen = 8.
* wa_fields-COL_POS = POS.
* APPEND wa_fields TO ALV_fields.
* POS = POS + 1.
* CLEAR wa_fields.
*
* wa_fields-fieldname = 'EXTRA'.
* wa_fields-seltext_l = 'MRP元素数据'.
* wa_fields-outputlen = 40.
* wa_fields-COL_POS = POS.
* APPEND wa_fields TO ALV_fields.
* POS = POS + 1.
* CLEAR wa_fields.
wa_fields-fieldname = 'M_JXQ'.
wa_fields-seltext_l = '净需求数量'.
wa_fields-outputlen = 13.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'M_KYK'.
wa_fields-seltext_l = '可用库存量'.
wa_fields-outputlen = 13.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'SPEME'.
wa_fields-seltext_l = '冻结库存量'.
wa_fields-outputlen = 13.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'MNG_A'.
wa_fields-seltext_l = '确认需求量'.
wa_fields-outputlen = 13.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'MNG_A1'.
wa_fields-seltext_l = '确认的PO量'.
wa_fields-outputlen = 13.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'MNG_A2'.
wa_fields-seltext_l = '短缺数量'.
wa_fields-outputlen = 13.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
*
* wa_fields-fieldname = 'LGORT'.
* wa_fields-seltext_l = '库存'.
* wa_fields-outputlen = 4.
* wa_fields-COL_POS = POS.
* APPEND wa_fields TO ALV_fields.
* POS = POS + 1.
* CLEAR wa_fields.
*
* wa_fields-fieldname = 'AUSKT'.
* wa_fields-seltext_l = '库存'.
* wa_fields-outputlen = 2.
* wa_fields-COL_POS = POS.
* APPEND wa_fields TO ALV_fields.
* POS = POS + 1.
* CLEAR wa_fields.
wa_fields-fieldname = 'AUFNR'.
wa_fields-seltext_l = '生产订单'.
wa_fields-outputlen = 12.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'RSNUM'.
wa_fields-seltext_l = '预留号'.
wa_fields-outputlen = 10.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'RSPOS'.
wa_fields-seltext_l = '项目'.
wa_fields-outputlen = 4.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'BERID'.
wa_fields-seltext_l = 'MRP范围'.
wa_fields-outputlen = 10.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
wa_fields-fieldname = 'DISPO'.
wa_fields-seltext_l = 'MRP控制者'.
wa_fields-outputlen = 10.
wa_fields-col_pos = pos.
APPEND wa_fields TO alv_fields.
pos = pos + 1.
CLEAR wa_fields.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
* CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_grid_title = alv_title
i_save = 'X'
it_fieldcat = alv_fields
i_callback_user_command = 'MYCOMMANDC'
TABLES
t_outtab = it01_01 "输出内表
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " data_output_iT01
*&---------------------------------------------------------------------*
*& Form itab_bzl
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
*
*----------------------------------------------------------------------*
FORM itab_bzl .
DATA: zdatum LIKE sy-datum.
DATA: nnn LIKE sy-tabix.
*AR 相关预订
*BE 订单项目计划行
*FE 生产订单
*LA 发运通知
*MR 预定
*SB 相关需求
*U2 库存转移请求的批准订单
*UR 转储预定的库存
*WB 工厂库存
it_itab[] = itab[].
po_itab[] = itab[].
PERFORM calcit_itab.
PERFORM calcpo_itab.
LOOP AT it00.
READ TABLE it_itab WITH KEY matnr = it00-matnr
berid = it00-berid
delkz = 'WB'.
IF sy-subrc EQ 0.
iout-aufnr = it00-aufnr.
iout-rsnum = it00-rsnum.
iout-rspos = it00-rspos.
iout-berid = it00-berid.
iout-matnr = it00-matnr.
iout-prgrp = it00-prgrp.
iout-lbtxt = it00-lbtxt.
iout-normt = it00-normt.
*取库存地下的冻结库存
PERFORM get_speme_from_mard USING it00-matnr
it00-werks
it00-berid
CHANGING x_speme.
iout-speme = x_speme.
it_itab-mng02 = it_itab-mng02 - x_speme.
CLEAR:x_speme.
iout-m_kyk = it_itab-mng02.
iout-maktx = it_itab-maktx.
iout-werks = it_itab-werks.
iout-dispo = it_itab-dispo.<