今天,我阅读了Who knew you could do that
手册。我遇到了%XFoot BIF,它计算一个(数值)数组的总和。因此,我认为必须有一种方法可以汇总包含(例如)发票及其价值的数据结构数组的子字段。
要获取发票数据,我运行嵌入式SQL,它将来自数据库的数据存储在限定为dim(1000)的合格数据结构中。
我尝试%XFoot(invoiceDS:1:1000)
和%XFoot(invoiceDS(*).value:1:1000)
。它们都不编译,因为不允许将限定表达式用作%XFoot的参数。
然后,如果数据结构数组带有%SubArr(invoiceDS(*).value:1:1000)
,我试图获得一个子部分。但这也失败了,因为“值”不是字段组。
对此有什么解决办法吗?
答案 0 :(得分:1)
您无法使用DS进行此操作,%xfoot仅适用于数组。
但是,如果您有一些连续的数字字段(具有相同的长度和技巧),则可以使用指针
d $ptr_fields s * inz(%addr(first_field))
d ar_fields s like(first_field) dim(number_of_fields)
d based($ptr_fields)
然后您可以进行ar_fileds的%xfoot
但是在您的情况下,使用DS DIM(1000)...您必须执行LOOP,因为xfoot将一个数组求和(因此,数据“水平”,维DS是“垂直”。
LOOP:
total = *Zero ;
For count = 1 To 1000 ;
total += DsName(count).Field ;
EndFor ;
答案 1 :(得分:0)
知道了!
我只需要使用Do循环遍历数据结构数组,提取发票值,将其放入单独的数组中,然后在值数组上使用%XFoot
H DECEDIT('0,') DATEDIT(*DMY.) dftactgrp(*no)
H
D invoiceDS ds dim(10) qualified
D nbr 1 6s 0 inz(*zeros)
D value 7 14s 2 inz(*zeros)
D
D invoice_sum s 8s 0 inz(*zeros)
D values s 8s 0 inz(*zeros) dim(10)
D i s 5i 0 inz(*zeros)
D start s 4s 0 inz(4711)
D
C
C 1 do 10 i
C eval invoiceDS(i).nbr = start + i - 1
C eval invoiceDS(i).value = 100.00
C enddo
C
C eval i = 0
C 1 do 10 i
C eval values(i) = invoiceDS(i).value
C enddo
C eval invoice_sum = %xfoot(values)
C invoice_sum dsply
C
C move *on *inlr