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