VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: dai87331

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

[复制链接]

0

主题

9

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-7-22 12:15:01 | 显示全部楼层
呵呵,看来这个问题的难度是不小,综合看来,有多种解决方案,当然问题主要出在Borland身上
1、修改ADODB.pas的源代码,也就是修改从Recordset转换成DataSet的字段定义部分,这个问题很多人讨论过,强行修改decimal的对应关系
2、修改DB.pas的源代码,也就是如果ADO调用的时候直接从Recordset中取数据
3、建立一个新的自定义字段类,譬如TDoubleField,然后自行定义,当然这个时候也得修改ADODB.pas及DB.pas的源代码

以上三种方法是一劳永逸的方法,最好是第3种方法

第4种方法,这种情况适用于此类字段比较少的情况,就是修改字段的GetText和SetText方法,譬如

procedure TForm1.ADOQuery1DecFieldSetText(Sender: TField; const Text: String);
begin
  ADOQuery1.Recordset.AbsolutePosition:=ADOQuery1.RecNo;
  ADOQuery1.Recordset.Fields[1].Value:=Text;
end;

procedure TForm1.ADOQuery1DecFieldGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
  ADOQuery1.Recordset.AbsolutePosition:=ADOQuery1.RecNo;
  Text:=VarToStr(ADOQuery1.Recordset.Fields[1].Value);
end;

当然,由于Borland的先天不足,实际代码可能还要多一些,要加入很多判断,其实基本原理和前面的方法差不多,就是绕开Borland的字段定义,直接向Recordset中写数据

5、这种方法一般太罗索,就是直接绕开数据感应控件去操作,这样可以随心所欲了。

综合看来,第3种方法最好
回复

使用道具 举报

1

主题

27

帖子

24.00

积分

新手上路

Rank: 1

积分
24.00
 楼主| 发表于 2020-7-24 18:45:01 | 显示全部楼层
似乎delphi根本没有哪个浮点数据类型能表示123456789012.12345678
这个数值(除了Variant,Variant在3层系统中不方便使用)。
Double,Extend都不行

.net中有decimal类型,可以表示29位数字。
delphi2006 for win32仍未支持decimal类型。

所以,上面的几种方法都不太可行,
方法4,5或许可行,但是改动太大。
暂时不做修改了,只支持15位精度。
回复

使用道具 举报

0

主题

9

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-7-25 19:15:02 | 显示全部楼层
如果想改动小,第4种方法最简单,把这两个写为通用过程,然后有字段的地方调用即可。

然后打开表的时候动态设置字段的OnGetText和OnSetText事件为通用过程即可,这个相对简单很多,窗口不用任何改动。

其实数据库在Delphi后台所有的数据均为文本传递,当OnSetText的时候才转换,所以最早说的通过string控制decimal数据既是如此,其实Delphi本身就是通过string控制decimal数据,这个可以去看DB.pas的源代码。
回复

使用道具 举报

1

主题

27

帖子

24.00

积分

新手上路

Rank: 1

积分
24.00
 楼主| 发表于 2020-7-26 16:30:01 | 显示全部楼层
方法4对adoquery确实可以

但是在3层结构中:
ClientDataSet-->DataSetProvider-->AdoQuery-->DataBase
这种情况就无能为力了
回复

使用道具 举报

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

本版积分规则

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

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