Ibm midrange 有人能解释为什么%char()发生十进制数据错误吗?

Ibm midrange 有人能解释为什么%char()发生十进制数据错误吗?,ibm-midrange,rpgle,rpg,Ibm Midrange,Rpgle,Rpg,首先,我不是在寻找一个解决方案来修复这个错误消息。我会更感激被引导到解释这个错误的文档,而不是代码问题的解决方案。我需要理解为什么会发生这种情况,因为我找不到任何文档来解释导致此错误的原因。我对RPG的认识还不到2年,所以我对这方面的无知程度还算合理 我正在编写一些遗留RPG代码,这些代码于2017年10月重新编译。本规范自2013年起实施 我的问题是,我的用户最近在过去3-4个月内开始在这行代码中报告十进制数据错误: C EvalR NewValue

首先,我不是在寻找一个解决方案来修复这个错误消息。我会更感激被引导到解释这个错误的文档,而不是代码问题的解决方案。我需要理解为什么会发生这种情况,因为我找不到任何文档来解释导致此错误的原因。我对RPG的认识还不到2年,所以我对这方面的无知程度还算合理

我正在编写一些遗留RPG代码,这些代码于2017年10月重新编译。本规范自2013年起实施

我的问题是,我的用户最近在过去3-4个月内开始在这行代码中报告十进制数据错误:

C                   EvalR     NewValueA = %char(NewValue)
错误消息中的转储显示NewValue为空。不是0,只是空的。根据我对其他语言的经验,这是一个空值。我的任何资源(包括Google)都没有给出RPGLE中%char如何处理NULL的任何指示。很容易假设%char不能优雅地处理NULL并继续,但在代码审查中很难证明这一点

NewValue定义为7 0十进制。NewValueA是一个8个字符的字符


提前感谢所有提供有建设性意见的人。

我的猜测是,NewValue是从一个遗留PF读取的,即DDS,它允许在该列中使用虚假值。这些PFs允许写入虚假数据,但当您读入并尝试使用时失败。另一方面,DDL定义的表在写入时会出错。

我的猜测是,NewValue是从遗留PF(即DDS)中读取的,该PF允许在该列中使用虚假值。这些PFs允许写入虚假数据,但当您读入并尝试使用时失败。另一方面,DDL定义的表在写入时会出错。

当前版本的RPG不完全支持NULL

具体来说,独立变量不能为NULL。在RPG程序中,只有通过外部描述的文件表中的LIKE、LIKEDS或LIKEREC直接或间接产生的变量,以及在该文件中定义为允许NULL的变量,才能为NULL;即使这样,程序也需要使用ALWNULL*USRCTL选项编译。看

虽然这种支持在ILE?开始时已经存在很长一段时间,但大多数遗留文件和相关RPG代码都不使用NULL

所以NewValue不太可能是空的。 您在调试中看到的十六进制值是多少

正如jtaylor的回答所提到的,大多数十进制数据错误都是由于将坏数据写入传统DDS定义的文件中造成的。但是,在这种情况下,错误将在读取文件时抛出,而不是在您显示的行上。除非文件被直接读取到数据结构中

NewValue在哪里定义?它是如何得到一个值的


对于程序变量,十进制数据错误的最可能原因是数值变量位于未指定INZ关键字的数据结构中。在这种情况下,数据结构将初始化为所有空格。

当前版本的RPG不完全支持NULL

具体来说,独立变量不能为NULL。在RPG程序中,只有通过外部描述的文件表中的LIKE、LIKEDS或LIKEREC直接或间接产生的变量,以及在该文件中定义为允许NULL的变量,才能为NULL;即使这样,程序也需要使用ALWNULL*USRCTL选项编译。看

虽然这种支持在ILE?开始时已经存在很长一段时间,但大多数遗留文件和相关RPG代码都不使用NULL

所以NewValue不太可能是空的。 您在调试中看到的十六进制值是多少

正如jtaylor的回答所提到的,大多数十进制数据错误都是由于将坏数据写入传统DDS定义的文件中造成的。但是,在这种情况下,错误将在读取文件时抛出,而不是在您显示的行上。除非文件被直接读取到数据结构中

NewValue在哪里定义?它是如何得到一个值的


对于程序变量,十进制数据错误的最可能原因是数值变量位于未指定INZ关键字的数据结构中。在这种情况下,数据结构初始化为所有空格。

在这种情况下,我的操作如下:

dcl-s strValue  char(7)  based(pValue);

pValue = %addr(NewValue);
这适用于类型zoned,因为实际上,它在内存中的存储方面与类型char相同


在这样一个简单的操作之后,您可以检查strValue值-它是否为空,是否只包含空格,是否包含非数字,等等。

在这种情况下,我的操作如下:

dcl-s strValue  char(7)  based(pValue);

pValue = %addr(NewValue);
这适用于类型zoned,因为实际上,它在内存中的存储方面与类型char相同


在这样一个简单的操作之后,您可以检查strValue值-它是否为空,是否只包含空格,是否包含非数字等。

建议编辑问题的标题,以便更详细地描述
你遇到的问题的答案。这样你可能会得到更多的参与。建议编辑你问题的标题,以便更能描述你遇到的问题。通过这种方式,您可能会获得更多参与。NewValue被定义为数据结构的一部分D DS D NewValue 1 7 0 D PrtValue 1 7 2这是发生错误时的值NewValue ZONED7,0。”4040404040'X和代码格式不支持空白,所以我很抱歉。好的,这就是我描述的场景,将INZ关键字添加到数据结构中。此外,您可以在问题中加入代码以获得更好的格式。数字默认为空白的数据结构是每个新RPG程序员必须至少涉足一次的漏洞。从表面上看,这是为了提高效率和向后兼容性,因为您可能不希望使用大量数据结构并将所有内容初始化为0。我的意思是,我想这样做,所以我使用INZ,但在70年代,那些时钟周期更有价值。@MikeSupportsMonica-我希望我能把这归咎于我的无知和缺乏知识,但我继承了它。写这篇文章的人已经写了很长时间了,所以他们很可能是根深蒂固的习惯@Charles-我会看看添加INZ关键字是否能解决这个问题。@CoMoG Dawg INZ应该可以解决这个问题,但是这个问题刚刚开始,有些事情已经改变了。如果程序没有改变,那么它的使用方式就改变了。之前NewValue必须在%char之前加载数据,现在不是。NewValue被定义为数据结构的一部分D DS D NewValue 1 7 0 D PrtValue 1 7 2这是发生错误时的值NewValue ZONED7,0 . '4040404040'X和代码格式不支持空白,所以我很抱歉。好的,这就是我描述的场景,将INZ关键字添加到数据结构中。此外,您可以在问题中加入代码以获得更好的格式。数字默认为空白的数据结构是每个新RPG程序员必须至少涉足一次的漏洞。从表面上看,这是为了提高效率和向后兼容性,因为您可能不希望使用大量数据结构并将所有内容初始化为0。我的意思是,我想这样做,所以我使用INZ,但在70年代,那些时钟周期更有价值。@MikeSupportsMonica-我希望我能把这归咎于我的无知和缺乏知识,但我继承了它。写这篇文章的人已经写了很长时间了,所以他们很可能是根深蒂固的习惯@Charles-我会看看添加INZ关键字是否能解决这个问题。@CoMoG Dawg INZ应该可以解决这个问题,但是这个问题刚刚开始,有些事情已经改变了。如果程序没有改变,那么它的使用方式就改变了。以前,NewValue必须在%char之前加载数据,现在不是。