为何ALV不对EXT_ID执行值表检查与匹配码调用?
问题描述
我创建了自定义表ZEXT_ATT,包含以下5个字段:
MANDT: 数据元素MANDTVBELN: 数据元素VBELN_VAPOSNR: 数据元素POSNR_VAEXT_ID: 自定义数据元素VALUE: 自定义数据元素
已为字段设置外键(均勾选「必须检查」,外键基数为「关键字段/候选字段」和1:CN):
VBELN关联标准表VBAKPOSNR关联标准表VBAPEXT_ID关联仅含MANDT与EXT_ID关键字段的自定义值表
异常现象
在ALV网格中操作该表时:
VBELN和POSNR正常显示值帮助,输入内容会触发值表校验;EXT_ID既无值帮助按钮,输入内容也不会触发校验。
已尝试的无效操作
- 在
EXT_ID的域上配置了对应的值表; - 为
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
相关产品推荐
相关产品推荐

