ALV Grid中非编辑字段BUKRS因F4值帮助被修改的问题咨询
解决方案:ALV中阻止BUKRS因SAKNR搜索帮助被修改
针对你遇到的问题,提供两种无需自定义搜索帮助的解决方法:
方法1:阻止非编辑字段(BUKRS)被修改
利用ALV的DATA_CHANGED事件,在数据变更后校验并恢复BUKRS的原始值:
- 定义事件处理类并实现
DATA_CHANGED方法:
CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid IMPORTING er_data_changed. ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION. METHOD handle_data_changed. DATA: ls_modified TYPE lvc_s_modi. LOOP AT er_data_changed->mt_modified INTO ls_modified WHERE fieldname = 'BUKRS'. " 恢复BUKRS的原始值 er_data_changed->restore_cell_value( EXPORTING i_row_id = ls_modified-row_id i_fieldname = ls_modified-fieldname ). " 标记该修改无效 er_data_changed->add_protocol_entry( EXPORTING i_msgid = '00' i_msgno = '001' i_msgty = 'E' i_row_id = ls_modified-row_id i_fieldname = ls_modified-fieldname ). ENDLOOP. ENDMETHOD. ENDCLASS.
- 在原代码中注册事件并绑定处理类:
DATA: lt_fcat TYPE lvc_t_fcat. CALL FUNCTION 'LVC_FIELDCATALOG_MERGE' EXPORTING i_structure_name = 'ZTEST_SAKNR' CHANGING ct_fieldcat = lt_fcat EXCEPTIONS inconsistent_interface = 1 program_error = 2 others = 3. lt_fcat[ fieldname = 'SAKNR' ]-edit = abap_true. lt_fcat[ fieldname = 'BUKRS' ]-edit = abap_false. " 明确设置不可编辑 DATA(lo_alv) = NEW cl_gui_alv_grid( i_parent = cl_gui_container=>default_screen ). " 注册DATA_CHANGED事件 DATA(lo_event_handler) = NEW lcl_event_handler( ). SET HANDLER lo_event_handler->handle_data_changed FOR lo_alv. DATA: lt_test TYPE TABLE OF ztest_saknr. SELECT * FROM SKB1 INTO CORRESPONDING FIELDS OF TABLE @lt_test. lo_alv->set_table_for_first_display( CHANGING it_outtab = lt_test it_fieldcatalog = lt_fcat EXCEPTIONS invalid_parameter_combination = 1 program_error = 2 too_many_lines = 3 others = 4 ). CALL SCREEN 1000.
方法2:在SAKNR的F4搜索帮助中固定BUKRS为当前行值(置灰不可修改)
通过ALV的F4_EVENT事件,动态修改搜索帮助的参数属性,将BUKRS设为固定只读值:
- 定义事件处理类并实现
F4_EVENT方法:
CLASS lcl_f4_handler DEFINITION. PUBLIC SECTION. METHODS handle_f4_event FOR EVENT f4 OF cl_gui_alv_grid IMPORTING e_fieldname e_row_id es_row_no er_event_data et_bad_cells. ENDCLASS. CLASS lcl_f4_handler IMPLEMENTATION. METHOD handle_f4_event. DATA: ls_row TYPE ztest_saknr, ls_f4_param TYPE shlp_selopt, lt_f4_params TYPE shlp_t_selopt. IF e_fieldname = 'SAKNR'. " 获取当前行的BUKRS值 CALL METHOD lo_alv->get_current_cell IMPORTING es_row_no = es_row_no. READ TABLE lt_test INTO ls_row INDEX es_row_no-row_id. " 设置BUKRS为固定搜索参数,不可修改 ls_f4_param-shlpname = 'SKB1'. ls_f4_param-shlpfield = 'BUKRS'. ls_f4_param-sign = 'I'. ls_f4_param-option = 'EQ'. ls_f4_param-low = ls_row-bukrs. ls_f4_param-value_org = 'S'. ls_f4_param-readonly = abap_true. " 置灰不可修改 APPEND ls_f4_param TO lt_f4_params. " 传递参数到搜索帮助 er_event_data->mv_shlpname = 'SKB1'. er_event_data->mt_selopt = lt_f4_params. er_event_data->mv_skip_default = abap_true. " 跳过默认搜索帮助逻辑 ENDIF. ENDMETHOD. ENDCLASS.
- 在原代码中注册
F4_EVENT事件:
" 注册F4_EVENT事件 DATA(lo_f4_handler) = NEW lcl_f4_handler( ). SET HANDLER lo_f4_handler->handle_f4_event FOR lo_alv.
注意事项
- 方法1是事后校验恢复,适合所有非编辑字段的保护;
- 方法2是事前限制搜索帮助的参数,更贴合“仅用BUKRS限制搜索范围”的需求;
- 确保
lt_test在事件处理类中可访问(可通过全局变量或类属性传递)。
内容的提问来源于stack exchange,提问作者Cutter
相关产品推荐
相关产品推荐

