VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2685|回复: 13

decimal(20, 8)在dataset中只能以TFloatField(EnableBCD=false)或TBCDField显示

[复制链接]

1

主题

27

帖子

24.00

积分

新手上路

Rank: 1

积分
24.00
发表于 2020-1-29 08:00:01 | 显示全部楼层 |阅读模式
decimal(20, 8)在dataset中只能以TFloatField(EnableBCD=false)或TBCDField显示:
1,如果使用TBCDField,则只能显示和输入4位小数;

2,如果使用TFloatField,则只能有15位有效数字,达不到精度要求

如何使用TFMTBCDField,或其它方式能达到显示和输入20位精度,8位小数位?
回复

使用道具 举报

0

主题

9

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-5-4 08:30:01 | 显示全部楼层
通过ADO连接数据库
回复

使用道具 举报

1

主题

27

帖子

24.00

积分

新手上路

Rank: 1

积分
24.00
 楼主| 发表于 2020-5-10 19:00:01 | 显示全部楼层
就是通过ado连接sql server
DataSet中产生的字段类型只能是TFloatField或TBCDField
达不到decimal(20, 8)的精度和小数要求
回复

使用道具 举报

0

主题

9

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-5-25 13:45:01 | 显示全部楼层
我真服了你了,在Delphi里难道只有这些字段存储数字吗?你难道不可以使用字符串?
32位小数的都做过。
回复

使用道具 举报

1

主题

27

帖子

24.00

积分

新手上路

Rank: 1

积分
24.00
 楼主| 发表于 2020-5-28 17:15:01 | 显示全部楼层
楼上的别着急

我这是3层的结构,DataSet字段也不是手动添加,况且整个系统中所有字段都手动添加也不现实

能不能介绍一下您的做法?多谢!
回复

使用道具 举报

1

主题

27

帖子

24.00

积分

新手上路

Rank: 1

积分
24.00
 楼主| 发表于 2020-5-29 08:15:01 | 显示全部楼层
再声明一下:

数据库中只能用decimal,不能用varchar,因为数据库有很高的速度要求,每秒并发数很大,需要计算,varchar和decimal的区别很大。
回复

使用道具 举报

1

主题

27

帖子

24.00

积分

新手上路

Rank: 1

积分
24.00
 楼主| 发表于 2020-5-29 13:00:01 | 显示全部楼层
另外在delphi的adoquery中手动添加一个字段,指定类型String
打开query时会有错误:
Type mismatch for field '' excepting: String actual: BCD.



请WayWon介绍一下您的做法,非常感谢!
回复

使用道具 举报

0

主题

9

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-6-28 18:15:01 | 显示全部楼层
在那里计算?

如果能直接计算,那可以在Delphi中设置字段类型为TCurrencyField即可
不想显示符号可以
Currency:=False;
但是注意
DisplayWidth:=20
就是你的字段长度,剩下的不用我说了吧

至于手动添加问题,这个很简单啊,不可能你所有的表都有这种字段吧,可以通过动态添加字段的方式,就这几个字段调整默认的TBCDField为TCurrencyField即可
回复

使用道具 举报

1

主题

27

帖子

24.00

积分

新手上路

Rank: 1

积分
24.00
 楼主| 发表于 2020-7-19 20:15:01 | 显示全部楼层
我想楼上的并未理解我的问题。

我的问题是:
数据库中decimal(20, 8)的数据类型在客户端如何输入,不考虑把数据库的decimal改为其他类型。就是怎么能输入12位整数8位小数的数字。
TCurrencyField本质上即是TFloatField,唯一区别是他的字段类型为ftCurrency。

TFloatField的精度是15位,decimal(20,8)的精度是20位,比如在客户端输入123456789012.12345678这个数值,这个数值对decimal(20,8)是合法的,可以直接在数据库中输入。但是TFloatField和TCurrencyField的精度是15位,在保存时会忽略后面超出的位,只把123456789012.123保存到数据库。TCurrencyField和TFloatField我做过测试。

如果手动添加字段,把类型定义为String会有Type mismatch for field '' excepting: String actual: BCD.错误。

如果手动添加字段,把类型定义为Variant,则可以实现,但只限于在adoquery中添加,3层结构中在adoquery中添加一个variant类型字段,再在TClientDataSet中打开DataSet或加入字段时会提示adoquery中variant类型的字段类型未定义。
回复

使用道具 举报

0

主题

7

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-7-21 05:15:01 | 显示全部楼层
WayWon ,兄台还是试验一下为好。
货币类型小数仅仅保存四位,
浮点的精度确实是15位,按照楼主的要求,我测试过,不能保存它要求的精度
楼主如果要使用字符,就必须使数据库类型和程序中的类型一致。
还有可恨的decimal类型,在数据库中确定可以保存小数点八位以后。但是在delphi中仅仅保存四位。设置了属性也不可以。原来看了楼主的帖子,还没有找到完美的解决方案!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表