SAP 一个屏幕多ALV 例子
使用到类:cl_gui_docking_container, cl_gui_splitter_container, cl_gui_container, cl_gui_alv_grid
1.效果
2.源代码
MAIN程序
*&---------------------------------------------------------------------*
*& Report ZPPD011B
*&---------------------------------------------------------------------*
*& 包材材料需求运算确认
*&---------------------------------------------------------------------*
REPORT zppd011b.
TABLES:zppt0011b,zppt0011c.
* 抬头数据
TYPES: BEGIN OF ty_out1,
sel TYPE char01,
icon TYPE char4.
* pre_check_type TYPE bapiret2-type.
INCLUDE STRUCTURE zppt0011b.
TYPES:
maktx TYPE maktx,
type TYPE bapiret2-type,
message TYPE bapiret2-message,
END OF ty_out1.
* 明细数据
TYPES: BEGIN OF ty_out2.
TYPES:
sel TYPE char01.
INCLUDE STRUCTURE zppt0011c.
TYPES:
END OF ty_out2.
DATA:gt_out1 TYPE TABLE OF ty_out1.
DATA gt_out2 TYPE TABLE OF ty_out2.
DATA: BEGIN OF gt_ztdz_sum OCCURS 0,
werks TYPE werks_d,
ztdz TYPE ztdz,
zxqsl1 TYPE zppt0011c-zxqsl1,
END OF gt_ztdz_sum.
DATA: go_container TYPE REF TO cl_gui_docking_container,
go_splitter TYPE REF TO cl_gui_splitter_container,
go_cont TYPE REF TO cl_gui_container,
go_cont2 TYPE REF TO cl_gui_container,
go_alvgrid TYPE REF TO cl_gui_alv_grid,
go_alvgrid2 TYPE REF TO cl_gui_alv_grid,
gt_excluding TYPE ui_functions,
gt_excluding2 TYPE ui_functions,
gs_fieldcat TYPE lvc_s_fcat,
gt_fieldcat TYPE lvc_t_fcat,
gt_fieldcat2 TYPE lvc_t_fcat,
gs_layout TYPE lvc_s_layo,
gs_layout2 TYPE lvc_s_layo,
gs_styl TYPE lvc_s_styl,
gt_styl TYPE lvc_t_styl,
gt_events TYPE slis_t_event WITH HEADER LINE,
gt_events2 TYPE slis_t_event WITH HEADER LINE,
gt_event_exit TYPE slis_t_event_exit WITH HEADER LINE,
gt_event_exit2 TYPE slis_t_event_exit WITH HEADER LINE,
gs_grid_settings TYPE lvc_s_glay.
DATA: gv_ucomm TYPE sy-ucomm.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-t01.
SELECT-OPTIONS: s_werks FOR zppt0011b-werks OBLIGATORY DEFAULT '1100' NO-EXTENSION NO INTERVALS.
PARAMETERS p_zjhts TYPE zppt0011c-zjhts DEFAULT 7.
SELECTION-SCREEN END OF BLOCK b1.
INCLUDE zppd011b_o01.
INCLUDE zppd011b_i01.
INCLUDE zppd011b_c01.
INCLUDE zppd011b_f01.
INITIALIZATION.
PERFORM initializtion.
AT SELECTION-SCREEN OUTPUT.
AT SELECTION-SCREEN.
START-OF-SELECTION.
CLEAR: gt_ztdz_sum[].
PERFORM frm_auth_check.
PERFORM frm_get_item_data.
PERFORM frm_get_head_data.
PERFORM frm_get_zjxq1. "分配净需求数量
CALL SCREEN 1001.
屏幕逻辑流
PROCESS BEFORE OUTPUT.
MODULE status_1001.
PROCESS AFTER INPUT.
MODULE user_command_1001.
PBO
*----------------------------------------------------------------------*
***INCLUDE ZPPD011B_O01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_1001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_1001 OUTPUT.
SET PF-STATUS 'PF_1001'.
SET TITLEBAR 'T01'.
IF go_container IS INITIAL.
PERFORM frm_container_init.
PERFORM frm_data_output1.
PERFORM frm_data_output2.
ENDIF.
ENDMODULE.
PAI
*----------------------------------------------------------------------*
***INCLUDE ZPPD011B_I01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_1001 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_1001 INPUT.
PERFORM frm_user_command_1001.
ENDMODULE.
ALV 事件响应
*&---------------------------------------------------------------------*
*& 包含 ZPPD011B_C01
*&---------------------------------------------------------------------*
CLASS lcl_event_receiver 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_double_click FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING
e_column
es_row_no,
handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING
e_column_id
es_row_no,
data_changed FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING
e_onf4
e_onf4_after
e_onf4_before
er_data_changed
e_ucomm,
data_changed_finished FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING
e_modified
et_good_cells
sender.
ENDCLASS.
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_toolbar.
DATA: ls_toolbar TYPE stb_button.
MOVE 'ZCONFIRM' TO ls_toolbar-function. "运算结果确认
MOVE icon_checked TO ls_toolbar-icon.
MOVE '运算结果确认' TO ls_toolbar-text.
APPEND ls_toolbar TO e_object->mt_toolbar.
ENDMETHOD.
METHOD handle_user_command.
PERFORM frm_alv1_command USING e_ucomm.
ENDMETHOD.
METHOD handle_double_click.
ENDMETHOD.
METHOD handle_hotspot_click.
ENDMETHOD.
METHOD data_changed.
ENDMETHOD.
METHOD data_changed_finished.
ENDMETHOD.
ENDCLASS.
CLASS lcl_event_receiver2 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.
METHODS handle_data_changed_finished
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified et_good_cells.
ENDCLASS.
CLASS lcl_event_receiver2 IMPLEMENTATION.
METHOD handle_toolbar.
ENDMETHOD.
METHOD handle_user_command.
ENDMETHOD.
METHOD handle_data_changed_finished.
ENDMETHOD. "HANDLE_MODIFY
ENDCLASS.
DATA: go_event_receiver TYPE REF TO lcl_event_receiver.
DATA: go_event_receiver2 TYPE REF TO lcl_event_receiver2.
FORM集
*----------------------------------------------------------------------*
***INCLUDE ZPPD011B_F01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form INITIALIZTION
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM initializtion .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_AUTH_CHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_auth_check .
AUTHORITY-CHECK OBJECT 'C_AFKO_AWK'
ID 'WERKS' FIELD s_werks-low.
IF sy-subrc <> 0.
MESSAGE s001(00) WITH '缺少工厂' s_werks-low '的权限' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CONTAINER_INIT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_container_init .
CREATE OBJECT go_container
EXPORTING
repid = sy-repid
dynnr = '1001'
side = cl_gui_docking_container=>dock_at_left "容器贴屏幕左边
extension = cl_gui_control=>ws_maximizebox "容器宽度
style = cl_gui_control=>ws_child "可选参数,设置容器是否可用手动拖动大小
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
IF sy-subrc <> 0.
MESSAGE s001(00) WITH '屏幕容器初始化失败'(044).
LEAVE LIST-PROCESSING.
ENDIF.
*分割容器
CREATE OBJECT go_splitter
EXPORTING
parent = go_container
rows = 2
columns = 1.
CALL METHOD go_splitter->get_container "alv1的容器
EXPORTING
row = 1
column = 1
RECEIVING
container = go_cont.
CALL METHOD go_splitter->get_container
EXPORTING
row = 2
column = 1
RECEIVING
container = go_cont2. "alv2的容器
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_OUTPUT1
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_data_output1 .
DATA ls_variant TYPE disvariant.
ls_variant-report = sy-repid.
CREATE OBJECT go_alvgrid
EXPORTING
i_parent = go_cont.
PERFORM frm_alv_exclude TABLES gt_excluding.
PERFORM frm_alv_layout.
PERFORM frm_build_fieldcat
TABLES gt_fieldcat
USING 'HEAD'.
PERFORM frm_alv_event.
PERFORM frm_alv_call.
ENDFORM.
FORM frm_alv_event .
CREATE OBJECT go_event_receiver.
CALL METHOD go_alvgrid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
go_alvgrid->register_edit_event(
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified " Event ID
EXCEPTIONS
error = 1
OTHERS = 2
).
SET HANDLER go_event_receiver->handle_toolbar FOR go_alvgrid.
SET HANDLER go_event_receiver->handle_user_command FOR go_alvgrid.
SET HANDLER go_event_receiver->handle_hotspot_click FOR go_alvgrid.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_EXCLUDE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
* -->P_GT_EXCLUDING text
*&---------------------------------------------------------------------*
FORM frm_alv_exclude TABLES pt_exclude TYPE ui_functions .
DATA: ls_exclude TYPE ui_func.
* "明细
* LS_EXCLUDE = '&DETAIL'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
"检查
ls_exclude = '&CHECK'.
APPEND ls_exclude TO pt_exclude.
"刷新
ls_exclude = '&REFRESH'.
APPEND ls_exclude TO pt_exclude.
"剪切
ls_exclude = '&LOCAL&CUT'.
APPEND ls_exclude TO pt_exclude.
"复制文本
ls_exclude = '&LOCAL#'.
APPEND ls_exclude TO pt_exclude.
"插入总览
ls_exclude = '&MB_PASTE'.
APPEND ls_exclude TO pt_exclude.
"撤销
ls_exclude = '&LOCAL&UNDO'.
APPEND ls_exclude TO pt_exclude.
"附加行
ls_exclude = '&LOCAL&APPEND'.
APPEND ls_exclude TO pt_exclude.
"插入行
ls_exclude = '&LOCAL&INSERT_ROW'.
APPEND ls_exclude TO pt_exclude.
"删除行
ls_exclude = '&LOCAL&DELETE_ROW'.
APPEND ls_exclude TO pt_exclude.
* "降序
* LS_EXCLUDE = '&SORT_DSC'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
* "升序
* LS_EXCLUDE = '&SORT_ASC'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
* "查找
* LS_EXCLUDE = '&FIND'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
* "查找下一个
* LS_EXCLUDE = '&FIND_MORE'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
* "设置筛选器
* LS_EXCLUDE = '&FILTER'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
* "总计
* LS_EXCLUDE = '&MB_SUM '.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
* "小计
* LS_EXCLUDE = '&SUBTOT'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
* "打印
* LS_EXCLUDE = '&PRINT'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
* "视图
* LS_EXCLUDE = '&VIEW'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
* "输出
* LS_EXCLUDE = '&MB_EXPORT'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
* "格式
* LS_EXCLUDE = '&MB_VARIANT'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
* "显示图形
* LS_EXCLUDE = '&GRAPH'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
* "最终用户文档
* LS_EXCLUDE = '&INFO'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
"复制行
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
APPEND ls_exclude TO pt_exclude.
"复制行
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
APPEND ls_exclude TO pt_exclude.
ENDFORM. " frm_alv_exclude
*&---------------------------------------------------------------------*
*& Form FRM_ALV_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_alv_layout .
gs_layout-cwidth_opt = 'X'.
gs_layout-sel_mode = 'B'.
gs_layout-zebra = 'X'.
* gs_layout-detailinit = 'X'.
gs_layout-grid_title = '包材需求确认表'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_BUILD_HEAD_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
* -->P_GT_FIELDCAT text
* -->P_GT_OUT1 text
*&---------------------------------------------------------------------*
FORM frm_build_fieldcat TABLES pt_fieldcat STRUCTURE lvc_s_fcat
USING p_flag.
DEFINE mcr_fieldcat.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1.
gs_fieldcat-coltext = &2.
gs_fieldcat-scrtext_s = &2.
gs_fieldcat-scrtext_l = &2.
gs_fieldcat-scrtext_m = &2.
gs_fieldcat-key = &3.
gs_fieldcat-checkbox = &4.
gs_fieldcat-edit = &5.
gs_fieldcat-hotspot = &6.
gs_fieldcat-ref_table = &7.
gs_fieldcat-ref_field = &8.
gs_fieldcat-icon = &9.
APPEND gs_fieldcat TO pt_fieldcat.
END-OF-DEFINITION.
IF p_flag = 'HEAD'.
mcr_fieldcat 'SEL' '选择' '' 'X' 'X' '' '' '' ''.
mcr_fieldcat 'ICON' '指示灯' '' '' '' '' '' '' ''.
mcr_fieldcat 'MESSAGE' '消息' '' '' '' '' '' '' ''.
mcr_fieldcat 'ZSERID' '序列号' '' '' '' '' 'ZPPT0011B' 'ZSERID' ''.
mcr_fieldcat 'WERKS' '工厂' '' '' '' '' 'ZPPT0011B' 'WERKS' ''.
mcr_fieldcat 'ZTDZ' '替代组标识' '' '' '' '' 'ZPPT0011B' 'ZTDZ' ''.
mcr_fieldcat 'ZXQSL' '总需求数量' '' '' '' '' 'ZPPT0011B' 'ZXQSL' ''.
mcr_fieldcat 'ZKCSL' '总库存数' '' '' '' '' 'ZPPT0011B' 'ZKCSL' ''.
mcr_fieldcat 'ZCGSQ' '总采购申请' '' '' '' '' 'ZPPT0011B' 'ZCGSQ' ''.
mcr_fieldcat 'ZZTSL' '总在途数量' '' '' '' '' 'ZPPT0011B' 'ZZTSL' ''.
mcr_fieldcat 'ZJXQ' '总净需求' '' '' '' '' 'ZPPT0011B' 'ZJXQ' ''.
mcr_fieldcat 'MATNR' '物料编码' '' '' '' '' 'ZPPT0011B' 'MATNR' ''.
mcr_fieldcat 'MAKTX' '物料描述' '' '' '' '' 'MAKT' 'MAKTX' ''.
mcr_fieldcat 'ZKCSL1' '库存数' '' '' '' '' 'ZPPT0011B' 'ZKCSL1' ''.
mcr_fieldcat 'ZCGSQ1' '采购申请' '' '' '' '' 'ZPPT0011B' 'ZCGSQ1' ''.
mcr_fieldcat 'ZZTSL1' '在途数量' '' '' '' '' 'ZPPT0011B' 'ZZTSL1' ''.
mcr_fieldcat 'ZJXQ1' '分配净需求数量' '' '' '' '' 'ZPPT0011B' 'ZJXQ1' ''.
ELSEIF p_flag = 'ITEM'.
mcr_fieldcat 'ZSERID' '序列号' '' '' '' '' 'ZPPT0011C' 'ZSERID' ''.
mcr_fieldcat 'WERKS' '工厂' '' '' '' '' 'ZPPT0011C' 'WERKS' ''.
mcr_fieldcat 'ZZJ' '直径' '' '' '' '' 'ZPPT0011C' 'ZZJ' ''.
mcr_fieldcat 'ZYSFS' '运输方式' '' '' '' '' 'ZPPT0011C' 'ZYSFS' ''.
mcr_fieldcat 'ZCN' '产能(W)/每天' '' '' '' '' 'ZPPT0011C' 'ZCN' ''.
mcr_fieldcat 'ZJHTS' '计划天数' '' '' '' '' 'ZPPT0011C' 'ZJHTS' ''.
mcr_fieldcat 'ZBCLX' '包材类型' '' '' '' '' 'ZPPT0011C' 'ZBCLX' ''.
mcr_fieldcat 'ZTDZ' '替代组标识' '' '' '' '' 'ZPPT0011C' 'ZTDZ' ''.
mcr_fieldcat 'BMENG' '基础数量' '' '' '' '' 'ZPPT0011C' 'BMENG' ''.
mcr_fieldcat 'MENGE' '使用数量' '' '' '' '' 'ZPPT0011C' 'MENGE' ''.
mcr_fieldcat 'ZXQSL1' '需求数量' '' '' '' '' 'ZPPT0011C' 'ZXQSL1' ''.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_CALL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_alv_call .
DATA ls_variant TYPE disvariant .
ls_variant-report = sy-repid.
ls_variant-handle = '1'.
CALL METHOD go_alvgrid->set_table_for_first_display
EXPORTING
is_variant = ls_variant
i_default = 'X'
i_save = 'A'
is_layout = gs_layout
it_toolbar_excluding = gt_excluding
CHANGING
it_outtab = gt_out1[]
it_fieldcatalog = gt_fieldcat[].
CALL METHOD go_alvgrid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
PERFORM frm_alv_refresh USING go_alvgrid.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_OUTPUT2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_data_output2 .
DATA ls_variant TYPE disvariant .
ls_variant-report = sy-repid.
CREATE OBJECT go_alvgrid2
EXPORTING
i_parent = go_cont2.
PERFORM frm_alv_exclude2 TABLES gt_excluding2.
PERFORM frm_alv_layout2.
PERFORM frm_build_fieldcat TABLES gt_fieldcat2
USING 'ITEM'.
PERFORM frm_alv_event2.
PERFORM frm_alv_call2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_EXCLUDE2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
* -->P_GT_EXCLUDING2 text
*&---------------------------------------------------------------------*
FORM frm_alv_exclude2 TABLES pt_exclude TYPE ui_functions.
DATA: ls_exclude TYPE ui_func.
* "明细
* LS_EXCLUDE = '&DETAIL'.
* APPEND LS_EXCLUDE TO PT_EXCLUDE.
"检查
ls_exclude = '&CHECK'.
APPEND ls_exclude TO pt_exclude.
"刷新
ls_exclude = '&REFRESH'.
APPEND ls_exclude TO pt_exclude.
"剪切
ls_exclude = '&LOCAL&CUT'.
APPEND ls_exclude TO pt_exclude.
"复制文本
ls_exclude = '&LOCAL#'.
APPEND ls_exclude TO pt_exclude.
"插入总览
ls_exclude = '&MB_PASTE'.
APPEND ls_exclude TO pt_exclude.
"撤销
ls_exclude = '&LOCAL&UNDO'.
APPEND ls_exclude TO pt_exclude.
"附加行
ls_exclude = '&LOCAL&APPEND'.
APPEND ls_exclude TO pt_exclude.
"插入行
ls_exclude = '&LOCAL&INSERT_ROW'.
APPEND ls_exclude TO pt_exclude.
"删除行
ls_exclude = '&LOCAL&DELETE_ROW'.
APPEND ls_exclude TO pt_exclude.
"复制行
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
APPEND ls_exclude TO pt_exclude.
"复制行
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
APPEND ls_exclude TO pt_exclude.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_LAYOUT2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_alv_layout2 .
gs_layout2-cwidth_opt = 'X'.
gs_layout2-sel_mode = 'B'.
gs_layout2-zebra = 'X'.
* gs_layout2-detailinit = 'X'.
gs_layout2-grid_title = '包材需求明细表'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_EVENT2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_alv_event2 .
CREATE OBJECT go_event_receiver2.
CALL METHOD go_alvgrid2->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
CALL METHOD go_alvgrid2->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
* SET HANDLER go_event_receiver2->handle_toolbar FOR go_alvgrid2.
* SET HANDLER go_event_receiver2->handle_user_command FOR go_alvgrid2.
SET HANDLER go_event_receiver2->handle_data_changed_finished FOR go_alvgrid2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_CALL2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_alv_call2 .
DATA ls_variant TYPE disvariant .
ls_variant-report = sy-repid.
ls_variant-handle = '2'.
CALL METHOD go_alvgrid2->set_table_for_first_display
EXPORTING
is_variant = ls_variant
i_default = 'X'
i_save = 'A'
is_layout = gs_layout2
it_toolbar_excluding = gt_excluding2
CHANGING
it_outtab = gt_out2[]
it_fieldcatalog = gt_fieldcat2[].
CALL METHOD go_alvgrid2->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
PERFORM frm_alv_refresh USING go_alvgrid2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV1_COMMAND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
* -->P_E_UCOMM text
*&---------------------------------------------------------------------*
FORM frm_alv1_command USING e_ucomm.
CASE e_ucomm.
WHEN 'ZCONFIRM'.
PERFORM frm_zconfirm. "运算结果确认
PERFORM frm_alv_refresh USING go_alvgrid.
PERFORM frm_alv_refresh USING go_alvgrid2.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_ITEM_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_item_data .
DATA: ls_item TYPE ty_out2.
SELECT werks,zzj,zysfs,zcn
INTO TABLE @DATA(lt_cnjh)
FROM zppt0010a
WHERE werks IN @s_werks
AND zinact = ''.
IF lt_cnjh[] IS NOT INITIAL.
SELECT werks,zzj,zysfs,
zbclx,ztdz,
SUM( bmeng ) AS bmeng, "基本数量
SUM( menge ) AS menge "基本数量
FROM zppt0011a
WHERE werks IN @s_werks
AND zdel = ''
GROUP BY werks,zzj,zysfs,zbclx,ztdz
INTO TABLE @DATA(lt_bcxx).
SORT lt_bcxx BY werks zzj zysfs.
ENDIF.
LOOP AT lt_cnjh INTO DATA(ls_cnjh).
MOVE-CORRESPONDING ls_cnjh TO ls_item.
READ TABLE lt_bcxx TRANSPORTING NO FIELDS WITH KEY werks = ls_cnjh-werks
zzj = ls_cnjh-zzj
zysfs = ls_cnjh-zysfs
BINARY SEARCH.
IF sy-subrc = 0.
LOOP AT lt_bcxx INTO DATA(ls_bcxx) FROM sy-tabix.
ls_item-zbclx = ls_bcxx-zbclx.
ls_item-ztdz = ls_bcxx-ztdz.
ls_item-bmeng = ls_bcxx-bmeng.
ls_item-menge = ls_bcxx-menge.
COLLECT ls_item INTO gt_out2.
CLEAR: ls_bcxx.
ENDLOOP.
* ELSE.
* COLLECT ls_item INTO gt_out2.
ENDIF.
CLEAR: ls_item,ls_cnjh.
ENDLOOP.
LOOP AT gt_out2 ASSIGNING FIELD-SYMBOL(<fs_item2>).
<fs_item2>-zjhts = p_zjhts.
* 需求数=产能(W)/每天 * 10000 * 使用数量 /基础数量
IF <fs_item2>-bmeng IS NOT INITIAL.
<fs_item2>-zxqsl1 = <fs_item2>-zcn * 10000 * <fs_item2>-menge / <fs_item2>-bmeng.
ENDIF.
gt_ztdz_sum-werks = <fs_item2>-werks.
gt_ztdz_sum-ztdz = <fs_item2>-ztdz.
gt_ztdz_sum-zxqsl1 = <fs_item2>-zxqsl1.
COLLECT gt_ztdz_sum.
CLEAR:gt_ztdz_sum.
ENDLOOP.
SORT gt_ztdz_sum BY werks ztdz.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_HEAD_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_head_data .
DATA: ls_head TYPE ty_out1.
LOOP AT gt_out2 INTO DATA(ls_item).
ls_head-werks = ls_item-werks.
ls_head-ztdz = ls_item-ztdz.
SELECT a~werks,a~matnr,b~maktx,
a~ztdz
INTO TABLE @DATA(lt_bctd)
FROM zppt0011 AS a
LEFT JOIN makt AS b
ON a~matnr = b~matnr
WHERE werks = @ls_head-werks
AND ztdz = @ls_head-ztdz
AND zdel = ''.
LOOP AT lt_bctd INTO DATA(ls_bctd).
ls_head-matnr = ls_bctd-matnr.
ls_head-maktx = ls_bctd-maktx.
COLLECT ls_head INTO gt_out1.
CLEAR: ls_bctd.
ENDLOOP.
CLEAR: lt_bctd.
ENDLOOP.
DATA: lv_po TYPE menge_d,
lv_jh TYPE menge_d.
DATA: BEGIN OF lt_ztdz OCCURS 0,
werks TYPE werks_d,
ztdz TYPE ztdz,
zkcsl1 TYPE zppt0011b-zkcsl1, "库存数
zcgsq1 TYPE zppt0011b-zcgsq1, "采购申请
zztsl1 TYPE zppt0011b-zztsl1, "在途数据
END OF lt_ztdz.
LOOP AT gt_out1 ASSIGNING FIELD-SYMBOL(<fs_head>).
CLEAR: lv_po,lv_jh.
* 库存数
SELECT SINGLE SUM( labst + insme )
INTO @<fs_head>-zkcsl1
FROM mard
WHERE werks = @<fs_head>-werks
AND matnr = @<fs_head>-matnr
AND lgort = 'D101'.
* 采购申请
* 汇总(eban-menge - eban-bsmng), 条件:eban-werks = 工厂 and eban-matnr = 物料编码
* and eban-loekz <> 'X' and eban-knttp <> 'F'
SELECT SINGLE ( menge - bsmng )
INTO @<fs_head>-zcgsq1
FROM eban
WHERE werks = @<fs_head>-werks
AND matnr = @<fs_head>-matnr
AND loekz = ''
AND knttp <> 'F'.
* 在途数据 ZZTSL1
SELECT SUM( menge ) INTO @lv_po
FROM ekpo
WHERE werks = @<fs_head>-werks
AND matnr = @<fs_head>-matnr
AND loekz = ''
AND elikz = ''
AND knttp <> 'F'
AND retpo = ''.
SELECT SUM( CASE shkzg WHEN 'S' THEN a~menge
WHEN 'H' THEN - a~menge END )
INTO @lv_jh
FROM ekbe AS a
INNER JOIN ekpo AS b
ON a~ebeln = b~ebeln
AND a~ebelp = b~ebelp
WHERE b~werks = @<fs_head>-werks
AND b~matnr = @<fs_head>-matnr
AND b~loekz = ''
AND b~elikz = ''
AND b~knttp <> 'F'
AND b~retpo = ''
AND a~vgabe = '1'.
<fs_head>-zztsl1 = lv_po - lv_jh.
* 总需求数量
READ TABLE gt_ztdz_sum WITH KEY werks = <fs_head>-werks
ztdz = <fs_head>-ztdz
BINARY SEARCH.
IF sy-subrc = 0.
<fs_head>-zxqsl = gt_ztdz_sum-zxqsl1.
ENDIF.
MOVE-CORRESPONDING <fs_head> TO lt_ztdz.
COLLECT lt_ztdz.
CLEAR: lt_ztdz.
ENDLOOP.
SORT lt_ztdz BY werks ztdz.
LOOP AT gt_out1 ASSIGNING <fs_head>.
READ TABLE lt_ztdz WITH KEY werks = <fs_head>-werks
ztdz = <fs_head>-ztdz
BINARY SEARCH.
IF sy-subrc = 0.
<fs_head>-zkcsl = lt_ztdz-zkcsl1. "总库存数
<fs_head>-zcgsq = lt_ztdz-zcgsq1. "总采购申请
<fs_head>-zztsl = lt_ztdz-zztsl1. "总在途数量
ENDIF.
* 总净需求 = 总需求数- 总库存数 - 总采购申请 - 总在途数量
<fs_head>-zjxq = <fs_head>-zxqsl - <fs_head>-zkcsl - <fs_head>-zcgsq - <fs_head>-zztsl.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_ZJXQ1
*&---------------------------------------------------------------------*
*& 分配净需求数量
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_zjxq1 .
* 把总净需求平均分配到替代组标识对应的物料中。
* 例如一个替代组标识对应3个物料,那么就用总净需求(H列)/ 3 ,
* 取整赋给前两个物料,最后一个物料则是总净需求 - 前两个的和
DATA: lv_zjxq1_sum TYPE zppt0011b-zjxq1.
DATA: lv1 TYPE i. "第几个物料
LOOP AT gt_out1 INTO DATA(ls_out1) GROUP BY ( werks = ls_out1-werks
ztdz = ls_out1-ztdz
size = GROUP SIZE
index = GROUP INDEX )
INTO DATA(ls_group).
CLEAR: lv_zjxq1_sum,lv1.
LOOP AT gt_out1 ASSIGNING FIELD-SYMBOL(<fs_out1>) WHERE werks = ls_group-werks
AND ztdz = ls_group-ztdz.
lv1 = lv1 + 1.
IF lv1 NE ls_group-size.
IF ls_group-size NE 0.
<fs_out1>-zjxq1 = CONV int4( <fs_out1>-zjxq / ls_group-size ).
ENDIF.
lv_zjxq1_sum = lv_zjxq1_sum + <fs_out1>-zjxq1.
ELSE. "最后一个物料
<fs_out1>-zjxq1 = <fs_out1>-zjxq - lv_zjxq1_sum.
ENDIF.
ENDLOOP.
CLEAR: ls_out1.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ZCONFIRM
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_zconfirm .
DATA: lt_db_head TYPE TABLE OF zppt0011b,
ls_db_head TYPE zppt0011b,
lt_db_item TYPE TABLE OF zppt0011c,
ls_db_item TYPE zppt0011c,
lv_zserid TYPE zppt0011b-zserid.
IF go_alvgrid IS BOUND.
go_alvgrid->check_changed_data( ).
ENDIF.
IF line_exists( gt_out1[ sel = 'X' ] ).
ELSE.
MESSAGE s001(00) WITH '请至少选择一行数据确认' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
PERFORM frm_get_max_zserid CHANGING lv_zserid.
LOOP AT gt_out1 INTO DATA(ls_group) WHERE sel = 'X'
GROUP BY ( werks = ls_group-werks
).
CLEAR: lt_db_head,lt_db_item.
IF ls_group-zserid IS NOT INITIAL. "避免重复生成序列号
CONTINUE.
ENDIF.
UPDATE zppt0011b
SET zinact = 'X'
WHERE werks = ls_group-werks.
LOOP AT gt_out1 ASSIGNING FIELD-SYMBOL(<fs_head>) WHERE werks = ls_group-werks.
<fs_head>-zserid = lv_zserid.
<fs_head>-icon = icon_green_light.
<fs_head>-message = '确认成功'.
MOVE-CORRESPONDING <fs_head> TO ls_db_head.
ls_db_head-ernam = sy-uname.
ls_db_head-ersda = sy-datum.
ls_db_head-ersdt = sy-uzeit.
ls_db_head-zstat = 'A'. "待转单状态
APPEND ls_db_head TO lt_db_head.
CLEAR: ls_db_head.
ENDLOOP.
MODIFY zppt0011b FROM TABLE lt_db_head.
LOOP AT gt_out2 ASSIGNING FIELD-SYMBOL(<fs_item>) WHERE werks = ls_group-werks.
<fs_item>-zserid = lv_zserid.
MOVE-CORRESPONDING <fs_item> TO ls_db_item.
APPEND ls_db_item TO lt_db_item.
CLEAR ls_db_item.
ENDLOOP.
MODIFY zppt0011c FROM TABLE lt_db_item.
COMMIT WORK.
CLEAR: ls_group.
ENDLOOP.
PERFORM frm_unlock USING lv_zserid.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_MAX_ZSERID
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
* <--P_LV_ZSERID text
*&---------------------------------------------------------------------*
FORM frm_get_max_zserid CHANGING ev_zserid TYPE zserid.
* 工厂(4)+年月日(8)+3位流水号
DATA lv_no TYPE n LENGTH 3.
DATA lv_varkey TYPE rstable-varkey.
DO 10 TIMES.
CLEAR: lv_no.
SELECT MAX( zserid )
INTO @DATA(lv_max_zserid)
FROM zppt0011b
WHERE werks = @s_werks-low
AND ersda = @sy-datum.
IF sy-subrc = 0.
lv_no = lv_max_zserid+12(3).
lv_no = lv_no + 1.
ELSE.
lv_no = 1.
ENDIF.
ev_zserid = s_werks-low && sy-datum && lv_no.
lv_varkey = ev_zserid.
CALL FUNCTION 'ENQUEUE_E_TABLE'
EXPORTING
mode_rstable = 'E'
tabname = 'ZPPT0011B'
varkey = lv_varkey
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc = 0.
EXIT.
ELSE. "如果加锁失败,尝试等待
WAIT UP TO '0.5' SECONDS.
ENDIF.
CLEAR: lv_max_zserid.
ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UNLOCK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
* -->P_LV_ZSERID text
*&---------------------------------------------------------------------*
FORM frm_unlock USING lv_zserid.
DATA lv_varkey TYPE rstable-varkey.
lv_varkey = lv_zserid.
CALL FUNCTION 'DEQUEUE_E_TABLE'
EXPORTING
* MODE_RSTABLE = 'E'
tabname = 'ZPPT0011B'
varkey = lv_varkey
* X_TABNAME = ' '
* X_VARKEY = ' '
* _SCOPE = '3'
* _SYNCHRON = ' '
* _COLLECT = ' '
.
ENDFORM.
FORM frm_alv_refresh USING lo_alvgrid TYPE REF TO cl_gui_alv_grid.
DATA:
ls_stable TYPE lvc_s_stbl,
ls_layout TYPE lvc_s_layo,
lt_columns TYPE lvc_t_col,
lt_index_rows TYPE lvc_t_row,
lt_row_no TYPE lvc_t_roid.
ls_stable-row = 'X'.
ls_stable-col = 'X'.
CLEAR: lt_columns,ls_layout.
CALL METHOD lo_alvgrid->get_frontend_layout
IMPORTING
es_layout = ls_layout.
ls_layout-cwidth_opt = 'X'.
CALL METHOD lo_alvgrid->set_frontend_layout
EXPORTING
is_layout = ls_layout.
CALL METHOD lo_alvgrid->get_selected_columns "获取选择列
IMPORTING
et_index_columns = lt_columns.
CALL METHOD lo_alvgrid->get_selected_rows "获取选择行
IMPORTING
et_index_rows = lt_index_rows
et_row_no = lt_row_no.
CALL METHOD lo_alvgrid->refresh_table_display
EXPORTING
is_stable = ls_stable
i_soft_refresh = 'X'
EXCEPTIONS
finished = 1
OTHERS = 2.
*
CALL METHOD lo_alvgrid->set_selected_columns "设置回刷新前的列
EXPORTING
it_col_table = lt_columns.
CALL METHOD lo_alvgrid->set_selected_rows "设置回刷新前的列
EXPORTING
it_index_rows = lt_index_rows
it_row_no = lt_row_no.
ENDFORM. " frm_alv_refresh
*&---------------------------------------------------------------------*
*& Form FRM_USER_COMMAND_1001
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_user_command_1001 .
CASE sy-ucomm.
WHEN 'EXIT' OR 'BACK' OR 'CANC'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDFORM.