Как отлаживать определенные записи в таблицах в системе AS400

#database #debugging #ibm-midrange

Вопрос:

Я работаю над попыткой отладить проблему с расчетом процентной ставки, которая выполняется для нескольких тысяч записей из нескольких миллионов в программе RPG в системе AS400. Прямо сейчас очень небольшому числу записей в очень большой таблице присвоены абсурдные процентные значения (многократно превышающие принцип в течение нескольких месяцев).

Я пытался решить эту проблему с помощью встроенного отладчика as400, чтобы определить причину сбоя вычисления путем отладки конкретных записей о проблемах. Однако мне не удалось найти способ прочитать одну из записей о проблеме напрямую или иным образом получить к ней доступ в отладчике (я пытался использовать условные точки останова, однако они неэффективны по времени из-за размера таблицы).

Есть ли способ прямого доступа/чтения определенной записи во время отладки в цикле типа RPG Dow %eof?

Ответ №1:

Есть ли способ прямого доступа/чтения определенной записи во время отладки в цикле типа RPG Dow %eof

Нет. Вам нужно будет использовать CHAIN или SETLL/READE для доступа к определенной записи.

Предполагая, что у вас нет отдельной среды разработки/тестирования…

Без изменения программного кода вы можете создать новую копию таблицы только с проблемными записями. Затем используйте команду Переопределить файл базы данных (OVRDBF), чтобы заставить вашу программу получить доступ к вашей копии таблицы вместо обычной.

Если у вас есть отдельная среда, вы все равно можете сократить данные до проблемных записей.

Комментарии:

1. Спасибо, это кажется хорошим обходным путем

Ответ №2:

запущенная программа может выполнить STRDBG команду для запуска отладчика на самой себе. Измените программу, чтобы проверить наличие ошибки. Когда это произойдет, вызовите программу QCMDEXC и выполните STRDBG PgmName updprod(*yes) команду. Отладчик запускается, код останавливается на инструкции, которая запустила отладчик.

 ** ---------------------- pr_qcmdexc -------------------------
dpr_qcmdexc       pr                  extpgm('QCMDEXC')       
d InCmds                      9999a   const options(*VarSize) 
d InCmdsLx                      15p 5 const                   
                                                              
** --------------------------- test0246r ---------------------
** test0246r: strdbg when condition in running program.       
dtest0246r        pi                                          
                                                              
d vSrcdta         s            132a                           
d vSrcseq         s              7p 2                         
d cmds            s            256a   varying                 
 /free                                                        
      exec sql  
      declare c1 cursor for                            
      select      a.srcdta, a.srcseq                   
      from        qrpglesrc a ;                        
                                                       
      exec sql                                         
      open        c1 ;                                 
      dow         1 = 1 ;                              
      exec sql                                         
      fetch       c1                                   
      into        :vSrcdta, :vSrcseq ;                 
      if          sqlcode <> 0 ;                       
      leave ;                                          
      endif ;                                          
                                                       
  // strdbg when seqnbr = 15                           
      if          vSrcseq = 15 ;                       
      cmds        = 'strdbg  test0246r updprod(*yes)' ;
      pr_qcmdexc( cmds: %len(cmds)) ;                  
      endif ;                                          
                                                       
      enddo ;                                          
      exec sql                                         
      close       c1 ;                                 
     *inlr       = '1' ;
     return ;           
/end-free               
 
 

Комментарии:

1. Классная идея! Я не знал, что это возможно.