INCLUDE ZPPR_0037TOP.
TABLES:marc,mvke,pbim,pbed,mard,zzj_pp_001.
*声明存放ALV显示内表类型
TYPES:BEGIN OF ty_alv_itab.
INCLUDE STRUCTURE zzj_pp_001.
TYPES:lv(4),
END OF ty_alv_itab.
TYPES:BEGIN OF ty_pbim,
matnr TYPE pbim-matnr,"物料
werks TYPE pbim-werks,"工厂
plnmg TYPE pbed-plnmg,"需求数量
END OF ty_pbim.
TYPES:BEGIN OF ty_matnr,
matnr TYPE marc-matnr,
werks TYPE marc-werks,
plifz TYPE marc-plifz,"采购周期
END OF ty_matnr.
DATA:g_itab_fieldcat_lvc TYPE lvc_t_fcat,
g_itab_sort_lvc TYPE lvc_t_sort.
DATA:ok_code_9000 LIKE sy-ucomm,"定义OK_CODE
save_ok LIKE sy-ucomm.
*ALV变量
DATA:g_ischange,
g_tabnm(30) TYPE c VALUE 'ZZJ_PP_001',"维护表表名
gs_variant TYPE disvariant, "定义格式
gs_alv_itab TYPE ty_alv_itab,
gt_alv_itab TYPE TABLE OF ty_alv_itab WITH HEADER LINE,
gt_type_dec TYPE TABLE OF dd07t WITH HEADER LINE,
gt_fieldcat TYPE lvc_t_fcat,"定义字段目录的属性
gs_layout TYPE lvc_s_layo,
* i_grid_settings TYPE lvc_s_glay, "显示回调
* l_repid LIKE sy-repid, "当前程序名
gt_exclude TYPE ui_functions,
wcl_container TYPE REF TO cl_gui_docking_container,
wcl_alv TYPE REF TO cl_gui_alv_grid.
*----------------------------------------------------------------------*
* CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
* 处理ALV事件类声明
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION."类方法
METHODS:
* 工具栏自定义按钮
handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive,
* 监控按钮
handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
* 数据改变
handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm,
* 数据改变后
handle_data_changed_finished FOR EVENT data_changed_finished OF
cl_gui_alv_grid
IMPORTING e_modified et_good_cells.
ENDCLASS. "lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
* 处理ALV事件类实现
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
* handle toolbar
METHOD handle_toolbar.
PERFORM handle_toolbar USING e_object e_interactive.
ENDMETHOD. "handle_toolbar
* handler user command
METHOD handle_user_command.
PERFORM handle_user_command USING e_ucomm.
ENDMETHOD. "handle_user_command
* handler data changed
METHOD handle_data_changed.
PERFORM handle_data_changed USING er_data_changed e_onf4"在ALV OO中我们可以通过DATA_CHANGE事件得到被修改的单元格的信息,
e_onf4_before e_onf4_after e_ucomm.
ENDMETHOD. "handle_data_changed
* handler data changed finished
METHOD handle_data_changed_finished.
PERFORM handle_data_changed_finished USING e_modified et_good_cells.
ENDMETHOD. "handle_data_changed_finished
ENDCLASS. "lcl_event_handler IMPLEMENTATION
INCLUDE ZPPR_0037S01.
*&---------------------------------------------------------------------*
*& 包括 ZPPR_0037S01
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE t1.
SELECT-OPTIONS:s_werks FOR marc-werks OBLIGATORY MEMORY ID zwk,"工厂
s_matnr FOR marc-matnr."物料
PARAMETERS:p_budat LIKE marc-mmstd DEFAULT sy-datum."日期
SELECTION-SCREEN END OF BLOCK b1.
INCLUDE ZPPR_0037E01.
INITIALIZATION.
t1 = '选择参数'.
AT SELECTION-SCREEN.
START-OF-SELECTION.
IF p_budat = sy-datum.
PERFORM frm_get_data.
ELSE.
MESSAGE e000(zzj_001) WITH '输入的日期不正确'.
ENDIF.
END-OF-SELECTION.
CALL SCREEN 9000.
INCLUDE ZPPR_0037F01.
FORM FRM_GET_DATA .
CLEAR:gt_alv_itab,gt_alv_itab[].
DATA:lt_mard TYPE TABLE OF mard WITH HEADER LINE,
lt_pbim TYPE TABLE OF ty_pbim WITH HEADER LINE,
lt_vbap TYPE TABLE OF vbap WITH HEADER LINE,
lt_pp TYPE TABLE OF zzj_pp_001 WITH HEADER LINE,
lt_marc TYPE TABLE OF marc WITH HEADER LINE,
lt_matnr TYPE TABLE OF ty_matnr WITH HEADER LINE.
* 取物料工厂数据
SELECT
t01~matnr"物料
t01~werks"工厂
t02~maktx"物料描述
* t03~name1"工厂描述
FROM marc AS t01
INNER JOIN makt AS t02 ON t01~matnr = t02~matnr AND t02~spras = '1'
INNER JOIN t001w AS t03 ON t01~werks = t03~werks
INNER JOIN mara AS t04 ON t01~matnr = t04~matnr
INTO CORRESPONDING FIELDS OF TABLE gt_alv_itab
WHERE t01~werks IN s_werks
AND t01~matnr IN s_matnr
AND t04~mtart = 'FERT'.
*物料 采购周期
SELECT
matnr
werks
plifz"采购周期
FROM marc
INTO CORRESPONDING FIELDS OF TABLE lt_matnr
WHERE matnr in s_matnr
AND werks IN s_werks.
* 本月需求数量
SELECT
matnr "物料
werks "工厂
SUM( plnmg ) AS plnmg"需求数量
FROM pbim AS t01
INNER JOIN pbed AS t02 ON t01~bdzei = t02~bdzei
INTO CORRESPONDING FIELDS OF TABLE lt_pbim
WHERE werks IN s_werks
AND matnr IN s_matnr
AND versb = '00'
* AND pdatu IN r_now
AND t01~loevr = ''
AND t02~loevr = ''
GROUP BY matnr werks.
* 库存数量
SELECT
matnr "物料
werks"工厂
lgort"库存地点
labst"库存数
* SUM( labst ) AS labst"库存数累计
FROM mard
INTO CORRESPONDING FIELDS OF TABLE lt_mard
WHERE werks IN s_werks
AND matnr IN s_matnr.
* GROUP BY matnr werks.
*取最小批量
SELECT
matnr"物料
werks"工厂
bstmi"最小批量
FROM marc
INTO CORRESPONDING FIELDS OF TABLE lt_marc
WHERE werks IN s_werks
AND matnr IN s_matnr.
* 取保存数据
SELECT *
FROM zzj_pp_001
INTO TABLE lt_pp
WHERE werks IN s_werks
AND matnr IN s_matnr.
LOOP AT gt_alv_itab.
* 读取本月计划数量
READ TABLE lt_pbim WITH KEY werks = gt_alv_itab-werks matnr = gt_alv_itab-matnr.
IF sy-subrc = 0.
gt_alv_itab-plnmg = lt_pbim-plnmg."计划数量
ENDIF.
* 读取库存数量
READ TABLE lt_mard WITH KEY werks = gt_alv_itab-werks matnr = gt_alv_itab-matnr.
IF sy-subrc = 0.
gt_alv_itab-labst = lt_mard-labst."库存数量
ENDIF.
* 读取最小批量
READ TABLE lt_marc WITH KEY werks = gt_alv_itab-werks matnr = gt_alv_itab-matnr.
IF sy-subrc = 0.
gt_alv_itab-bstmi = lt_marc-bstmi."最小批量
ENDIF.
* 要求到货时间 = 当前日期 + 采购周期
READ TABLE lt_matnr WITH KEY werks = gt_alv_itab-werks matnr = gt_alv_itab-matnr.
IF sy-subrc = 0.
gt_alv_itab-zyqdh = sy-datum + lt_matnr-plifz."要求到货时间
ENDIF.
READ TABLE lt_pp WITH KEY werks = gt_alv_itab-werks matnr = gt_alv_itab-matnr.
IF SY-SUBRC = 0.
gt_alv_itab-zdjs = lt_pp-zdjs.
gt_alv_itab-zwqcgdd = lt_pp-zwqcgdd.
gt_alv_itab-zjxq = lt_pp-zjxq.
* gt_alv_itab-bstmi = lt_pp-bstmi.
gt_alv_itab-ztzsl = lt_pp-ztzsl.
gt_alv_itab-zcgxdsl = lt_pp-zcgxdsl.
* gt_alv_itab-zyqdh = lt_pp-zyqdh.
gt_alv_itab-zyjdh = lt_pp-zyjdh.
ENDIF.
MODIFY gt_alv_itab.
CLEAR gt_alv_itab.
ENDLOOP.
ENDFORM. " FRM_GET_DATA
*&-------------------------------------------------
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV .
IF wcl_container IS INITIAL.
PERFORM frm_create_container."创建容器
PERFORM frm_pre_layout."设置ALV样式
PERFORM frm_pre_fieldcat."设置ALV字段
PERFORM frm_upload_event."注册事件
PERFORM frm_set_tab_display."显示ALV
ELSE.
PERFORM frm_refresh_data."刷新ALV
ENDIF.
ENDFORM. " FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_CONTAINER
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_CREATE_CONTAINER .
CREATE OBJECT wcl_container
EXPORTING
repid = sy-repid
dynnr = sy-dynnr "当前屏幕
ratio = 95 "调整屏幕ALV的显示长度
side = cl_gui_docking_container=>dock_at_top."TOP-ALV贴着屏幕上端
CREATE OBJECT wcl_alv
EXPORTING
i_parent = wcl_container.
ENDFORM. " FRM_CREATE_CONTAINER
*&---------------------------------------------------------------------*
*& Form FRM_PRE_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_PRE_LAYOUT .
gs_layout-zebra = 'X'.
gs_layout-sel_mode = 'A'.
gs_layout-cwidth_opt = 'X'.
gs_layout-info_fname = 'ROWCOLOR'.
gs_layout-stylefname = 'CELLSTYLES'.
ENDFORM. " FRM_PRE_LAYOUT
*&---------------------------------------------------------------------*
*& Form FRM_PRE_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_PRE_FIELDCAT .
PERFORM sub_fill_alv_fieldcat USING 'WERKS' '工厂' space space 'X' space.
PERFORM sub_fill_alv_fieldcat USING 'MATNR' '物料号' space 'X' space space.
PERFORM sub_fill_alv_fieldcat USING 'MAKTX' '物料描述' space space space space.
PERFORM sub_fill_alv_fieldcat USING 'PLNMG' '需求' space 'X' space 'X'.
PERFORM sub_fill_alv_fieldcat USING 'LABST' '库存数量' space 'X' space space.
PERFORM sub_fill_alv_fieldcat USING 'ZDJS' '待检数' space 'X' space space.
PERFORM sub_fill_alv_fieldcat USING 'ZWQCGDD' '未清采购订单数(在途)' space 'X' space space.
PERFORM sub_fill_alv_fieldcat USING 'ZJXQ' '净需求'space 'X' space space.
PERFORM sub_fill_alv_fieldcat USING 'BSTMI' '最小批量' space 'X' space space.
PERFORM sub_fill_alv_fieldcat USING 'ZTZSL' '调整数量' space 'X' space space.
PERFORM sub_fill_alv_fieldcat USING 'ZCGXDSL' '采购下单数量' space 'X' space space.
PERFORM sub_fill_alv_fieldcat USING 'ZYQDH' '要求到货时间' space space space space.
PERFORM sub_fill_alv_fieldcat USING 'ZYJDH' '预计到货时间' 'X'space space space.
ENDFORM. " FRM_PRE_FIELDCAT
*&---------------------------------------------------------------------*
*& Form SUB_FILL_ALV_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0340 text
* -->P_0341 text
* -->P_SPACE text
* -->P_SPACE text
* -->P_0344 text
* -->P_SPACE text
*----------------------------------------------------------------------*
FORM SUB_FILL_ALV_FIELDCAT USING p_fieldname "TYPE slis_fieldname
p_reptext_ddic "LIKE dd03p-reptext
P_edit" TYPE slis_edit_mask
p_zero" TYPE c
p_hotspot
p_sum.
DATA:l_fieldcat_lvc TYPE lvc_s_fcat.
l_fieldcat_lvc-fieldname = p_fieldname.
l_fieldcat_lvc-reptext = p_reptext_ddic.
l_fieldcat_lvc-edit = p_edit.
l_fieldcat_lvc-no_zero = p_zero.
l_fieldcat_lvc-hotspot = p_hotspot.
l_fieldcat_lvc-do_sum = p_sum.
APPEND l_fieldcat_lvc to g_itab_fieldcat_lvc.
ENDFORM. " SUB_FILL_ALV_FIELDCAT
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_EVENT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_UPLOAD_EVENT .
DATA:lr_event_handler TYPE REF TO lcl_event_handler.
CREATE OBJECT lr_event_handler.
SET HANDLER lr_event_handler->handle_toolbar FOR wcl_alv.
SET HANDLER lr_event_handler->handle_user_command FOR wcl_alv.
CALL METHOD wcl_alv->register_edit_event"注册更新事件
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified"表示在单元格修改后回车或者其他操作时触发事件,此类型可用于多个单元格修改后修改后一起检查修改的值
EXCEPTIONS
error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
SET HANDLER lr_event_handler->handle_data_changed FOR wcl_alv.
SET HANDLER lr_event_handler->handle_data_changed_finished FOR wcl_alv.
ENDFORM. " FRM_UPLOAD_EVENT
*&---------------------------------------------------------------------*
*& Form FRM_SET_TAB_DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_SET_TAB_DISPLAY .
CALL METHOD wcl_alv->set_table_for_first_display
EXPORTING
i_save = 'A'
i_default = 'X'
is_layout = gs_layout
CHANGING
it_outtab = gt_alv_itab[]
it_fieldcatalog = g_itab_fieldcat_lvc
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
IF sy-subrc <> 0.
ENDIF.
ENDFORM. " FRM_SET_TAB_DISPLAY
*&---------------------------------------------------------------------*
*& Form FRM_REFRESH_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_REFRESH_DATA .
DATA:lw_stbl TYPE lvc_s_stbl.
lw_stbl-row = 'X'.
lw_stbl-col = 'X'.
CALL METHOD wcl_alv->refresh_table_display
EXPORTING
is_stable = lw_stbl
EXCEPTIONS
finished = 1
OTHERS = 2.
IF sy-subrc <> 0.
ENDIF.
ENDFORM. " FRM_REFRESH_DATA
*&---------------------------------------------------------------------*
*& Form FRM_SAVE_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TEXT_002 text
* -->P_TEXT_003 text
* <--P_L_ANSWER text
*----------------------------------------------------------------------*
FORM FRM_SAVE_DATA USING p_title p_text CHANGING p_answer.
DATA:lt_pp TYPE TABLE OF zzj_pp_001 WITH HEADER LINE.
DATA:lt_row TYPE lvc_t_row.
DATA:lt_row2 TYPE lvc_t_roid.
CALL METHOD wcl_alv->get_selected_rows
IMPORTING
et_index_rows = lt_row
et_row_no = lt_row2.
PERFORM frm_check_changed_data USING wcl_alv.
LOOP AT gt_alv_itab.
MOVE-CORRESPONDING gt_alv_itab TO lt_pp.
APPEND lt_pp.
CLEAR lt_pp.
ENDLOOP.
IF g_ischange = 'X'.
IF p_title IS INITIAL OR p_text IS INITIAL.
p_answer = '1'.
ELSE.
PERFORM frm_confirm USING p_title p_text CHANGING p_answer.
ENDIF.
IF p_answer = '1'.
MODIFY (g_tabnm) FROM TABLE lt_pp.
CLEAR g_ischange.
ENDIF.
ENDIF.
ENDFORM. " FRM_SAVE_DATA
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_CHANGED_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_WCL_ALV text
*----------------------------------------------------------------------*
FORM FRM_CHECK_CHANGED_DATA USING PCL_ALV TYPE REF TO cl_gui_alv_grid.
DATA:l_valid.
CALL METHOD pcl_alv->check_changed_data
IMPORTING
e_valid = l_valid.
ENDFORM. " FRM_CHECK_CHANGED_DATA
*&---------------------------------------------------------------------*
*& Form FRM_CONFIRM
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_P_TITLE text
* -->P_P_TEXT text
* <--P_P_ANSWER text
*----------------------------------------------------------------------*
FORM FRM_CONFIRM USING P_TITLE
P_TEXT
CHANGING P_ANSWER.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
TITLEBAR = p_title
TEXT_QUESTION = p_text
IMPORTING
ANSWER = p_answer.
IF sy-subrc <> 0.
ENDIF.
ENDFORM. " FRM_CONFIRM
*&---------------------------------------------------------------------*
*& Form HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_E_OBJECT text
* -->P_E_INTERACTIVE text
*----------------------------------------------------------------------*
FORM HANDLE_TOOLBAR USING p_e_object TYPE REF TO cl_alv_event_toolbar_set
p_e_interactive.
ENDFORM. " HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
*& Form HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_E_UCOMM text
*----------------------------------------------------------------------*
FORM HANDLE_USER_COMMAND USING P_E_UCOMM.
ENDFORM. " HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ER_DATA_CHANGED text
* -->P_E_ONF4 text
* -->P_E_ONF4_BEFORE text
* -->P_E_ONF4_AFTER text
* -->P_E_UCOMM text
*----------------------------------------------------------------------*
FORM HANDLE_DATA_CHANGED USING p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol
p_e_onf4
p_e_onf4_before
p_e_onf4_after
p_e_ucomm TYPE sy-ucomm.
g_ischange = 'X'.
ENDFORM. " HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
*& Form HANDLE_DATA_CHANGED_FINISHED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_E_MODIFIED text
* -->P_ET_GOOD_CELLS text
*----------------------------------------------------------------------*
FORM HANDLE_DATA_CHANGED_FINISHED USING p_e_modified
p_et_good_cells TYPE lvc_t_modi.
DATA:ls_good_cells TYPE lvc_s_modi.
LOOP AT p_et_good_cells INTO ls_good_cells ."WHERE fieldname = 'ZSFSC'.
READ TABLE gt_alv_itab INDEX ls_good_cells-row_id.
MODIFY gt_alv_itab INDEX ls_good_cells-row_id.
ENDLOOP.
PERFORM frm_refresh_data.
ENDFORM. " HANDLE_DATA_CHANGED_FINISHED
INCLUDE ZPPR_0037PBO.
*&---------------------------------------------------------------------*
*& 包括 ZPPR_0037PBO
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE STATUS_9000 OUTPUT.
SET PF-STATUS 'STAT9000'.
SET TITLEBAR 'TIT9000'.
ENDMODULE. " STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*& Module DISPLAY_ALV_9000 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE DISPLAY_ALV_9000 OUTPUT.
PERFORM FRM_DISPLAY_ALV.
ENDMODULE. " DISPLAY_ALV_9000 OUTPUT
INCLUDE ZPPR_0037PAI.
*&---------------------------------------------------------------------*
*& 包括 ZPPR_0037PAI
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_9000 INPUT.
DATA:l_answer.
save_ok = ok_code_9000.
CASE save_ok.
WHEN 'BACK'.
IF g_ischange = 'X'.
PERFORM frm_save_data USING text-002 text-003 CHANGING l_answer.
IF l_answer <> 'A'.
LEAVE TO SCREEN 0.
ENDIF.
ELSE.
LEAVE TO SCREEN 0.
ENDIF.
WHEN 'SAVE'.
PERFORM frm_save_data USING space space CHANGING l_answer.
WHEN 'EXIT'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
*& Module EXIT_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE EXIT_9000 INPUT.
ENDMODULE. " EXIT_9000 INPUT