如何为含INCLUDE STRUCTURE的自定义类型创建字段目录?
ABAP字段目录创建问题及解决方案
问题背景
已通过TYPES定义如下自定义类型:
TYPES: BEGIN OF ty_pers_bst. INCLUDE STRUCTURE zieb_pers_bst. TYPES: lifname TYPE zieb_lieferant-lifname, END OF ty_pers_bst. DATA: i_structure_bst_add TYPE ty_pers_bst.
尝试调用LVC_FIELDCATALOG_MERGE基于该类型创建字段目录时,触发“未找到字段目录”错误。需确认:是否有替代方法将单个字段追加到基于zieb_pers_bst的现有字段目录中,还是必须新建DDIC结构?
替代解决方案
不需要强制新建DDIC结构,以下两种方法可实现需求:
方法1:先基于DDIC结构生成字段目录,再手动追加字段
- 先调用
LVC_FIELDCATALOG_MERGE,传入DDIC结构ZIEB_PERS_BST生成初始字段目录:DATA: gt_fcat TYPE lvc_t_fcat. CALL FUNCTION 'LVC_FIELDCATALOG_MERGE' EXPORTING structure = 'ZIEB_PERS_BST' CHANGING fieldcatalog = gt_fcat EXCEPTIONS inconsistent_interface = 1 program_error = 2 OTHERS = 3. IF sy-subrc <> 0. " 异常处理逻辑 ENDIF. - 定义
LVC_S_FCAT类型工作区,填充新增字段lifname的属性:DATA: gs_fcat TYPE lvc_s_fcat. gs_fcat-fieldname = 'LIFNAME'. gs_fcat-ref_table = 'ZIEB_LIEFERANT'. gs_fcat-ref_field = 'LIFNAME'. gs_fcat-scrtext_m = '供应商名称'. " 可根据需求设置文本 gs_fcat-col_pos = lines( gt_fcat ) + 1. " 设置字段显示位置 " 可额外设置对齐方式、输出长度等属性 - 将工作区追加到字段目录内表:
APPEND gs_fcat TO gt_fcat.
方法2:通过元数据动态构建字段目录
利用ABAP运行时类型服务(RTTI)获取自定义类型的结构信息,手动生成完整字段目录:
DATA: gt_fcat TYPE lvc_t_fcat, go_struct_descr TYPE REF TO cl_abap_structdescr, gt_components TYPE abap_component_tab, gs_component TYPE abap_componentdescr. " 获取自定义类型的结构描述 go_struct_descr ?= cl_abap_typedescr=>describe_by_data( i_structure_bst_add ). gt_components = go_struct_descr->get_components( ). " 遍历组件构建字段目录 LOOP AT gt_components INTO gs_component. DATA(gs_fcat) = VALUE lvc_s_fcat( fieldname = gs_component-name ref_table = gs_component-type->get_relative_name( ) ref_field = gs_component-name scrtext_m = gs_component-name " 可替换为对应的文本,或通过DDIC读取 ). APPEND gs_fcat TO gt_fcat. ENDLOOP.
额外说明
如果该自定义类型需要在多个程序或场景中复用,新建DDIC结构会提升代码的可维护性;若仅为单次使用,上述两种动态方法更灵活高效。
内容的提问来源于stack exchange,提问作者SBECK1
相关产品推荐
相关产品推荐

