[ABAP] SELECT ... INTO CORRESPONDING FIELDS OF TABLE 的一个盲点

前阵子同事拿来一段财务报表的代码给我看,说是一个自由顾问写的,然后每当做的凭证项目金额完全一样的时候只会有一条会被统计进去,很不对。

一边debug一边看着,不禁兴叹那个顾问确实很有想法,竟然自己开发了一个财务版本的模板,即有了他那套东西,走到哪里财务报表都直接可以用他的,只需在版本里填充些需要的条目,而代码确实是一劳永逸的。感慨之余,也终于看到了错误的根源所在:


DATA: BEGIN OF I_BSEG OCCURS 0,
  BUKRS LIKE BKPF-BUKRS,
  BELNR LIKE BKPF-BELNR,
  GJAHR LIKE BKPF-GJAHR,
  SHKZG LIKE BSEG-SHKZG,
  DMBTR LIKE BSEG-DMBTR, "amount in Local currency
  LOKKT LIKE BSEG-LOKKT, "alternative account
  HKONT LIKE BSEG-HKONT,
  END OF I_BSEG.
……
SELECT BUKRS  BELNR GJAHR SHKZG DMBTR LOKKT HKONT
    INTO CORRESPONDING FIELDS OF TABLE I_BSEG
    FROM BSEG
     FOR ALL ENTRIES IN I_BKPF
   WHERE BUKRS = I_BKPF-BUKRS
     AND BELNR = I_BKPF-BELNR
     AND GJAHR = I_BKPF-GJAHR.

当代码中红色标出的那些field在两(多)个不同凭证中体现的值一样,即数据库表中两(多)条记录的这些field值一样,该处的这个SELECT用法只会取到一条记录。
修正方法的话,笔者此处想到两个,一个是在上面红色field后面加一个能区别不同记录的field,如行项目号BUZEI;另外一个方法就是老老实实按照常规的LOOP,代码如下:

LOOP AT I_BKPF.
  SELECT BUKRS BELNR GJAHR SHKZG DMBTR LOKKT HKONT
    FROM BSEG INTO I_BSEG
   WHERE BUKRS = I_BKPF-BUKRS
     AND BELNR = I_BKPF-BELNR
     AND GJAHR = I_BKPF-GJAHR.
  APPEND I_BSEG.
  ENDSELECT.
  ENDLOOP.

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值