Ibm midrange 循环以统计每个订单的订单权重

Ibm midrange 循环以统计每个订单的订单权重,ibm-midrange,db2-400,rpgle,Ibm Midrange,Db2 400,Rpgle,我现在很为难。我要做的是,当主循环读取一个订单是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

我现在很为难。我要做的是,当主循环读取一个订单是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表中的所有订单权重。当有这样一个新订单号时,我还需要清除保留字段。\n但我的输出在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 += phwtno

不会改变结果,但是在RPG IV程序的中间运行RPGIII语法是令人不安的。 我没有看到任何明显的逻辑问题。这意味着:

mhkey4中的值不是您期望的值;因此,setll和/或read没有看到您期望的记录。 mhcmno4、PHCOM、mhordr4、PHRD中的值不是您期望的值;因此,if失败了,您永远不会向phwtot添加任何内容 PHWGHT中的值不是您期望的值;因此%dec返回0。我不认为这是失败的,因为这会引发异常。您可能应该监视哪些BTW:

无论如何,正如特雷西在评论中建议的那样,在调试和运行过程中运行程序可能是最好的方法来解释正在发生的事情。

首先,考虑替换

c                   add       phwtno        phwtot 

甚至

c                   eval      phwtot += phwtno

不会改变结果,但是在RPG IV程序的中间运行RPGIII语法是令人不安的。 我没有看到任何明显的逻辑问题。这意味着:

mhkey4中的值不是您期望的值;因此,setll和/或read没有看到您期望的记录。 mhcmno4、PHCOM、mhordr4、PHRD中的值不是您期望的值;因此,if失败了,您永远不会向phwtot添加任何内容 PHWGHT中的值不是您期望的值;因此%dec返回0。我不认为这是失败的,因为这会引发异常。您可能应该监视哪些BTW:
无论如何,正如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;

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

您可以使用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;

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

mhkey4的结构是什么?它与mhordr4有什么关系?这看起来像是将程序编译到调试模式然后使用STRDBG会有所帮助的情况之一。还有,PSHIPLL4的关键是什么?关键是公司和订单号。这里只有1个公司,那么mhkey4是DS或KLIST或类似的。您能说明程序是如何定义它的以及子字段值是如何设置的吗?顺便问一下,为什么在这个循环中使用READ而不是READE?此外,我没有看到任何错误检查,也没有看到任何检查SETLL是否成功的内容。你怎么知道它能像你期望的那样工作?也就是说,您如何知道您正在访问正确的记录?没有什么是问题的根源。这肯定是调试器会立即显示实际问题的情况之一。mhkey4的结构是什么?它与mhordr4有什么关系?这看起来像是将程序编译到调试模式然后使用STRDBG会有所帮助的情况之一。还有,PSHIPLL4的关键是什么?关键是公司和订单号。这里只有1个公司,那么mhkey4是DS或KLIST或类似的。您能说明程序是如何定义它的以及子字段值是如何设置的吗?顺便问一下,为什么在这个循环中使用READ而不是READE?此外,我没有看到任何错误检查,也没有看到任何检查SETLL是否成功的内容。你怎么知道它能像你期望的那样工作?也就是说,您如何知道您正在访问正确的记录?没有什么是问题的根源。这肯定是调试器会立即显示实际问题的情况之一。