ABAP-表中数据的横向累加

时间:2023-01-01 09:18:57

GLT0 等表中数据的横向累加 ——塞依SAP培训

 

在 ABAP 的 GLT0、FAGLFLEXT 等余额表中,用诸如 TSL01、TSL02 …… TSL16 等字段记录了 16 个期间的发生额,在对某个期间取当年累计的时候,如果用其它语言,一般需要创建一个 CASE ... WHEN ... ENDCASE 结构,按输入的期间值来累加,代码量比较大。不过在 ABAP 中就不必那么麻烦了,SAP 提供了一个方便的语法来完成这类计算。代码如下:

 PARAMETERS: prpmax LIKE GLT0-RPMAX.

DATA: GLT0VARY LIKE GLT0-TSL01.

SUMME = SUMME + GLT0-TSLVT.
DO prpmax TIMES VARYING GLT0VARY FROM GLT0-TSL01 NEXT GLT0-TSL02.
SUMME = SUMME + GLT0VARY.
ENDDO.

其中的关键在于 DO ... VARYING ... FROM ... NEXT 这个语法结构。其中的 prpmax 代表循环次数,也就是输入的区间,GLT0VARY 代表存储获得值的临时变量,FROM 后的 GLT0-TSL01 是循环的开始位置,GLT0-TSL02 是循环的第二个位置,从这两个字段的位置,就能获得每次取值的内存偏移。这样,DO 循环的过程就是,首先取 GLT0-TSL01 的值,放到 GLT0VARY 中,然后执行 SUMME 的累加;再根据 prpmax 的值循环指定次数,每次都按 GLT0-TSL01 的长度取相应的内存片段,放到 GLT0VARY 中,执行累加。因此,在这样的循环里,需要累加的字段必须连续且长度相同。下图表示了它的内存使用情况:

          --循环开始时从这个位置读取
          |     --第二次循环时从这个位置读取
          |     |     --....
          |     |     |   --最多循环 16 次,否则会读到其它内存位置,导致错误
          V     V     V   V
|---|-----|-----|-----|---|-----|---|
|...|TSLVT|TSL01|TSL02|...|TSL16|...|
|-----------------------------------|