下面为 主程序代码
。
REPORT zfxorg0008.
TABLES: zfztorg01,zfztorg02,zfztorg03.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS:s_bukrs FOR zfztorg01-bukrs NO-EXTENSION NO INTERVALS. ."OBLIGATORY
SELECT-OPTIONS:s_khinr FOR zfztorg01-khinr.
SELECTION-SCREEN END OF BLOCK b1 .
INCLUDE zfxorg0008_top. "定义部分
INCLUDE zfxorg0008_class. "类部分
INCLUDE zfxorg0008_bpo. "
INCLUDE zfxorg0008_frm. "方法部分
INCLUDE zfxorg0008_pai. "
AT SELECTION-SCREEN.
*选择屏幕检查
PERFORM frm_check.
START-OF-SELECTION.
*调出主屏幕
CALL SCREEN 100.
下面为 TOP内的定义
。
TYPE-POOLS: slis.
TYPES: BEGIN OF ty_tab2,
zindex TYPE c. "选中标识
INCLUDE TYPE zfztorg01.
TYPES:
butxt TYPE t001-butxt, "公司代码
fieldstyle TYPE lvc_t_styl. "FIELDSTYLE控制
TYPES: END OF ty_tab2.
DATA:gt_tab2 TYPE TABLE OF ty_tab2, "二级ALV显示内表-
gw_tab2 TYPE ty_tab2. "二级ALV显示工作区
DATA:
go_author_cc TYPE REF TO cl_gui_container, "ALV容器
go_author_grid TYPE REF TO cl_gui_alv_grid.
DATA git_exclude TYPE ui_functions. "屏幕部分标准按钮(设置不需显示的标准按钮).
FIELD-SYMBOLS:
<fs_s_tab2_list> TYPE ty_tab2. "双击取值指针
DATA:g_double TYPE sy-index. "双击行号记录
DATA:ok_code TYPE sy-ucomm.
DATA:go_9000_split TYPE REF TO cl_gui_splitter_container.
DATA:
gv_author_fill TYPE boolean,
gv_author_refr TYPE boolean.
DATA:
gs_author_layout TYPE lvc_s_layo,
gs_author_disvariant TYPE disvariant,
gs_author_scroll_row TYPE lvc_s_roid,
gs_author_scroll_col TYPE lvc_s_col.
DATA:
gt_author_selected_row TYPE lvc_t_row,
gt_author_fcat TYPE lvc_t_fcat.
DATA:
gv_kostl_fill TYPE boolean,
gv_kostl_refr TYPE boolean.
DATA:
gs_kostl_layout TYPE lvc_s_layo,
gs_kostl_disvariant TYPE disvariant,
gs_kostl_scroll_row TYPE lvc_s_roid,
gs_kostl_scroll_col TYPE lvc_s_col.
DATA:
gt_kostl_selected_row TYPE lvc_t_row,
gt_kostl_fcat TYPE lvc_t_fcat.
DATA:
go_kostl_cc TYPE REF TO cl_gui_container,
go_kostl_grid TYPE REF TO cl_gui_alv_grid.
DATA:gv_col_pos TYPE i.
FIELD-SYMBOLS:
<fs_s_fc> TYPE lvc_s_fcat,
<fs_s_selected_row> TYPE lvc_s_row.
下面为 CLASS内的定义
。
*ALV AUTHOR的类
CLASS cl_author_event_handler DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
handle_double_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no,
handle_hotspot_click
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_row_id e_column_id es_row_no,
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_f4
FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname
e_fieldvalue
es_row_no
er_event_data
et_bad_cells
e_display,
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,
handle_toolbar_button
FOR EVENT button_click OF cl_gui_alv_grid
IMPORTING es_col_id
es_row_no.
ENDCLASS.
CLASS cl_author_event_handler IMPLEMENTATION.
METHOD handle_toolbar_button.
IF sy-subrc = 0.
ENDIF.
ENDMETHOD.
METHOD handle_data_changed.
PERFORM frm_changed_date
USING
e_onf4
e_onf4_before
e_onf4_after
e_ucomm
CHANGING er_data_changed.
ENDMETHOD.
METHOD handle_data_changed_finished."
PERFORM frm_changed_finished
USING e_modified
et_good_cells.
ENDMETHOD.
METHOD handle_double_click."双击三级
ENDMETHOD.
METHOD handle_hotspot_click."单击三级热点字段
ENDMETHOD.
METHOD handle_toolbar.
FIELD-SYMBOLS:
<fs_s_tb> TYPE stb_button.
*----------------------------------------------------------------------*
* 三级组织ALV部分的按钮
*----------------------------------------------------------------------*
* 分隔符
APPEND INITIAL LINE TO e_object->mt_toolbar ASSIGNING <fs_s_tb>.
<fs_s_tb>-butn_type = 3.
* 执行
APPEND INITIAL LINE TO e_object->mt_toolbar ASSIGNING <fs_s_tb>.
<fs_s_tb>-butn_type = 0."0 button;2 button list.
<fs_s_tb>-function = 'CHANGE'.
<fs_s_tb>-icon = icon_change.
<fs_s_tb>-text = '修改'(b01).
ENDMETHOD.
METHOD handle_user_command."三级组织界面按钮
DATA:lw_row TYPE lvc_s_row.
DATA ls_tab TYPE lvc_s_stbl.
ls_tab-row = 'X'.
ls_tab-col = 'X'.
CASE e_ucomm.
ENDCASE.
IF go_author_grid IS NOT INITIAL.
CALL METHOD go_author_grid->refresh_table_display
EXPORTING
is_stable = ls_tab.
ENDIF.
ENDMETHOD.
METHOD handle_f4.
ENDMETHOD.
ENDCLASS.
*ALV KOSTL的类
CLASS cl_kostl_event_handler DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
handle_double_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no,
handle_hotspot_click
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_row_id e_column_id es_row_no,
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_f4
FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname
e_fieldvalue
es_row_no
er_event_data
et_bad_cells
e_display,
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.
CLASS cl_kostl_event_handler IMPLEMENTATION.
METHOD handle_data_changed.
ENDMETHOD.
METHOD handle_data_changed_finished.
ENDMETHOD.
METHOD handle_double_click. "双击二级
DATA:
lv_answer,
lv_dummy TYPE string,
lv_flg TYPE boolean.
DATA:lt_01 TYPE TABLE OF ztfxorg01,
lw_01 TYPE ztfxorg01.
DATA:l_x TYPE c.
DATA:lt_edit TYPE STANDARD TABLE OF lvc_s_styl,
ls_edit TYPE lvc_s_styl.
* 读取选中行数据
READ TABLE gt_tab2 ASSIGNING <fs_s_tab2_list> INDEX e_row-index.
IF sy-subrc <> 0.
RETURN.
ELSE.
g_double = e_row-index."记录双击的行号
ENDIF.
ENDMETHOD.
METHOD handle_hotspot_click.
DATA:
ls_selected_row TYPE lvc_s_row.
*----------------------------------------------------------------------*
* 得到选中行
*----------------------------------------------------------------------*
CLEAR: gt_kostl_selected_row.
* 得到当前选中行
ls_selected_row-index = e_row_id-index.
APPEND ls_selected_row TO gt_kostl_selected_row.
* 得到当前位置
go_kostl_grid->get_scroll_info_via_id(
IMPORTING
es_row_no = gs_kostl_scroll_row
es_col_info = gs_kostl_scroll_col ).
ENDMETHOD. "handle_hotspot_click
METHOD handle_toolbar.
FIELD-SYMBOLS:
<fs_s_tb> TYPE stb_button.
*----------------------------------------------------------------------*
* 二级组织ALV部分的按钮
*----------------------------------------------------------------------*
* 分隔符
APPEND INITIAL LINE TO e_object->mt_toolbar ASSIGNING <fs_s_tb>.
<fs_s_tb>-butn_type = 3.
* 执行
APPEND INITIAL LINE TO e_object->mt_toolbar ASSIGNING <fs_s_tb>.
<fs_s_tb>-butn_type = 0.
<fs_s_tb>-function = 'BUT_CHANGE'.
<fs_s_tb>-icon = icon_change.
<fs_s_tb>-text = '修改'(b01).
APPEND INITIAL LINE TO e_object->mt_toolbar ASSIGNING <fs_s_tb>.
<fs_s_tb>-butn_type = 0.
<fs_s_tb>-function = 'BUT_SUBMIT'.
<fs_s_tb>-icon = icon_execute_object.
<fs_s_tb>-text = '提交'(b01).
ENDMETHOD.
METHOD handle_user_command."二级组织界面按钮
DATA:l_i TYPE i."选中行判断
DATA:lw_row TYPE lvc_s_row,
ls_tab TYPE lvc_s_stbl.
ls_tab-row = 'X'.
ls_tab-col = 'X'.
CASE e_ucomm.
WHEN 'BUT_CHANGE'.
go_kostl_grid->get_selected_rows(
IMPORTING
et_index_rows = gt_kostl_selected_row ).
DESCRIBE TABLE gt_kostl_selected_row LINES l_i.
IF l_i <> 1.
MESSAGE '请选择一条数据' TYPE 'S'.
ENDIF.
CHECK l_i <> 0.
"获取选中行
LOOP AT gt_kostl_selected_row INTO lw_row.
READ TABLE gt_tab2 INTO gw_tab2 INDEX lw_row-index.
IF sy-subrc <> 0 OR gw_tab2 IS INITIAL.
RETURN.
ELSE.
IF gw_tab2-zedit = '04' OR gw_tab2-zedit = '06' OR gw_tab2-zzt = '02' OR gw_tab2-zzt = '04'.
ELSE.
"更新可编辑状态
CLEAR gw_tab2-fieldstyle.
INSERT LINES OF lt_edit INTO TABLE gw_tab2-fieldstyle.
gw_tab2-bjsign = 'X'.
gw_tab2-zalter = 'X'.
gw_tab2-zedit = '04'.
gw_tab2-zlevel = '2'.
gw_tab2-name2 = gw_tab2-oname2.
gw_tab2-namel2 = gw_tab2-fname2.
MODIFY gt_tab2 FROM gw_tab2 INDEX lw_row-index.
ENDIF.
ENDIF.
ENDLOOP.
go_kostl_grid->refresh_table_display( ).
WHEN 'TEST'. "分屏功能通过按钮自动调整屏幕占比
IF g_hight = 50.
g_hight = 100.
ELSEIF g_hight = 100.
g_hight = 50.
ENDIF.
CALL METHOD go_9000_split->set_row_height
EXPORTING
id = 1
height = g_hight.
WHEN 'BUT_SUBMIT'.
go_kostl_grid->get_selected_rows(
IMPORTING
et_index_rows = gt_kostl_selected_row ).
DESCRIBE TABLE gt_kostl_selected_row LINES l_i. "存入选中行的index
IF l_i = 0.
LOOP AT gt_tab2 INTO gw_tab2 WHERE bjsign = 'X'."循环可修改标识的数据
ENDLOOP.
ELSE.
"获取选中行
CLEAR lt_tab2[].
LOOP AT gt_kostl_selected_row INTO lw_row.
READ TABLE gt_tab2 INTO lw_tab2 INDEX lw_row-index.
APPEND lw_tab2 TO lt_tab2.
ENDLOOP.
LOOP AT lt_tab2 INTO lw_tab2."循环选中的多行
LOOP AT gt_tab2 INTO gw_tab2 WHERE bjsign = 'X' AND zreq = lw_tab2-zreq AND nr = lw_tab2-nr.
ENDLOOP.
ENDLOOP.
ENDIF.
"提交操作后,由于表变动重新取数
CLEAR:gt_tab2,gt_tab3.
PERFORM frm_get_data_2.
PERFORM frm_nocan_change USING '2'.
PERFORM frm_get_data_3.
PERFORM frm_nocan_change USING '3'.
SORT gt_tab2 BY zreq DESCENDING.
SORT gt_tab3 BY zreq DESCENDING.
go_kostl_grid->refresh_table_display( ).
go_author_grid->refresh_table_display( ).
ENDCASE.
ENDMETHOD.
METHOD handle_f4.
ENDMETHOD.
ENDCLASS.
下面为 100屏幕的逻辑流代码
。
元素清单和格式无任何添加要素
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
MODULE INIT_CON.
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.
下面为 BPO代码
。
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STATUS100'.
SET TITLEBAR 'SJ'.
IF go_9000_split IS INITIAL.
* 自动创建屏幕
CREATE OBJECT go_9000_split
EXPORTING
link_dynnr = sy-dynnr
link_repid = sy-repid
parent = cl_gui_container=>screen0
rows = 1 "几行
columns = 2 "几列
name = 'GO_SPLIT_CONTAINER'.
CALL METHOD go_9000_split->get_container"
EXPORTING
row = 1
column = 1
RECEIVING
container = go_kostl_cc.
CALL METHOD go_9000_split->get_container"
EXPORTING
row = 1
column = 2
RECEIVING
container = go_author_cc.
ENDIF.
PERFORM frm_kostl_alv.
PERFORM frm_author_alv.
ENDMODULE.
MODULE status_0200 OUTPUT.
DATA num TYPE i.
SET TITLEBAR '222'.
num = num + 1.
IF num = 1.
fpernr = sy-uname.
ENDIF.
ENDMODULE.
下面为 FRM代码
。
FORM frm_check .
ENDFORM.
FORM frm_author_alv .
IF gv_author_fill <> 'X'.
CREATE OBJECT go_author_grid
EXPORTING
i_parent = go_author_cc.
*获取三级组织显示部分数据
PERFORM frm_get_data_3.
PERFORM frm_nocan_change USING '3'.
*隐藏标准按钮
PERFORM frm_author_set_exclude USING git_exclude. " 屏幕部分标准按钮(设置不需显示的标准按钮).
* 创建Field Catalog
PERFORM frm_author_build_fcat_list.
gs_author_layout-sel_mode = 'A'. "允许行选择
gs_author_layout-box_fname = 'ZINDEX'.
gs_author_layout-grid_title = '三级组织'.
gs_author_layout-stylefname = 'FIELDSTYLE'.
* 保存格式
CLEAR gs_author_disvariant.
gs_author_disvariant-report = sy-repid.
gs_author_disvariant-handle = '9001'.
gs_author_disvariant-username = sy-uname.
CALL METHOD go_author_grid->set_user_command "注册新增时间
EXPORTING
i_ucomm = cl_gui_alv_grid=>mc_fc_loc_insert_row.
CALL METHOD go_author_grid->set_user_command "注册新增时间
EXPORTING
i_ucomm = cl_gui_alv_grid=>mc_fc_loc_append_row.
* 注册事件
SET HANDLER cl_author_event_handler=>handle_double_click FOR go_author_grid.
SET HANDLER cl_author_event_handler=>handle_toolbar FOR go_author_grid.
SET HANDLER cl_author_event_handler=>handle_user_command FOR go_author_grid.
SET HANDLER cl_author_event_handler=>handle_hotspot_click FOR go_author_grid.
SET HANDLER cl_author_event_handler=>handle_data_changed FOR go_author_grid.
SET HANDLER cl_author_event_handler=>handle_data_changed_finished FOR go_author_grid.
SET HANDLER cl_author_event_handler=>handle_toolbar_button FOR go_author_grid.
CALL METHOD go_author_grid->register_edit_event "注册更新事件 移动光标就 触发 changed 事件
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified .
SORT gt_tab3 BY zreq DESCENDING.
* 第一次显示ALV
SORT gt_tab3 BY zreq DESCENDING.
go_author_grid->set_table_for_first_display(
EXPORTING
is_variant = gs_author_disvariant
i_save = 'U'
is_layout = gs_author_layout
it_toolbar_excluding = git_exclude
CHANGING
it_fieldcatalog = gt_author_fcat
it_outtab = gt_tab3 ).
gv_author_refr = gv_author_fill = abap_true.
ELSE.
go_author_grid->refresh_table_display( ).
gv_author_refr = abap_true.
* 设置选中行
IF gt_author_selected_row IS NOT INITIAL.
go_author_grid->set_selected_rows(
EXPORTING
it_index_rows = gt_author_selected_row ).
ENDIF.
* 设置位置
IF gs_author_scroll_row IS NOT INITIAL
OR gs_author_scroll_col IS NOT INITIAL.
go_author_grid->set_scroll_info_via_id(
EXPORTING
is_row_no = gs_author_scroll_row
is_col_info = gs_author_scroll_col ).
ENDIF.
ENDIF.
ENDFORM.
FORM frm_author_build_toolbar_ex .
ENDFORM.
FORM frm_author_build_fcat_list .
DATA:l_tab TYPE dd02l-tabname.
CLEAR gt_author_fcat[].
gv_col_pos = 0.
PERFORM frm_fcat_field USING 'ZREQ' '申请单号' 'ZREQ' 'ZFZTORG01' 10 '' '' CHANGING gt_author_fcat.
PERFORM frm_fcat_field USING 'VERAK' '需求人姓名' 'PERNR' 'ZFZTORG01' 10 '' '' CHANGING gt_author_fcat.
ENDFORM.
FORM frm_fcat_field
USING p_fieldname TYPE lvc_fname
p_coltext TYPE lvc_txtcol
p_rfname TYPE lvc_s_fcat-ref_field
p_rftab TYPE lvc_s_fcat-ref_table
p_outputlen TYPE lvc_s_fcat-outputlen
p_edit TYPE lvc_s_fcat-edit
p_out TYPE lvc_s_fcat-no_out
CHANGING p_it_fcat TYPE lvc_t_fcat.
gv_col_pos = gv_col_pos + 1.
APPEND INITIAL LINE TO p_it_fcat ASSIGNING <fs_s_fc>.
<fs_s_fc>-col_pos = gv_col_pos.
<fs_s_fc>-fieldname = p_fieldname.
<fs_s_fc>-coltext = p_coltext.
<fs_s_fc>-outputlen = p_outputlen.
<fs_s_fc>-edit = p_edit.
<fs_s_fc>-no_out = p_out."默认隐藏
IF p_rfname IS NOT INITIAL.
<fs_s_fc>-ref_field = p_rfname.
ENDIF.
IF p_rftab IS NOT INITIAL.
<fs_s_fc>-ref_table = p_rftab.
ENDIF.
IF p_fieldname = 'ORGST'.
<fs_s_fc>-checkbox = 'X'."选择框
ENDIF.
ENDFORM.
FORM frm_changed_date USING p_e_onf4 TYPE char01
p_e_onf4_before TYPE char01
p_e_onf4_after TYPE char01
p_e_ucomm TYPE sy-ucomm
CHANGING p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol.
ENDFORM.
FORM frm_changed_finished USING p_e_modified TYPE char01
p_et_good_cells TYPE lvc_t_modi.
ENDFORM.
FORM frm_set_exclude USING p_tables TYPE ui_functions."隐藏标准工具栏按钮
DATA ls_exclude TYPE ui_func.
REFRESH p_tables.
DEFINE set_exclude.
ls_exclude = &1.
append ls_exclude to p_tables.
END-OF-DEFINITION.
set_exclude:
cl_gui_alv_grid=>mc_mb_sum,
cl_gui_alv_grid=>mc_fc_view_grid,
cl_gui_alv_grid=>mc_mb_view,
cl_gui_alv_grid=>mc_mb_subtot,
cl_gui_alv_grid=>mc_fc_print_back,
cl_gui_alv_grid=>mc_fc_graph,
cl_gui_alv_grid=>mc_fc_count,
cl_gui_alv_grid=>mc_fc_detail,
cl_gui_alv_grid=>mc_fc_info,
cl_gui_alv_grid=>mc_fc_loc_append_row,
cl_gui_alv_grid=>mc_fc_loc_copy,
cl_gui_alv_grid=>mc_fc_loc_copy_row,
cl_gui_alv_grid=>mc_fc_loc_cut,
cl_gui_alv_grid=>mc_fc_loc_insert_row,
cl_gui_alv_grid=>mc_fc_loc_delete_row,
cl_gui_alv_grid=>mc_fc_loc_move_row,
cl_gui_alv_grid=>mc_fc_loc_paste,
cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
ENDFORM.
FORM frm_author_set_exclude USING p_tables TYPE ui_functions.
DATA ls_exclude TYPE ui_func.
REFRESH p_tables.
DEFINE set_exclude.
ls_exclude = &1.
append ls_exclude to p_tables.
END-OF-DEFINITION.
set_exclude:
cl_gui_alv_grid=>mc_fc_view_grid,
cl_gui_alv_grid=>mc_mb_view,
cl_gui_alv_grid=>mc_fc_count,
cl_gui_alv_grid=>mc_fc_maximum,
cl_gui_alv_grid=>mc_fc_minimum,
cl_gui_alv_grid=>mc_fc_sum,
cl_gui_alv_grid=>mc_mb_sum,
cl_gui_alv_grid=>mc_fc_average,
cl_gui_alv_grid=>mc_mb_subtot,
cl_gui_alv_grid=>mc_fc_print_back,
cl_gui_alv_grid=>mc_fc_graph,
cl_gui_alv_grid=>mc_fc_count,
cl_gui_alv_grid=>mc_fc_detail,
cl_gui_alv_grid=>mc_fc_info,
cl_gui_alv_grid=>mc_fc_loc_append_row,
cl_gui_alv_grid=>mc_fc_loc_copy,
cl_gui_alv_grid=>mc_fc_loc_copy_row,
cl_gui_alv_grid=>mc_fc_loc_cut,
cl_gui_alv_grid=>mc_fc_loc_insert_row,
cl_gui_alv_grid=>mc_fc_loc_delete_row,
cl_gui_alv_grid=>mc_fc_loc_move_row,
cl_gui_alv_grid=>mc_fc_loc_paste,
cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
ENDFORM.
* 三级组织ALV显示部分取数逻辑
FORM frm_get_data_3.
ENDFORM.
FORM frm_bname.
ENDFORM.
* 二级组织ALV主体
FORM frm_kostl_alv .
DATA: l_field TYPE lvc_fname,
lt_f4 TYPE lvc_t_f4,
ls_f4 TYPE lvc_s_f4.
DATA:it_exclude TYPE ui_functions.
IF gv_kostl_fill <> 'X'.
CREATE OBJECT go_kostl_grid
EXPORTING
i_parent = go_kostl_cc.
* 获取二级组织ALV显示部分数据
PERFORM frm_get_data_2.
PERFORM frm_nocan_change USING '2'.
* 隐藏标准按钮
PERFORM frm_set_exclude USING it_exclude. " 屏幕部分标准按钮(设置不需显示的标准按钮).
* 创建Field Catalog
PERFORM frm_kostl_build_fcat_list.
gs_kostl_layout-sel_mode = 'A'. "允许行选择
gs_kostl_layout-box_fname = 'ZINDEX'.
gs_kostl_layout-grid_title = '二级组织'.
gs_kostl_layout-stylefname = 'FIELDSTYLE'.
* 保存格式
CLEAR gs_kostl_disvariant.
gs_kostl_disvariant-report = sy-repid.
gs_kostl_disvariant-handle = '9000'.
gs_kostl_disvariant-username = sy-uname.
* 注册事件
SET HANDLER cl_kostl_event_handler=>handle_double_click FOR go_kostl_grid.
SET HANDLER cl_kostl_event_handler=>handle_toolbar FOR go_kostl_grid.
SET HANDLER cl_kostl_event_handler=>handle_user_command FOR go_kostl_grid.
SET HANDLER cl_kostl_event_handler=>handle_hotspot_click FOR go_kostl_grid.
SET HANDLER cl_kostl_event_handler=>handle_data_changed FOR go_kostl_grid.
SET HANDLER cl_kostl_event_handler=>handle_data_changed_finished FOR go_kostl_grid.
CALL METHOD go_kostl_grid->register_edit_event "注册更新事件 移动光标就 触发 changed 事件
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified .
SORT gt_tab2 BY zreq DESCENDING.
* 第一次显示ALV
go_kostl_grid->set_table_for_first_display(
EXPORTING
is_variant = gs_kostl_disvariant
i_save = 'U'
is_layout = gs_kostl_layout
it_toolbar_excluding = it_exclude
CHANGING
it_fieldcatalog = gt_kostl_fcat
it_outtab = gt_tab2 ).
gv_kostl_refr = gv_kostl_fill = abap_true.
ELSE.
go_kostl_grid->refresh_table_display( ).
gv_kostl_refr = abap_true.
* 设置选中行
IF gt_kostl_selected_row IS NOT INITIAL.
go_kostl_grid->set_selected_rows(
EXPORTING
it_index_rows = gt_kostl_selected_row ).
ENDIF.
* 设置位置
IF gs_kostl_scroll_row IS NOT INITIAL
OR gs_kostl_scroll_col IS NOT INITIAL.
go_kostl_grid->set_scroll_info_via_id(
EXPORTING
is_row_no = gs_kostl_scroll_row
is_col_info = gs_kostl_scroll_col ).
ENDIF.
ENDIF.
ENDFORM.
FORM frm_kostl_build_toolbar_ex .
ENDFORM.
* 二级组织显示界面字段设置
FORM frm_kostl_build_fcat_list .
DATA:l_tab TYPE dd02l-tabname.
CLEAR gt_kostl_fcat[].
gv_col_pos = 0.
PERFORM frm_fcat_field USING 'ZREQ' '申请单号' 'ZREQ' 'ZFZTORG01' 10 '' '' CHANGING gt_kostl_fcat.
PERFORM frm_fcat_field USING 'VERAK' '需求人姓名' 'PERNR' 'ZFZTORG01' 10 '' 'X' CHANGING gt_kostl_fcat.
ENDFORM.
* 二级组织ALV界面显示数据取值逻辑
FORM frm_get_data_2.
ENDFORM.
FORM frm_nocan_change USING p_sign TYPE i.
DATA:lt_edit TYPE STANDARD TABLE OF lvc_s_styl,
ls_edit TYPE lvc_s_styl.
IF p_sign = '2'.
LOOP AT gt_tab2 INTO gw_tab2 WHERE bjsign = 'X'.
CLEAR gw_tab2-fieldstyle.
CLEAR: ls_edit,lt_edit.
ls_edit-fieldname = 'BNAME'.
ls_edit-style = cl_gui_alv_grid=>mc_style_disabled.
APPEND ls_edit TO lt_edit.
CLEAR: ls_edit.
ls_edit-fieldname = 'VKORG'.
ls_edit-style = cl_gui_alv_grid=>mc_style_disabled.
APPEND ls_edit TO lt_edit.
INSERT LINES OF lt_edit INTO TABLE gw_tab2-fieldstyle.
CLEAR gw_tab2-bjsign.
MODIFY gt_tab2 FROM gw_tab2.
ENDLOOP.
ENDIF.
IF p_sign = '3'.
ENDIF.
ENDFORM.
下面为 PAI代码
。
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'EXIT'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
MODULE user_command_0200 INPUT.
CASE sy-ucomm.
WHEN 'EXIT' OR 'FANHUI'.
LEAVE TO SCREEN 0.
WHEN 'TIJIAO'.
PERFORM frm_bname.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
标准程序界面屏幕增强显示OOALV
TOP程序内关于类定义
*有关放货盖章部分定义
DATA: gt_ztfxsd45 TYPE TABLE OF ztfxsd45.
DATA: gv_col_pos TYPE i.
DATA: gs_toolbar TYPE stb_button. "自定义工具栏按钮
*----------------------------------------------------------------------*
* CLASS cl_event_handle DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_event_handle DEFINITION. "定义事件处理类
PUBLIC SECTION.
"初始化ALV工具栏对象事件,如增加按钮并设定属性
METHODS handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive.
"ALV工具栏按钮的点击事件
METHODS handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
"数据变更触发事件
METHODS 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.
ENDCLASS. "cl_event_handle DEFINITION
*----------------------------------------------------------------------*
* CLASS cl_event_handle IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_event_handle IMPLEMENTATION."事件处理类实现部分
METHOD handle_toolbar.
* gs_toolbar-function = 'BUT_ADD'."按钮的FunctionCode
* gs_toolbar-icon = icon_change."按钮图标
* gs_toolbar-text = '新增数据'."按钮标签
* gs_toolbar-butn_type = '0'."定义按钮类型,0为标准按钮,具体取值可参考这里
* APPEND gs_toolbar TO e_object->mt_toolbar."添加按钮到工具栏中
*
gs_toolbar-function = 'BUT_SAVE'.
gs_toolbar-icon = icon_system_save.
gs_toolbar-text = '保存数据'.
gs_toolbar-butn_type = '0'.
APPEND gs_toolbar TO e_object->mt_toolbar.
ENDMETHOD. "handle_toolbar
METHOD handle_user_command.
DATA: ls_ztfxsd45 TYPE ztfxsd45.
DATA: l_sign TYPE c.
IF e_ucomm = 'BUT_SAVE'.
CLEAR l_sign.
LOOP AT gt_ztfxsd45 INTO ls_ztfxsd45.
IF ls_ztfxsd45-zvbeln_fs IS NOT INITIAL.
SELECT SUM( kwmeng ) FROM vbap
INTO ls_ztfxsd45-kwmeng
WHERE vbeln = ls_ztfxsd45-zvbeln_fs.
IF sy-subrc <> 0.
l_sign = 'X'.
ENDIF.
SELECT SINGLE gzdat FROM ztfzdzqz03
INTO ls_ztfxsd45-erdat
WHERE gz_status = 'C'
AND zvbeln = ls_ztfxsd45-zvbeln_fs.
IF sy-subrc <> 0.
l_sign = 'X'.
ENDIF.
MODIFY gt_ztfxsd45 FROM ls_ztfxsd45.
ENDIF.
ENDLOOP.
EXPORT itab = gt_ztfxsd45 TO MEMORY ID sy-uname.
IF sy-subrc = 0 AND l_sign <> 'X'.
MESSAGE '放货盖章记录保存成功' TYPE 'S'.
ELSE.
MESSAGE '放货盖章记录数据错误' TYPE 'I'.
ENDIF.
ENDIF.
ENDMETHOD. "handle_user_command
METHOD handle_data_changed.
FIELD-SYMBOLS: <lfs_sd> TYPE STANDARD TABLE,
<lfs_line> LIKE LINE OF gt_ztfxsd45.
DATA: l_modcell TYPE lvc_s_modi,
l_cell TYPE lvc_s_modi,
t_modcell TYPE lvc_t_modi.
IF er_data_changed->mp_mod_rows IS NOT INITIAL .
ASSIGN er_data_changed->mp_mod_rows->* TO <lfs_sd>.
t_modcell = er_data_changed->mt_mod_cells.
SORT t_modcell BY row_id fieldname.
READ TABLE t_modcell INTO l_cell INDEX 1.
LOOP AT <lfs_sd> ASSIGNING <lfs_line>.
IF <lfs_line>-zvbeln_fs IS NOT INITIAL.
SELECT SUM( kwmeng ) FROM vbap
INTO <lfs_line>-kwmeng
WHERE vbeln = <lfs_line>-zvbeln_fs.
IF sy-subrc = 0.
CALL METHOD er_data_changed->modify_cell
EXPORTING
i_row_id = l_cell-row_id
i_fieldname = 'KWMENG'
i_value = <lfs_line>-kwmeng.
ENDIF.
SELECT SINGLE gzdat FROM ztfzdzqz03
INTO <lfs_line>-erdat
WHERE gz_status = 'C'
AND zvbeln = <lfs_line>-zvbeln_fs.
IF sy-subrc = 0.
CALL METHOD er_data_changed->modify_cell
EXPORTING
i_row_id = l_cell-row_id
i_fieldname = 'ERDAT'
i_value = <lfs_line>-erdat.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ENDMETHOD. "handle_data_changed
ENDCLASS. "cl_event_handle IMPLEMENTATION
DATA: event_handle TYPE REF TO cl_event_handle."定义类对象的引用
PBO程序
MODULE ztfxsd45_pbo OUTPUT.
DATA: ls_xlips TYPE lipsvb,
ls_ekko TYPE ekko,
ls_ztgtm38 TYPE ztgtm38.
DATA: l_sign TYPE c.
CLEAR l_sign.
READ TABLE gt_xlips INTO ls_xlips INDEX 1.
IF sy-subrc = 0.
ENDIF.
SELECT SINGLE * FROM ekko
INTO CORRESPONDING FIELDS OF ls_ekko
WHERE ebeln = ls_xlips-vgbel.
IF sy-subrc = 0.
SELECT SINGLE * FROM ztgtm38
INTO CORRESPONDING FIELDS OF ls_ztgtm38
WHERE bukrs = ls_ekko-bukrs
AND ekorg = ls_ekko-ekorg.
IF sy-subrc = 0.
l_sign = 'X'.
ENDIF.
ENDIF.
"动态显示
LOOP AT SCREEN.
IF screen-group1 EQ 'FGZ' AND l_sign <> 'X'.
screen-active = 0. " 0 隐藏,1 显示
ELSE.
screen-active = 1.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
"ALV显示
IF l_sign = 'X'.
DATA: l_grid_r TYPE REF TO cl_gui_alv_grid ,
l_con_r TYPE REF TO cl_gui_custom_container.
DATA: l_fieldcat TYPE lvc_t_fcat.
DATA: l_layout TYPE lvc_s_layo.
IF l_con_r IS INITIAL.
"创建ALV容器对象
CREATE OBJECT l_con_r
EXPORTING
container_name = 'ZTFXSD45_ALV'.
"创建ALV控件
CREATE OBJECT l_grid_r
EXPORTING
i_parent = l_con_r.
"配置l_fieldcat
PERFORM frm_build_fcat_list.
"数据初始化
IF gt_ztfxsd45 IS INITIAL.
SELECT * FROM ztfxsd45
INTO CORRESPONDING FIELDS OF TABLE gt_ztfxsd45.
ENDIF.
"ALV显示
CALL METHOD l_grid_r->set_table_for_first_display
EXPORTING
i_structure_name = 'ZTFXSD45'
is_layout = l_layout
i_save = 'X'"可以保存变式
CHANGING
it_outtab = gt_ztfxsd45[]
it_fieldcatalog = l_fieldcat[]."如果fieldcat内表为空,则相当于没有配置,采用默认方式显示
* 设置enter事件
CALL METHOD l_grid_r->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
CREATE OBJECT :event_handle.
* "为ALV按钮注册监听事件
SET HANDLER :event_handle->handle_toolbar FOR l_grid_r,
event_handle->handle_user_command FOR l_grid_r,
event_handle->handle_data_changed FOR l_grid_r.
"调用此方法才能激活工具栏上增加的自定义按钮
CALL METHOD l_grid_r->set_toolbar_interactive.
ELSE.
CALL METHOD l_grid_r->refresh_table_display.
ENDIF.
ENDIF.
ENDMODULE.