цикл для подсчета веса заказа на заказ #

Я в тупике в данный момент. Что мне нужно сделать, так это то, что когда основной цикл считывает заказ 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

поэтому в этом коде я хочу посмотреть, не равен ли номер заказа = предыдущему номеру заказа, тогда я сделаю этот код, чтобы подсчитать все веса заказов из таблицы кораблей. Мне также нужно очистить поле хранения, когда есть такой новый номер заказа. \ но мой вывод - только нули в 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

person Pinchas K    schedule 22.04.2015    source источник
comment
Какова структура mhkey4? Как это связано с mhordr4?   -  person user2338816    schedule 23.04.2015
comment
Это похоже на одну из тех ситуаций, когда перевод вашей программы в режим отладки, а затем использование STRDBG может помочь. Кроме того, каковы ключи к PSHIPLL4?   -  person Tracy Probst    schedule 23.04.2015
comment
Ключи - это компания и номер заказа. здесь только 1 компания   -  person Pinchas K    schedule 23.04.2015
comment
Тогда mhkey4 это DS или KLIST или что-то подобное. Можете ли вы показать, как программа определяет его и как устанавливаются значения подполей? Кстати, почему вы используете READ в этом цикле вместо READE? Кроме того, я не вижу никакой проверки ошибок и не вижу ничего, что проверяло бы успешность SETLL. Как узнать, что это работает, как вы ожидаете? То есть как узнать, что вы обращаетесь к нужным записям?   -  person user2338816    schedule 24.04.2015
comment
Ничто на самом деле не выделяется как источник проблемы. Это определенно одна из тех ситуаций, когда отладчик сразу покажет реальную проблему.   -  person Tracy Probst    schedule 24.04.2015


Ответы (2)


вы можете сделать это с помощью 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;

где локальная переменная — это номер заказа, который вы обрабатываете, а локальная структура данных — это структура данных, определенная в соответствии с вашей выходной записью. Вам нужно убедиться, что вы читаете только одну запись за раз, или вы можете поместить это в курсор, чтобы прочитать несколько записей.

person jmarkmurphy    schedule 24.04.2015

Прежде всего, подумайте о замене

c                   add       phwtno        phwtot 

с

c                   eval      phwtot = phwtot + phwtno       

или даже

c                   eval      phwtot += phwtno

Это не меняет результатов, но смущает столкновение с синтаксисом RPG III в середине программы RPG IV.

Я не вижу явных логических проблем. Это означает, что либо:

  • значения в 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;

В любом случае, как предложил Трейси в комментарии, запуск программы в режиме отладки и ее пошаговое выполнение, вероятно, лучший способ выяснить, что происходит.

person Charles    schedule 23.04.2015