FMALV的框架和部分功能
时间:2023-07-14 23:37:00
下面为 主程序代码
。
TABLES: zfztorg01. SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001. SELECT-OPTIONS: s_bukrs FOR zfztorg01-bukrs OBLIGATORY. SELECTION-SCREEN END OF BLOCK b1 . INCLUDE zfxorg0007_top. INCLUDE zfxorg0007_frm. AT SELECTION-SCREEN. " 权限检查 PERFORM frm_authority_check. START-OF-SELECTION. "获取数据 PERFORM frm_get_data. "显示列名内表设置 PERFORM frm_set_fieldcat. "数据展示 PERFORM frm_display.
下面为 TOP内的定义
。
TYPES: BEGIN OF ty_data, zindex TYPE c. "选中标识 INCLUDE TYPE zfztorg01. TYPES: zzt TYPE zfztorg01-status, butxt TYPE t001-butxt, f_style TYPE lvc_t_styl. TYPES: END OF ty_data. DATA: gt_author TYPE TABLE OF ty_data, gw_author TYPE ty_data, gt_events TYPE slis_t_event WITH HEADER LINE, gi_layout_lvc TYPE lvc_s_layo, gt_fieldcat TYPE lvc_t_fcat, gs_fieldcat LIKE LINE OF gt_fieldcat.
下面为 FRM内的定义
。
FORM frm_authority_check. "权限检查 ENDFORM. FORM frm_get_data. "获取数据 ENDFORM. FORM frm_display. "数据展示 * 事件 DATA l_events TYPE LINE OF slis_t_event. l_events-name = slis_ev_data_changed. l_events-form = 'FRM_REFRESH_DATA'. APPEND l_events TO gt_events. * 全局格式布局 DATA: l_grid_settings TYPE lvc_s_glay. gi_layout_lvc-zebra = 'X' . " 使ALV界面呈现颜色交替 gi_layout_lvc-sel_mode = 'B' . " 选择模式 gi_layout_lvc-box_fname = 'ZINDEX'. "标记选项 gi_layout_lvc-cwidth_opt = 'X' . " 列宽自动优化 gi_layout_lvc-detailinit = 'X' . " 屏幕是否有细节 gi_layout_lvc-detailtitl = 详细内容. " 细节屏幕标题 gi_layout_lvc-totals_bef = 'X'. " 个别记录前的总输出 gi_layout_lvc-edit = 'X'. "可编辑 gi_layout_lvc-stylefname = 'F_STYLE'. "可编辑字段设置 l_grid_settings-edt_cll_cb = 'X'. "可编辑重置 PERFORM frm_no_change."不可编辑的字段设置 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid i_callback_pf_status_set = 'FRM_SET_STATUS' i_callback_user_command = 'FRM_COMMAND' i_grid_settings = l_grid_settings is_layout_lvc = gi_layout_lvc it_fieldcat_lvc = gt_fieldcat it_events = gt_events[] i_save = 'A' TABLES t_outtab = gt_author EXCEPTIONS program_error = 1 OTHERS = 2. ENDFORM. FORM frm_set_status USING p_extab TYPE slis_t_extab ."工具栏 SET PF-STATUS 'ZRA601'. ENDFORM. FORM frm_command USING p_ucomm TYPE sy-ucomm p_selfield TYPE slis_selfield."按钮功能 DATA: g_alv TYPE REF TO cl_gui_alv_grid. DATA: ls_tab TYPE lvc_s_stbl. ls_tab-row = 'X'. ls_tab-col = 'X'. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' "获取当前的ALV, IMPORTING e_grid = g_alv. CALL METHOD g_alv->check_changed_data. CASE p_ucomm. WHEN 'ADD'."新增 PERFORM frm_add_data. p_selfield-refresh = 'X'. ENDCASE. ENDFORM. FORM frm_add_data. "在第一行插入一条空白线,若在末尾使用APPEND INSERT INITIAL LINE INTO gt_author INDEX 1. "复制初始值,更新内表,调整可编辑单元格 LOOP AT gt_author INTO gw_author. MODIFY gt_author FROM gw_author. PERFORM frm_can_change. EXIT. ENDLOOP. ENDFORM. FORM frm_set_fieldcat . "显示列名内表设置 CLEAR gt_fieldcat[]. PERFORM frm_add_fieldcat USING 'ZZT' '状态' '' 8 '' '' ''. PERFORM frm_add_fieldcat USING 'BUTXT' '名称' '' 8 '' '' ''. ENDFORM. FORM frm_add_fieldcat USING p_name TYPE c p_text TYPE c p_key TYPE c p_lenth TYPE i p_edit TYPE c p_rftab TYPE lvc_s_fcat-ref_table p_rfname TYPE lvc_s_fcat-ref_field. CLEAR gs_fieldcat. gs_fieldcat-fieldname = p_name. gs_fieldcat-scrtext_l = p_text. gs_fieldcat-key = p_key. gs_fieldcat-outputlen = p_lenth. gs_fieldcat-edit = p_edit. gs_fieldcat-ref_table = p_rftab. gs_fieldcat-ref_field = p_rfname. IF gs_fieldcat-fieldname = 'ZEDIT'. gs_fieldcat-f4availabl = 'X'. "搜索帮助 ENDIF. IF gs_fieldcat-fieldname = 'ORGST'. gs_fieldcat-checkbox = 'X'. "复选框 ENDIF. APPEND gs_fieldcat TO gt_fieldcat. ENDFORM. FORM frm_refresh_data USING uo_data_changed TYPE REF TO cl_alv_changed_data_protocol. "单元格编辑监控事件 FIEL-SYMBOLS: TYPE STANDARD TABLE,
TYPE STANDARD TABLE,
TYPE lvc_s_modi,
TYPE ty_data.
IF uo_data_changed->mp_mod_rows IS NOT INITIAL.
ASSIGN uo_data_changed->mp_mod_rows->* TO .
ASSIGN uo_data_changed->mt_mod_cells TO .
LOOP AT ASSIGNING .
*--> 数据合法校验
IF sy-subrc <> 0.
MESSAGE '请输入有效的公司代码!' TYPE 'E'.
ENDIF.
*--> 不可编辑单元格关联更新
"更新到ALV界面
CALL METHOD uo_data_changed->modify_cell
EXPORTING
i_row_id = -row_id
i_fieldname = 'BNAME'
i_value = -bname.
ENDLOOP.
ENDIF.
ENDFORM.
FORM frm_can_change. "新增修改时调用,部分字段可编辑
DATA stylelin TYPE lvc_s_styl.
LOOP AT gt_author INTO gw_author WHERE zindex = 'X'.
CLEAR :gw_author-f_style[].
CLEAR stylelin.
stylelin-fieldname = 'BNAME'.
stylelin-style = cl_gui_alv_grid=>mc_style_disabled.
APPEND stylelin TO gw_author-f_style.
CLEAR stylelin.
stylelin-fieldname = 'BUKRS'. " 需要编辑的列名
stylelin-style = cl_gui_alv_grid=>mc_style_enabled. " 设置为不可编辑状态 "mc_style_enabled. 设置可编辑状态
APPEND stylelin TO gw_author-f_style.
CLEAR gw_author-zindex.
MODIFY gt_author FROM gw_author.
ENDLOOP.
ENDFORM.
FORM frm_no_change. "初始化和保存后全单元格不可编辑
DATA stylelin TYPE lvc_s_styl.
LOOP AT gt_author INTO gw_author.
CLEAR :gw_author-f_style[].
CLEAR stylelin.
stylelin-fieldname = 'BNAME'.
stylelin-style = cl_gui_alv_grid=>mc_style_disabled.
APPEND stylelin TO gw_author-f_style.
CLEAR stylelin.
stylelin-fieldname = 'BUKRS'.
stylelin-style = cl_gui_alv_grid=>mc_style_disabled.
APPEND stylelin TO gw_author-f_style.
MODIFY gt_author FROM gw_author.
ENDLOOP.
ENDFORM.