You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ALV Grid中非编辑字段BUKRS因F4值帮助被修改的问题咨询

解决方案:ALV中阻止BUKRS因SAKNR搜索帮助被修改

针对你遇到的问题,提供两种无需自定义搜索帮助的解决方法:

方法1:阻止非编辑字段(BUKRS)被修改

利用ALV的DATA_CHANGED事件,在数据变更后校验并恢复BUKRS的原始值:

  1. 定义事件处理类并实现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.
  1. 在原代码中注册事件并绑定处理类:
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设为固定只读值:

  1. 定义事件处理类并实现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.
  1. 在原代码中注册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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:07:41