循环计算每个订单的订单重量 #
loop to tally the order weights per order #
我现在很困惑。我要做的是,当主循环正在读取一个 aaord# 的订单时,我们需要在这个子例程中计算所有剩余的具有盒子重量的订单行。运输 table 是这样的:对于输出,我们可以把 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
所以在这段代码中,我想做的是查看订单号是否不等于之前的订单号,然后我将执行这段代码来计算船上的所有订单重量 table .当有这样一个新的订单号时,我还需要清除持有字段。\ 但我的输出在 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
首先,考虑更换
c add phwtno phwtot
和
c eval phwtot = phwtot + phwtno
甚至
c eval phwtot += phwtno
不会改变结果,但在 RPG IV 程序中间 运行 进入 RPG III 语法令人不安。
我没有发现任何明显的逻辑问题。这意味着:
mhkey4
中的值不是您所期望的;因此 setll
and/or read
没有看到您期望的记录。
mhcmno4, PHCOM#, mhordr4, PHORD#
中的值不是您所期望的;因此 if
失败了,你永远不会向 phwtot
添加任何东西
PHWGHT
中的值不是您所期望的;因此 %dec()
返回 0。我不认为它失败了,因为它应该抛出异常。顺便说一句,您可能应该监控哪个:
monitor;
phwtno = %dec(PHWGHT:7:2);
on-error;
//do something to handle the error
end-mon;
无论如何,正如 Tracy 在评论中建议的那样,运行调试程序并单步执行它可能是弄清楚发生了什么的最佳选择。
你可以用 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;
其中局部变量是您正在处理的订单号,局部数据结构是为适合您的输出记录而定义的数据结构。您需要确保一次只读取一条记录,或者您可以将其放入游标中以读取多条记录。
我现在很困惑。我要做的是,当主循环正在读取一个 aaord# 的订单时,我们需要在这个子例程中计算所有剩余的具有盒子重量的订单行。运输 table 是这样的:对于输出,我们可以把 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
所以在这段代码中,我想做的是查看订单号是否不等于之前的订单号,然后我将执行这段代码来计算船上的所有订单重量 table .当有这样一个新的订单号时,我还需要清除持有字段。\ 但我的输出在 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
首先,考虑更换
c add phwtno phwtot
和
c eval phwtot = phwtot + phwtno
甚至
c eval phwtot += phwtno
不会改变结果,但在 RPG IV 程序中间 运行 进入 RPG III 语法令人不安。
我没有发现任何明显的逻辑问题。这意味着:
mhkey4
中的值不是您所期望的;因此setll
and/orread
没有看到您期望的记录。mhcmno4, PHCOM#, mhordr4, PHORD#
中的值不是您所期望的;因此if
失败了,你永远不会向phwtot
添加任何东西
PHWGHT
中的值不是您所期望的;因此%dec()
返回 0。我不认为它失败了,因为它应该抛出异常。顺便说一句,您可能应该监控哪个:
monitor;
phwtno = %dec(PHWGHT:7:2);
on-error;
//do something to handle the error
end-mon;
无论如何,正如 Tracy 在评论中建议的那样,运行调试程序并单步执行它可能是弄清楚发生了什么的最佳选择。
你可以用 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;
其中局部变量是您正在处理的订单号,局部数据结构是为适合您的输出记录而定义的数据结构。您需要确保一次只读取一条记录,或者您可以将其放入游标中以读取多条记录。