谁能解释为什么 %char() 会发生十进制数据错误?

Can anyone explain why decimal data error is happening with %char()?

首先,我不只是在寻找修复此错误消息的解决方案。如果被引导到解释此错误的文档而不是代码问题的解决方案,我会更加感激。我需要了解为什么会发生这种情况,因为我找不到任何文档来解释导致此错误的原因。我是 RPG 的新手(不到 2 年),所以我对此处于合理的无知水平。

我正在处理 2017 年 10 月重新编译的一些遗留 RPG 代码。此代码自 2013 年以来一直存在。

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

C                   EvalR     NewValueA = %char(NewValue)

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

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

提前感谢所有提出富有成效的意见的人。

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

RPG当前版本不完全支持NULL

具体来说,独立变量不能为 NULL。只有直接或间接(通过 LIKELIKEDSLIKEREC)源自外部描述文件 (table) 且在该文件中定义的变量允许NULL,在RPG程序中可以为NULL;即使这样,也需要使用 ALWNULL(*USRCTL) 选项编译程序。参见 Database Null Value Support

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

因此 NewValue 不可能为空 (NULL)。
您在调试中看到的十六进制值是多少?

正如 jtaylor 的回答中提到的那样,大多数十进制数据错误都来自写入旧 DDS 定义文件的错误数据。但是,在那种情况下,错误会在读取文件时抛出,而不是在您显示的行上。 (除非文件被直接读入数据结构。)

NewValue在哪里定义的?它如何获得价值?

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

遇到这种情况,我的做法是:

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

pValue = %addr(NewValue);

这适用于 zoned 类型,因为实际上它与 char 类型相同(关于内存存储)。

经过如此简单的操作,您可以检查值 strValue - 是否为空(仅包含空格),是否包含非数字等