Как суммировать подполя структуры данных в RPGLE - PullRequest
0 голосов
/ 25 сентября 2018

Сегодня я прочитал руководство Who knew you could do that.Я столкнулся с BIF% XFoot, который вычисляет сумму (числового) массива.Поэтому я подумал, что должен быть способ суммировать подполя массива данных, который содержит (например) счета-фактуры и их значение.

Чтобы получить счет-фактуру, я запускаю встроенный SQL, который хранит данные из базы данных вквалифицированная структура данных, которая определяется как dim (1000).

Я пытался %XFoot(invoiceDS:1:1000) и %XFoot(invoiceDS(*).value:1:1000).Ни один из них не скомпилирован, поскольку квалифицированное выражение не допускается в качестве параметра для% XFoot.

Затем я попытался получить подраздел, если массив структур данных с %SubArr(invoiceDS(*).value:1:1000).Но это также не удалось, поскольку 'value' не является группой полей.

Есть ли какое-то решение для этого?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Понятно!

Мне просто нужно запустить массив массивов данных с помощью цикла 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 
0 голосов
/ 25 сентября 2018

Вы не можете сделать это с 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)    

и затем вы можете выполнить% xfoot для ar_fileds

Но в вашем случае с DS DIM (1000) ... вы должны сделать LOOP, потому что xfoot суммирует массив (таким образом, данные «по горизонтали», размерные DS «по вертикали».

LOOP:

total = *Zero ;
For count = 1 To 1000 ;
 total += DsName(count).Field ;
EndFor ;
...