ABAP代码使用FOR ALL ENTRIES后无输出,请求技术协助
ABAP代码问题排查与修正
核心问题分析
- 内表重复覆盖:所有SELECT语句都用
INTO TABLE IT_FINAL,每次查询都会清空并覆盖之前的数据,导致VBAK的原始数据被VBAP、KNA1等表的数据完全替换,后续关联逻辑彻底失效。 - FOR ALL ENTRIES使用错误:每次查询都以
IT_FINAL作为关联基准,但此时IT_FINAL已经被上一次查询覆盖,关联的字段值完全不符合预期。 - 循环逻辑混乱:循环内执行
MOVE-CORRESPONDING WA_FINAL TO WA_FINAL属于无效操作;多次READ TABLE会覆盖工作区数据,最后还将工作区追加回原内表,导致数据无限循环且关联逻辑完全错误。 - MAKT/TVAKT表缺少语言过滤:未指定
SPRAS = SY-LANGU,会返回所有语言的物料描述和凭证类型文本,可能拿到非当前登录语言的内容。
修正后的代码
TYPES: BEGIN OF ty_vbak, vbeln TYPE vbeln_va, erdat TYPE erdat, auart TYPE auart, kunnr TYPE kunnr, END OF ty_vbak, BEGIN OF ty_vbap, vbeln TYPE vbeln_va, posnr TYPE posnr_va, matnr TYPE matnr, kwmeng TYPE kwmeng, netpr TYPE netpr, END OF ty_vbap, BEGIN OF ty_kna1, kunnr TYPE kunnr, name1 TYPE name1_gp, END OF ty_kna1, BEGIN OF ty_tvakt, auart TYPE auart, bezei TYPE bezei, END OF ty_tvakt, BEGIN OF ty_makt, matnr TYPE matnr, maktx TYPE maktx, END OF ty_makt, BEGIN OF ty_final, vbeln TYPE vbeln_va, erdat TYPE erdat, auart TYPE auart, bezei TYPE bezei, posnr TYPE posnr_va, matnr TYPE matnr, kwmeng TYPE kwmeng, netpr TYPE netpr, kunnr TYPE kunnr, name1 TYPE name1_gp, maktx TYPE maktx, END OF ty_final. DATA: it_vbak TYPE STANDARD TABLE OF ty_vbak, wa_vbak TYPE ty_vbak, it_vbap TYPE STANDARD TABLE OF ty_vbap, wa_vbap TYPE ty_vbap, it_kna1 TYPE STANDARD TABLE OF ty_kna1, wa_kna1 TYPE ty_kna1, it_tvakt TYPE STANDARD TABLE OF ty_tvakt, wa_tvakt TYPE ty_tvakt, it_makt TYPE STANDARD TABLE OF ty_makt, wa_makt TYPE ty_makt, it_final TYPE STANDARD TABLE OF ty_final, wa_final TYPE ty_final. PARAMETERS: p_kunnr TYPE kunnr. * 1. 查询销售抬头数据 SELECT vbeln erdat auart kunnr FROM vbak INTO TABLE it_vbak WHERE kunnr = p_kunnr. IF sy-subrc = 0. * 2. 查询销售行项目数据 SELECT vbeln posnr matnr kwmeng netpr FROM vbap INTO TABLE it_vbap FOR ALL ENTRIES IN it_vbak WHERE vbeln = it_vbak-vbeln. * 3. 查询客户主数据 SELECT kunnr name1 FROM kna1 INTO TABLE it_kna1 FOR ALL ENTRIES IN it_vbak WHERE kunnr = it_vbak-kunnr. * 4. 查询销售凭证类型文本(过滤当前语言) SELECT auart bezei FROM tvakt INTO TABLE it_tvakt FOR ALL ENTRIES IN it_vbak WHERE auart = it_vbak-auart AND spras = sy-langu. * 5. 查询物料描述(过滤当前语言) SELECT matnr maktx FROM makt INTO TABLE it_makt FOR ALL ENTRIES IN it_vbap WHERE matnr = it_vbap-matnr AND spras = sy-langu. * 6. 关联所有数据到最终内表 LOOP AT it_vbak INTO wa_vbak. * 填充抬头字段 wa_final-vbeln = wa_vbak-vbeln. wa_final-erdat = wa_vbak-erdat. wa_final-auart = wa_vbak-auart. wa_final-kunnr = wa_vbak-kunnr. * 读取客户名称 READ TABLE it_kna1 INTO wa_kna1 WITH KEY kunnr = wa_vbak-kunnr. IF sy-subrc = 0. wa_final-name1 = wa_kna1-name1. ENDIF. * 读取凭证类型文本 READ TABLE it_tvakt INTO wa_tvakt WITH KEY auart = wa_vbak-auart. IF sy-subrc = 0. wa_final-bezei = wa_tvakt-bezei. ENDIF. * 循环行项目,关联物料描述 LOOP AT it_vbap INTO wa_vbap WHERE vbeln = wa_vbak-vbeln. wa_final-posnr = wa_vbap-posnr. wa_final-matnr = wa_vbap-matnr. wa_final-kwmeng = wa_vbap-kwmeng. wa_final-netpr = wa_vbap-netpr. * 读取物料描述 READ TABLE it_makt INTO wa_makt WITH KEY matnr = wa_vbap-matnr. IF sy-subrc = 0. wa_final-maktx = wa_makt-maktx. ENDIF. APPEND wa_final TO it_final. CLEAR wa_final. ENDLOOP. ENDLOOP. ENDIF. * 输出结果 cl_demo_output=>display( it_final ).
修正说明
- 为每个数据库表单独定义中间内表,避免数据覆盖问题。
- 按逻辑顺序依次查询各表数据,确保
FOR ALL ENTRIES的基准数据正确。 - 循环关联抬头和行项目数据,通过
READ TABLE匹配关联字段,填充最终内表。 - 为MAKT和TVAKT表添加当前语言过滤,保证文本描述符合登录语言。
内容的提问来源于stack exchange,提问作者Goparaju Sai
相关产品推荐
相关产品推荐

