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



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

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

是否有一种方法可以直接访问/读取一个特定的记录,而在RPG的Dow %eof类型循环调试?

是否有一种方法可以直接访问/读取特定的记录在RPG中调试Dow %eof类型的循环

。您需要使用CHAIN或SETLL/read来访问特定的记录。

假设您没有独立的开发/测试环境…

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

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

正在运行的程序可以运行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               

最新更新