循环计算每个订单的订单重量 #

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;

其中局部变量是您正在处理的订单号,局部数据结构是为适合您的输出记录而定义的数据结构。您需要确保一次只读取一条记录,或者您可以将其放入游标中以读取多条记录。