如何在十进制数据错误后读取iSeries转储

时间:2017-01-24 12:15:08

标签: ibm-midrange rpgle

十进制数据错误是在我测试和调试RPG程序时经常出现的问题。有时,错误的字段非常明显,就像调试程序时一样,并且在EVAL操作中抛出错误。但在其他一些情况下,这一点并不清楚,并且会出现一个转储选项。进行转储后,您如何理解错误字段以及问题发生的位置?基本上,问题是如何读取假脱机文件并了解出了什么问题。如何理解纠正问题所需的操作。主要是如何理解哪个字段被分配了导致十进制数据错误的错误值? 在线轴中需要注意的重点是什么? 下面是一个示例假脱机文件供我参考,我想了解。

https://www.dropbox.com/s/qls40890gfije5o/pftest.txt?dl=0

3 个答案:

答案 0 :(得分:2)

Statement in Error . . . . . . . . . . :   00100100

如果您的程序是使用option(*SRCSTMT)编译的,或者就像这里的情况那样......那么它将是源语句编号...编译列表行号。

此外,以下内容通常很有用,因为从文件读取数据时通常会出现十进制数据错误。

 Status that caused RNX9001 . . . . . . :
 Last File Used . . . . . . . . . . . . :
 Last File Status . . . . . . . . . . . :
 Last File Operation  . . . . . . . . . :
 Last File Routine  . . . . . . . . . . :
 Last File Statement  . . . . . . . . . :
 Last File Record Name  . . . . . . . . :

答案 1 :(得分:0)

RNX9001十进制数据错误。在野外99%的数字字段尚未初始化。

考虑使用重置操作码。这会将记录格式的所有字段设置为其默认值。然后填充数据。

          RESET            ORDERSF

答案 2 :(得分:0)

数字局部变量的默认值为零(十六进制为0000)。 本地数据结构中数字字段的默认值为空格(十六进制为4040)。尝试在仅包含空格的未初始化字段上执行数学运算将导致十进制数据错误。

下面建议的RESET操作解决方案会将值恢复为程序的* INIT操作结束时的值 。这对局部变量很有用,但对数据结构中的数字字段则无济于事。

更好的解决方案是在数据结构字段的定义中添加INZ keyword。对于局部变量而言,这不是必需的(尽管这可能是个好习惯),但是通过将其初始化为零而不是空格,可以防止数据结构中出现十进制数据错误。

D SQL_Header      DS                
D  Order#                        6S 0 INZ           
D  OrderSufx                     2S 0 INZ           
D  CustOrder                    20A   INZ           

从文档中:

  

未指定INZ参数时:

     

已初始化数据结构的静态独立字段和子字段被初始化为其RPG默认默认值(例如,字符为空白,数字为0)。

     

未初始化的数据结构(在数据结构的定义规范中未指定INZ)的子字段被初始化为空白(无论其数据类型如何)。

默认行为可能是出于性能目的(尤其是在创建数据结构数组时),但是对于不习惯该行为的用户来说可能会感到惊讶。养成使用INZ的习惯可使该行为与其他编程语言更加相似,并防止出现十进制数据错误。