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

为何ALV不对EXT_ID执行值表检查与匹配码调用?

问题描述

我创建了自定义表ZEXT_ATT,包含以下5个字段:

  • MANDT: 数据元素MANDT
  • VBELN: 数据元素VBELN_VA
  • POSNR: 数据元素POSNR_VA
  • EXT_ID: 自定义数据元素
  • VALUE: 自定义数据元素

已为字段设置外键(均勾选「必须检查」,外键基数为「关键字段/候选字段」和1:CN):

  • VBELN关联标准表VBAK
  • POSNR关联标准表VBAP
  • EXT_ID关联仅含MANDT与EXT_ID关键字段的自定义值表

异常现象

在ALV网格中操作该表时:

  • VBELN和POSNR正常显示值帮助,输入内容会触发值表校验;
  • EXT_ID既无值帮助按钮,输入内容也不会触发校验。

已尝试的无效操作

  1. 在EXT_ID的域上配置了对应的值表;
  2. 为EXT_ID创建自定义值帮助并分配给表字段。

对比验证

表维护视图中EXT_ID完全正常(有匹配码、输入会校验),说明DDIC对象定义没问题,怀疑是ALV的问题?

所用ALV实例化代码

go_alv = new cl_gui_alv_grid(
  i_parent                = cl_gui_custom_container=>default_screen
).

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
  EXPORTING
    i_structure_name       = 'ZEXT_ATT'
  CHANGING
    ct_fieldcat            = lt_fieldcat
  EXCEPTIONS
    inconsistent_interface = 1
    program_error          = 2
    others                 = 3
.

go_alv->register_edit_event(
  EXPORTING
    i_event_id = cl_gui_alv_grid=>mc_evt_enter
  EXCEPTIONS
    error      = 1
    others     = 2
).

insert cl_gui_alv_grid=>mc_fc_pc_file         into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_views           into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_info            into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_print           into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_subtot          into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_sum             into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_find            into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_find_more       into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_call_xml_export into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_call_report     into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_pc_file         into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_send            into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_data_save       into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_send            into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_to_office       into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_views           into table lt_exclude.
insert cl_gui_alv_grid=>mc_fc_html            into table lt_exclude.

go_alv->set_table_for_first_display(
  EXPORTING
    is_layout                     = ls_layout
    it_toolbar_excluding          = lt_exclude
  CHANGING
    it_outtab                     = gt_ext_attr
    it_fieldcatalog               = lt_fieldcat
  EXCEPTIONS
    invalid_parameter_combination = 1
    program_error                 = 2
    too_many_lines                = 3
    others                        = 4
).
IF SY-SUBRC <> 0.
ENDIF.

解决方案

这不是ALV的bug,核心原因是LVC_FIELDCATALOG_MERGE函数生成字段目录时,会自动识别SAP标准表关联字段的DDIC校验/值帮助配置,但对自定义值表的关联信息不会自动完整读取,必须手动补充字段目录属性:

1. 手动补充字段目录的校验与值帮助属性

在调用set_table_for_first_display之前,找到EXT_ID对应的字段目录行,设置以下参数:

LOOP AT lt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fieldcat>) WHERE fieldname = 'EXT_ID'.
  " 指定关联的自定义值表
  <fs_fieldcat>-checktable = 'Z你的自定义值表名'. 
  <fs_fieldcat>-ref_table = 'Z你的自定义值表名'.
  <fs_fieldcat>-ref_field = 'EXT_ID'.
  " 启用输入校验
  <fs_fieldcat>-valex_flag = 'X'. 
  " 显示值帮助按钮(2为匹配码按钮,1为下拉列表,按需选择)
  <fs_fieldcat>-dropdown = '2'. 
ENDLOOP.

2. (可选)自定义值帮助逻辑

如果你的值帮助需要复杂筛选逻辑,可注册ALV的ONF4事件并实现处理方法:

SET HANDLER zcl_your_handler=>on_f4 FOR go_alv.

在处理方法中调用F4IF_INT_TABLE_VALUE_REQUEST等函数,自定义值选择窗口的内容与逻辑。

3. 校验触发说明

你已注册mc_evt_enter事件,当valex_flag设为X后,用户输入内容按回车时,ALV会自动调用DDIC的外键校验逻辑,和表维护视图的校验行为一致。


内容的提问来源于stack exchange,提问作者Cutter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:25:35