调用REUSE_ALV_FIELDCATALOG_MERGE遇CX_SY_READ_SRC_LINE_TOO_LONG错误求助
解决ALV报错「ABAP程序行宽超过内表宽度」的问题
嘿,我来帮你排查这个报错!从你的代码和描述来看,这个问题主要出在REUSE_ALV_FIELDCATALOG_MERGE的使用方式上,既然已经排除了行长度72的设置,那咱们从代码本身找原因:
问题根源
REUSE_ALV_FIELDCATALOG_MERGE生成字段目录时,需要依赖全局可见的结构类型,而不是你直接定义的内表变量。你代码里的gt_table是用DATA : BEGIN OF gt_table OCCURS 0...定义的全局内表,但函数的i_internal_tabname参数需要的是类型(TYPE)的名称,不是变量名。当你传入'gt_table'时,函数没法正确解析内表的结构,导致字段目录生成异常,进而引发行宽不匹配的错误。
两种可行的修复方案
方案一:改用全局类型定义内表
先定义一个全局的结构类型,再基于这个类型创建内表,这样函数就能正确识别结构了,代码修改如下:
TYPE-POOLS slis . TABLES : vbrk, vbrp. * 先定义全局结构类型 TYPES: BEGIN OF ty_table, vbeln LIKE vbrk-vbeln, waerk LIKE vbrk-waerk, kunag LIKE vbrk-kunag, fkart LIKE vbrk-fkart, fktyp LIKE vbrk-fktyp, vbtyp LIKE vbrk-vbtyp, vkorg LIKE vbrk-vkorg, vtweg LIKE vbrk-vtweg, fkdat LIKE vbrk-fkdat, posnr LIKE vbrp-posnr, vrkme LIKE vbrp-vrkme, matnr LIKE vbrp-matnr, werks LIKE vbrp-werks, fkimg LIKE vbrp-fkimg, ntgew LIKE vbrp-ntgew, brgew LIKE vbrp-brgew, gewei LIKE vbrp-gewei, brtwr LIKE vbrp-brtwr, name1 LIKE kna1-name1, END OF ty_table. * 基于全局类型创建内表 DATA : gt_table TYPE STANDARD TABLE OF ty_table, wa_table TYPE ty_table. SELECT-OPTIONS : so_vbeln FOR vbrk-vbeln, so_fkart FOR vbrk-fkart, so_fktyp FOR vbrk-fktyp, so_vbtyp FOR vbrk-vbtyp, so_vkorg FOR vbrk-vkorg, so_vtweg FOR vbrk-vtweg, so_fkdat FOR vbrk-fkdat, so_vrkme FOR vbrp-vrkme, so_matnr FOR vbrp-matnr, so_werks FOR vbrp-werks. DATA : i_fcat TYPE slis_t_fieldcat_alv . DATA : wa_fcat LIKE LINE OF i_fcat . START-OF-SELECTION . PERFORM get_data . PERFORM create_fcat_merge . END-OF-SELECTION . PERFORM disp_alv . FORM get_data . SELECT a~vbeln a~waerk a~kunag a~fkart a~fktyp a~vbtyp a~vkorg a~vtweg a~fkdat b~posnr b~vrkme b~matnr b~werks b~fkimg b~ntgew b~brgew b~gewei b~brtwr c~name1 INTO TABLE gt_table FROM vbrk AS a INNER JOIN vbrp AS b ON a~vbeln = b~vbeln INNER JOIN kna1 AS c ON c~kunnr = a~kunag WHERE a~vbeln IN so_vbeln AND a~fkart IN so_fkart AND a~fktyp IN so_fktyp AND a~vbtyp IN so_vbtyp AND a~vkorg IN so_vkorg AND a~vtweg IN so_vtweg AND a~fkdat IN so_fkdat AND b~vrkme IN so_vrkme AND b~matnr IN so_matnr AND b~werks IN so_werks. ENDFORM. FORM disp_alv . CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid it_fieldcat = i_fcat TABLES t_outtab = gt_table. ENDFORM. FORM create_fcat_merge . CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING i_program_name = sy-repid i_internal_tabname = 'TY_TABLE' " 这里传入全局类型的名称,不是内表变量名 i_inclname = sy-repid CHANGING ct_fieldcat = i_fcat. ENDFORM.
方案二:手动构建字段目录(更灵活可控)
如果你不想修改内表的定义方式,也可以手动逐个添加字段到字段目录,完全避免依赖函数的自动解析,示例代码如下:
FORM create_fcat_manual . CLEAR wa_fcat. wa_fcat-fieldname = 'VBELN'. wa_fcat-tabname = 'GT_TABLE'. wa_fcat-ref_table = 'VBRK'. wa_fcat-ref_field = 'VBELN'. wa_fcat-seltext_m = '销售凭证号'. " 可以手动设置字段描述 APPEND wa_fcat TO i_fcat. CLEAR wa_fcat. wa_fcat-fieldname = 'WAERK'. wa_fcat-tabname = 'GT_TABLE'. wa_fcat-ref_table = 'VBRK'. wa_fcat-ref_field = 'WAERK'. wa_fcat-seltext_m = '货币码'. APPEND wa_fcat TO i_fcat. " 按照这个格式,把gt_table里的所有字段都添加进去 " ... ENDFORM.
然后把原来的PERFORM create_fcat_merge替换成PERFORM create_fcat_manual就行。
额外提醒
- 不管用哪种方案,都要确保字段的数据类型、长度和内表中的定义完全匹配,避免出现字段长度不兼容的情况;
- 如果用自动生成字段目录的方式,一定要确认
i_internal_tabname传入的是全局类型名,不是内表变量名; - 检查内表中有没有类型异常的字段(比如自定义的复杂类型),这类字段也可能导致行宽计算错误。
内容的提问来源于stack exchange,提问作者shrgrl
相关产品推荐
相关产品推荐

