ibm-midrange - 谁能解释为什么 %char() 会发生十进制数据错误?
问题描述
首先,我不只是在寻找解决此错误消息的解决方案。我会更感激被引导到解释这个错误的文档而不是代码问题的解决方案。我需要了解为什么会发生这种情况,因为我找不到任何解释导致此错误的原因的文档。我对 RPG 比较陌生(不到 2 年),所以我对此的无知程度还算合理。
我正在编写一些于 2017 年 10 月重新编译的遗留 RPG 代码。此代码自 2013 年以来一直存在。
我的问题是我的用户最近(在过去 3-4 个月内)开始收到在这行代码上报告的十进制数据错误:
C EvalR NewValueA = %char(NewValue)
错误消息的转储显示 NewValue 为空。不是0,只是空的。根据我使用其他语言的经验,这是一个 NULL。我的所有资源(包括 Google)都没有说明 RPGLE 中的 %char() 是如何处理 NULL 的。很容易假设%char() 不能优雅地处理 NULL 并继续前进,但在代码审查中很难证明这一点。
NewValue 定义为 7 0 十进制。NewValueA 是一个 8 个字符的字符。
提前感谢所有提供富有成效的评论的人。
解决方案
当前版本的 RPG 不完全支持 NULL。
具体来说,独立变量不能为 NULL。只有在外部描述的文件(表)中直接或间接(通过LIKE
、LIKEDS
或)产生并且在该文件中定义为允许 NULL 的变量在 RPG 程序中可以为 NULL LIKEREC
甚至需要使用 ALWNULL(*USRCTL) 选项编译程序。请参阅数据库空值支持
虽然这种支持已经存在很长时间(ILE 的开始?),但大多数遗留文件和相关的 RPG 代码不使用 NULL。
所以NewValue
不可能为空(NULL)。
您在调试中看到的十六进制值是多少?
正如 jtaylor 的回答所提到的,大多数十进制数据错误来自写入旧 DDS 定义文件的错误数据。但是,在这种情况下,读取文件时会引发错误,而不是在您显示的行上。(除非文件被直接读入数据结构。)
在哪里NewValue
定义?它如何获得价值?
对于程序变量,十进制数据错误的最可能原因是数字变量位于未指定INZ
关键字的数据结构中。在这种情况下,数据结构被初始化为所有空白。
推荐阅读
- list - 按元组的第二个元素对元组列表进行排序,无需高阶函数或递归
- python - 如何在 python Telegram bot 的主要功能中获取 Telegram 用户的用户名?
- sip - 使用 ejabberd 进行 SIP 身份验证
- r - 如何在哑铃图中添加数据标签?
- mysql - SQL - 多 SELECT 和 GROUP BY 以获取表的 MIN(value)
- c - OpenSSL 中的时间范围是多少
- python - Pytorch 模型训练 CPU 内存泄漏问题
- json-api - JSON:API 中不区分大小写的过滤
- sql - 在 sql server 2016 中连接由分号分隔的特定列的值
- maven - 使用 Spock、maven 和 surefire 重新运行整个测试类