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

问题描述 投票:0回答:2

首先,我不是在寻找解决此错误消息的解决方案。与解决代码问题的解决方案相比,我更倾向于直接阅读解释此错误的文档。我需要了解为什么会这样,因为我找不到任何解释此错误原因的文档。我是RPG的新手(不到2年),所以对此我有一定的了解。

我正在研究一些旧的RPG代码,该代码已于2017年10月重新编译。此代码自2013年以来一直在使用。

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

C                   EvalR     NewValueA = %char(NewValue)

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

NewValue定义为7 0小数。 NewValueA是8个字符的字符。

首先感谢所有提供富有建设性意见的人。

ibm-midrange rpgle rpg
2个回答
0
投票

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

特别是,独立变量不能为NULL。在RPG程序中,只有在外部描述的文件(表)中直接或间接(通过LIKELIKEDSLIKEREC生成)的变量并且在该文件中定义为允许NULL的变量才可以为NULL。甚至要求使用ALWNULL(* USRCTL)选项编译程序。参见Database Null Value Support

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

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

正如jtaylor的答案所提到的那样,大多数十进制数据错误是由于将不良数据写入旧DDS定义的文件而引起的。但是,在这种情况下,读取文件时将引发错误,而不是在显示的行中。 (除非将文件直接读取到数据结构中。)

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.