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

来源:互联网 发布:做淘宝主图用什么软件 编辑:程序博客网 时间:2024/06/07 13:16

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

一边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.

原创粉丝点击