如何在AS400系统上调试表中的特定记录

How to debug specific records in tables on the AS400 system

我正在尝试调试一个利率计算问题,该问题是在 AS400 系统上的 RPG 程序中对几百万条记录中的几千条记录执行的。现在,非常大的 table 中的极少数记录被分配了荒谬的利息值(数倍于几个月的原则)。

我一直在尝试使用内置的as400调试器来解决这个问题,通过调试具体的问题记录来确定计算失败的原因。但是,我一直无法找到直接读取其中一个问题记录或以其他方式在调试器中访问它的方法(我尝试使用条件断点,但是由于 table 的大小,它们的时间效率很低) .

有没有办法在 RPG Dow %eof 类型循环中调试时直接 access/read 特定记录?

Is there a way to directly access/read a specific record while debugging in an RPG Dow %eof type loop

没有。您需要使用 CHAIN 或 SETLL/READE 来访问特定记录。

假设您没有单独的 development/test 环境...

无需更改程序代码,您可以创建仅包含有问题记录的 table 的新副本。然后使用覆盖数据库文件 (OVRDBF) 命令强制您的程序访问您的 table 副本而不是常规副本。

如果您有一个单独的环境,您仍然可以将数据缩减为有问题的记录。

一个 运行ning 程序可以 运行 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