如何在Decimal数据错误后读取iSeries转储



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

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

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  . . . . . . . . :

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

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

RESET            ORDERSF

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

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

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

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

来自文件:

未指定INZ参数时:

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

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

默认行为可能是出于性能目的(尤其是在创建数据结构数组时),但对于那些不习惯这种行为的人来说,这可能会令人惊讶。养成使用INZ的习惯会使行为更类似于其他编程语言,并将防止十进制数据错误。

相关内容

  • 没有找到相关文章

最新更新