如何总结RPGLE中的数据结构子字段

时间:2018-09-25 06:58:30

标签: ibm-midrange rpgle

今天,我阅读了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),我试图获得一个子部分。但这也失败了,因为“值”不是字段组。

对此有什么解决办法吗?

2 个答案:

答案 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