此刻我很难过。我要做的是,当主循环读取aaord#的顺序时,我们需要在这个子程序中计算所有其余的具有框重量的顺序行。发货表是这样的:对于输出,我们可以将ord_wt放在每一行上,我无法想到任何其他方式。
PHORD# PHWGHT PHBNO#
04924920 1.05 1
05012409 27.40 2
05012409 27.40 3
05012409 27.40 4
05012409 27.40 5
05012409 27.40 6
05012409 27.40 7
05012409 27.40 8
05012409 20.00 9
05012421 26.90 2
05012421 26.90 3
05012421 26.90 4
05012430 13.70 2
05036997 21.60 1
05036997 21.60 2
05036997 21.60 3
05036997 21.60 4
05037155 14.55 1
05037173 12.25 1
05037173 12.20 2
05039479 8.10 1
所以在这段代码中,我想要做的是查看订单号是否不是=以前的订单号,然后我将执行此代码来计算来自ship表的所有订单权重。当有这样一个新的订单号时,我还需要清除保留字段。\但我的输出在ord_wt中仅为零
c eval mhcmno4= aacom#
c* eval wkrel@ = %EDITC(aarel#:'X')
c* eval wkrel2 = %subst(wkrel@:4:2)
c eval mhordr4 = aaord#
c eval wkvsf='N'
c* endif
c z-add 0 phwtno 702
c*
c mhordr4 ifne prvord
c z-add 0 phwtot
c mhkey4 setll pshipLL4
c read pshipLL4
c* loop thru all orders in the ship table and add the weight to get a
c* total weight per order #
c dow not %eof(pshipLL4)
c if mhcmno4 = PHCOM# and
c mhordr4 = PHORD#
c* phwght is 11 char
c**
c eval prvord = mhordr4
c eval phwtno = %dec(PHWGHT:7:2)
c add phwtno phwtot
c else
c leave
c endif
c read pshipLL4
c enddo
c endif
c endsr
OUTPUT: packages of course cannot be 0.
05475731 0
05475731 0
05475731 0
05475731 0
05475731 0
05475731 0
05475731 0
05475731 0
05475731 0
05476179 0
05476179 0
05476179 0
05476179 0
05476179 0
05476179 0
05476179 0
05476179 0
05476179 0
05476179 0
05476179 0
05476179 0
05476179 0
05476179 0
05476179 0
05476179 0
05475736 0
05475736 0
05475736 0
05475736 0
05475736 0
05475736 0
05475736 0
05475736 0
05475736 0
05475736 0
05475750 0
05475750 0
05475750 0
05475750 0
05475750 0
05475750 0
答案 0 :(得分:3)
首先,考虑更换
c add phwtno phwtot
与
c eval phwtot = phwtot + phwtno
甚至
c eval phwtot += phwtno
不会改变结果,但在RPG IV程序中遇到RPG III语法会令人不安。
我没有看到任何明显的逻辑问题。这意味着:
mhkey4
中的值不是您所期望的;因此setll
和/或read
没有看到您期望的记录。mhcmno4, PHCOM#, mhordr4, PHORD#
中的值不是您所期望的;因此,if
失败,您永远不会向phwtot
PHWGHT
中的值不是您所期望的;因此%dec()
返回0.我认为它没有失败,因为它应该抛出异常。您应该监控哪个BTW:monitor;
phwtno = %dec(PHWGHT:7:2);
on-error;
//do something to handle the error
end-mon;
无论如何,正如Tracy在评论中所说,在调试中运行程序并单步执行它可能是你弄清楚发生了什么的最佳选择。
答案 1 :(得分:1)
你可以用这样的SQL做到这一点:
exec sql
with tmp as (
select orderno, sum(weight) as orderweight
from orderdetail
group by orderno)
select orderno, itemno, weight, orderweight
into :localdatastructure
from orderdetail
join tmp using(orderno)
where orderno = :localvariable;
其中局部变量是您正在处理的订单号,而本地数据结构是定义为适合您的输出记录的数据结构。您需要确保一次只读取一条记录,或者将其放入游标中以读取多条记录。