名词解释:什么是 decimal data error
朋友们一定碰到过这种问题吧?可是究竟清不清楚这是什么错误呢?
原来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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
楼下回答
在命令行调用时,如果程序接口参数有数字的,需要使用16进制的方式,否则是没法正确的传入数据的..
分析的很透彻,在命令行用CALL PGM PARM()的时候最容易出现这种十进制错误,因为*ENTRY里默认的数字类型是P型
有时数据结构改变了,而没有重新编译程序,当程序想文件写入记录时也可能发生这种错误..
总之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 编辑 ]
不错,大侠们继续努力,菜鸟正在学习中..........哈哈
哦。你的理解不对。move的时候系统会作检查,不对的数据是不能让你move成功的。
还没有到“decimal data error"的阶段,程序早已经报错了。你那非法的move没有办法成功运行。
还有就是赋值引起的吧,比如说用MOVE一个数字型的字符给数字。