名词解释:什么是 decimal data error

发布于 2022-08-30 13:06:36 字数 1578 浏览 8 评论 8

朋友们一定碰到过这种问题吧?可是究竟清不清楚这是什么错误呢?

原来400上面的十进制数有两种格式:压缩十进制"packed decimal" (P)和普通十进制"zoned decimal" (S).

压缩十进制每个字节存储两个十进制位,在最后半个字节存储符号位,说明数字是正还是负的。

Zoned decimal 一个字节表示一位十进制数字。符号(正负)由最后一个字节的MSB来决定。

如果一个 packed decimal 字段定义为8位,它就占据5个字节。如果它的值是12345,以十六进制表示就是

000012345F   (F表示正数)

如果一个 zoned decimal 字段定义为8位,它就占据8个字节。如果它的值是12345,以十六进制表示就是

F0F0F0F1F2F3F4F5

Zoned decimal 对正数来说,内码就跟字符串 '00012345'  一模一样。

在所有的计算机系统里面,小数点都是不占位置的(除非有哪个傻瓜设计的电脑嫌内存或磁盘容量太大)。

那么什么是”decimal data error"呢?你在c表里面用到某个十进制数字型字段的时候,系统会检查其中的内容是不是合法的十进制数字。
如果不是,那系统怎么能够用它进行加减乘除等计算呢?系统没有办法继续,那它就只好报“decimal data error"啦!

那么怎么会造成十进制字段被弄乱呢?据分析典型的原因主要有下面这些:

1)rpg  *entry 参数定义为zoned decimal, 以cl 调用,cl传以 packed decimal.
cl 没有zoned decimal这种数据类型。只好传packed decimal了。这样就完蛋了。 其实正数可以改传字符型。
2)数据机构中的数字形。系统通常把整个数据机构初始化为空格,这样里面的数字形字段全部含非法数据。
    如果在被赋值之前就加以引用,等待你的就是"decimal data error"啦。
3)许多人用sql的时候为了方便,把sql写成下面这样:

select * into :my_data_structure from my_table where ......

或者.

fetch xxxx into :my_data_structure

其中 my_data_structure 就是以外部文件 my_table 定义的数据结构。

可是有时候又忘记了检查 sql执行成功与否。便引用数据结构的数字。。。
可是由于sql没有成功,那些数字形的字段里面含的还是系统初始化的时候填入的空格  x'4040404040'

这些空格全部是非法的十进制数字,这样马上就中了“decimal data eror" 啦!

[ 本帖最后由 franliu 于 2009-12-19 15:08 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

花间憩 2022-09-02 01:21:48

楼下回答

紙鸢 2022-09-02 01:21:46

在命令行调用时,如果程序接口参数有数字的,需要使用16进制的方式,否则是没法正确的传入数据的..

凉城 2022-09-02 01:17:37

分析的很透彻,在命令行用CALL PGM  PARM()的时候最容易出现这种十进制错误,因为*ENTRY里默认的数字类型是P型

小鸟爱天空丶 2022-09-02 00:35:28

有时数据结构改变了,而没有重新编译程序,当程序想文件写入记录时也可能发生这种错误..

阳光下的泡沫是彩色的 2022-09-01 23:33:07

总之MOVE是没有办法把垃圾塞进数字形字段而造成DECIMAL DATA ERROR的,除非MOVE的目标是一个数据结构,而不是一个数字形的字段。
可能的原因前面已经介绍过了,那就是:

1)通过参数传递
2)通过未赋值的数据结构内的数字型字段
3)通过双重定义的字段。
D                       DS                 
D   DEC                    1    10S 0         
D   CHAR                  1    10A  
如上面的源程序所示,变量DEC和CHAR共享内存。如果给CHAR赋值‘123456790’,那么 DEC就成了1234567890,如果给CHAR赋值‘ABCDEFGHIJ',
你再引用DEC, 就看到DECIMAL DATA ERROR啦。

[ 本帖最后由 franliu 于 2009-11-27 11:26 编辑 ]

梦冥 2022-09-01 22:25:39

不错,大侠们继续努力,菜鸟正在学习中..........哈哈

怪异←思 2022-09-01 21:56:29

哦。你的理解不对。move的时候系统会作检查,不对的数据是不能让你move成功的。

还没有到“decimal data error"的阶段,程序早已经报错了。你那非法的move没有办法成功运行。

叫思念不要吵 2022-09-01 19:33:56

还有就是赋值引起的吧,比如说用MOVE一个数字型的字符给数字。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文