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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:52:46