首页 TClientdataset 使用教程1

TClientdataset 使用教程1

举报
开通vip

TClientdataset 使用教程1 http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  TClientdataset  使用教程  本教程对应 DEMO地址:http://datasnap.5d6d.com/thread‐235‐1‐1.html  为了书写方便,在本教程中,把 TClientdataset...

TClientdataset 使用教程1
http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  TClientdataset  使用教程  本教程对应 DEMO地址:http://datasnap.5d6d.com/thread‐235‐1‐1.html  为了 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 写方便,在本教程中,把 TClientdataset简称为 CDS,全文中除了特别注明名,CDS 就 是指  TClientdataset控件  另教程内部的说明,并不是系统性的,对一些还另有实现方法的地方,并不会做说明,所 以教程里面的实现方法,并不是唯一的!  另本 PDF文档只是一部份,后面的会跟据上课内容补全  各位朋友,写此教程,只是为了交流本人水平低,其中存在武断及错误在所难免,如果发现 有错,希望你加我的 QQ:121810267  给我说一声,谢谢!    本人的 delphi小站:http://datasnap.5d6d.com 专注 delphi管理软件开发,不求火爆,只求 专业,希望你能多多支持:  下面是本站的系列群:  ⑦DATASNAP[DELPHI]三层:193300710(500 人新群,大量空位)  ⑥DATASNAP[DELPHI XE2 交流]:122104774(500人,专注新技术交流,不学习新技术的免)  ⑤DATASNAP[DELPHI]三层:8964240 (500 人)  ④DATASNAP[DELPHI]三层:81666221(200 人,RO方向,快满 )  ③DATASNAP[DELPHI]三层:19905713(500 人,快满)  ②DATASNAP[DELPHI]三层:41464226(500 人已满)  ①DATASNAP[DELPHI]三层:67803772(500 人已满)  另:YY 万人群:5289583    YY 语音室:81800755(不定期进行 delphi免费培训)    1. 简介    TObject‐>Tpersistent‐>Tcomponent‐>TDataSet‐>TCusTomClientDataset‐>TClientDataSet  源文件所在 pas: DBClient.pas(XE2 为  Datasnap.DBClient.pas) TClientDataSet 是一个访问内存中数据的数据集。内存中的数据可以是临时的 (在创建后到程序运节结束丢失),也可以从一个本地文件装入,修改后保存回 本地文件中,也可以由一个数据集合通过使用一个 DataSetProvider 控件从另一 个数据集合中导入。 从 MIDAS.dll 到 MidasLib 单元 要想运行一个使用了Tclientdataset控件的应用程序,还需要部署由DSintf.pas 单元引用的 midas.dll 动态库。Clientdataset 控件的核心代码不属于 VCL,而 且不存在它的源代码格式。MIDAS 库是一个 c++语言库,但是它能够被直接联 编到一个可执行文件中:通过包含特定的 MIDASLIB 单元,这个单元是官方通 过特殊格式,使用已编译的 c/C++代码通过汇编而产生的一个特殊的 DCU,包含 此单元后,大家就不需要发布独立于应用程序的 dll XML 与 CDS 格式 2、入门示例 2.1 加载及保存数据 往 CDS 里面加载数据的方式很多,不过用得最多的是从文件装入及通 http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  过 TDataSetProvider 连接到另一个数据集装入. 操作说明: 1、 依次在界面上放入如何图所示控件(注:在平时操作中, DBGrid1 到 DataSource1 及 DataSource 到 ClientDataSet 之间的关联,都是 直接通过界面设置,现通过代码,只是为了方便大家设置) 2、 在 formcreate 中写下如下代码: procedure TForm1.FormCreate(Sender: TObject); begin DataSource1.DataSet :=ClientDataSet1 ; DBGrid1.DataSource :=DataSource1 ; DBNavigator1.DataSource := DataSource1 ; end; TClientDataSet 的使用,可以独立于任何控件,但是这样只能使用有限的功能, 在Delphi 的VCL体系中,随处可以见到控件之中相互协调,而在TClientDataSet 查关数据库编程上面,此优点显示得更明显,通过设置一些数据库控件的属性的 关联就能实现很多功能,从而让很多人对 DELPHI 误解,认为 delphi 是一个只 我们现在代码中的 TDataSource(数据源控件) 控件,起的是一个承上启下 的作用,上面连接一个 TDATASET(数据集控件) ,下面连接数据感知控件。 TDBNavigator 是一个有简单导航功能的控件,而 DBGrid 则是一个强大的数据 显示表格控件,他显示 DataSource(数据源控件)所提供的 DATASET(数据集 控件)中的所有数据,并标明当前所处的行。 3、 从文件装入数据 (注:本小节中的 CDS 是指文件格式而非 TClientDataSet 控件) TClientDataSet 支持两种格式的数据文件,一种是 CDS 格式的,另一种是 XML 格式的,CDS 格式是 TClientDataSet 默认的格式,而 XML 则为通用格式,CDS http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  格式相比 XML 格式小得多,使用效率也高一些,而 XML 则适用于数据交换,各 有其特点。 文件格式的数据装入 TClientDataSet 后,我们可以对其进行修改,并保存回文 件中,由于是整个文件的读入内存,所在我们在同一时间只能有一个用户打开并 修改文件,否则后面修改的将覆盖前面的内容。 TClientDataSet 读入数据不受扩展名的限制,就算你把文件扩展名改为.exe 也 能正常的识别,但是在保存时,则有不同,如果想保存为 XML 格式,必须指定 XML 的扩展名. 由于打开文件不需要指定扩展名,所以打开文件的代码相对简单些,如下 procedure TForm1.Button1Click(Sender: TObject); var FileName:string; begin if not OpenDialog1.Execute then exit; FileName:=OpenDialog1.FileName; if fileexists(FileName) then clientdataset1.LoadFromFile(FileName); end; 如果我们选择的文件格式不对,则会出现提示:Mismatch in datapacket 但是如果是损坏的文件或者是部份格式不符的 XML 文件,则会出来读取地址错 误的提示: Access violation at address 41414141.read of address 41414141。 4、 把修改结果保存回文件 需要把修改后的数据保存回文件,代码如下: procedure TForm1.Button2Click(Sender: TObject); var FileName:string; begin if not SaveDialog1.Execute then exit; FileName:=SaveDialog1.FileName; clientdataset1.SaveToFile(FileName); end; 如果我们指定了 XML 的扩展名,则保存为 XML 格式,否则保存为 CDS 格式。 注:不是所有格式的 TClientDataSet 都可以保存为 XML 格式,但是肯定都可以 保存为 CDS 格式。 5、 从数据库装入数据 在没有三层软件开发的时候,QQ 群里面的很多朋友,不只一个地对我说,CDS 控件很重要,你得学好他,可是我不理解,因为要使用他太麻烦了,我不知道二 层的系统里面,ADO 是否是最适合的解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 ,但是在二层里面如果你使用了 CDS,会给你增加不少的工作量,是否值得,则不好一概而论,因为一个控件如 果你不深入使用的话,很多功能你会一次对其视而不见,对 ADOQUERY 及 CDS 控件也是这样,在开始编写本教程的时候我看了下源码,又去了万一的 BLOG 看了下,发现 CDS 的功能比我想到的,要复杂得多,至于让我觉得,我要把 CDS 的所有功能写下来,是不太现实的事情,不过我将慢慢的尝试,或许亮点,就会 http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  在哪不经意之间。 在哪时候,经常在想哪些批量录入多条数据再保存的商业控件是多么的复杂,等 用到了 CDS 后,却发现,这不是每天都使用的编程方式吗? 该 DataSetProvider 出场了,DataSetProvider 有着 DataSource 相近的功能, 哪就是他是一个中间组件,DataSource 是处于同一 EXE 内部的控件关联,而 DataSetProvider 主要是在 SERVER 与客户机之间关联,有了 DataSetProvider, 服务器与客户端之间就变得透明了。 关于 DataSetProvider 的讨论,应该是属于三层的范围了,所以这儿也不做太多 的说明,只是把与我们的 DEMO 相关的地方一笔带过,更多的细节,则期待高 的们的分布式系统相关的课程。 ClientDataSet 要与数据库相联,我不知还有没有别的方式,但是我所了解的, 是只能通过 DataSetProvider 再联到另一个数据集,对于本地数据,其本上是多 此一举,不过今天为了解说过程中不去面对复杂的网络部份,我也就多此一举一 回。 SQLDataSet DBX 里面的重要控件之一,其单向只读的属性让他有了太多的限 制,但是也因为如此,才让 DBX 并的有趣起来。 回到我们的主题,现在,我们就通过相关控件,用 DBX 连接到我的本面 SQLSERVER 数据库。 SQLConnectionDBX 是用于连接到数据库的组件,遗憾的是,他不支持 acess 的数据库,所以让我们的 DEMO 不得不选择其它的数据库,FB 是一个可替代的 解决方案,但是 FB 熟悉的朋友并不多,所以我们还是选用大家最熟悉的 sql server 吧 http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  到数据库的连接最应该是在 ini 里面配置,然后再加载,不过由于时间的原因, 此处我就进行简单的设置了,在 Derver 里面选上 mssql ,然后填上 IP,数据 库,登录用户名密码,再把 loginPormpt 设置为 false 我们可以把 connected 设置为 true 来测试我们的设置是否正确,如果不正确, 应该会报错误出来。 后面控件的设置,见代码: procedure TForm1.Button6Click(Sender: TObject); begin ClientDataSet1.Close ; if not SQLConnection1.Connected then SQLConnection1.Open ; SQLDataSet1.SQLConnection :=SQLConnection1; DataSetProvider1.DataSet :=SQLDataSet1 ; DataSetProvider1.Options :=DataSetProvider1.Options + [poAllowCommandText] ; ClientDataSet1.ProviderName := 'DataSetProvider1'; //此处修改为你的 SQL 语句 ClientDataSet1.CommandText:='Select * From ConfigurationInfo '; ClientDataSet1.Open ; end; 由于在 CDS 打开时,我们设置相关的属性会报错,所以我们先关闭 CDS 然后先把数据库的连接打开 设置 SQLDataSet1 的连接属性 设置 DataSetProvider1 的数据集属性 DataSetProvider1.Options:=DataSetProvider1.Options+ [poAllowCommandText] ; 上面这一行,是最重要的一行,因为默认 DSP 并不支持客户端直接传 SQL 语句, 对一个多层系统,这样做是有可能很不安全的。 我们把 DataSetProvider1.Options 下面的 poAllowCommandText 设置为 TRUE ,而此处的 DataSetProvider1.Options 是一个集合,对集合的操作,需要 使用对应的语法,如果你想找普通的 poAllowCommandText:=true 相近的语 法,哪你一定会走进死胡同,怀疑自己的同时,或许你也在怀疑 delphi ,为什 么只让我以 RAD 的方式设置,而不支持代码去设置呢? CDS 通过 ProviderName 关联上 DSP 后,为 CommandText 指定你需要的 SQL,再 OPEN ,大功告成。 其实,SQL 语语不一定就写在 CDS 里面,看下面的代码,有什么不一样的吗? procedure TForm1.Button5Click(Sender: TObject); begin ClientDataSet1.Close ; if not SQLConnection1.Connected then SQLConnection1.Open ; SQLDataSet1.SQLConnection :=SQLConnection1; //此处修改为你的 SQL 语句 SQLDataSet1.CommandText:='Select * From ConfigurationInfo '; DataSetProvider1.DataSet :=SQLDataSet1 ; http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  ClientDataSet1.ProviderName := 'DataSetProvider1'; ClientDataSet1.Open ; end; 在 ADOQUERY 中,只要光标移出当前记录,数据就会直接保存到数据库中了 (批量模式除外),而在 cds 中,想要保存数据还要再多下一条命令,否则你再 次查询时,你会发现你修改的数据又还原了。 procedure TForm1.Button7Click(Sender: TObject); begin if ClientDataSet1.ChangeCount >0 then ClientDataSet1.ApplyUpdates(0); end; ChangeCount 是代表更改的记录数 ApplyUpdates 是提交指今 其中 参数 0 在表示不允许错误。 参数-1 表示允许任何错误。 参数为正数表示允许的错误个数. 2.2 action 动作组件与 dataset 的配合与基本数据集操作 Action 组件在菜单权限等地方,用的相当多,各种技术,无需一一道出, 不过不得提及的是,action 与 Tdataset 的完美配合。 Action 的 onUpdate 事件,是代表其状态的更新。 Action 的 Execute 事件,是代表我们执行此动作时的代码。 Tdataset 的 state 表示当前数据集的状态,其取值有常用的 dsBrowse(浏 览), dsEdit(编辑), dsInsert(新增) 及其它的基本用不上的即时状态以及 dataset 的一些常用属性,isempty、bof 、eof 等 两个结合起来,就可以实现相关的控制需求 //插入、编辑、删除等 需求在浏览状态下可用的代码 procedure TForm2.actinsertUpdate(Sender: TObject); begin (Sender as TAction).Enabled := ClientDataSet1.Active and( not (ClientDataSet1.State in dsEditModes) ); // and (not ClientDataSet1.IsEmpty ) //删除的要再判断是否为空 end; //保存,撤销等需要在编辑状态下可用的代码 procedure TForm2.actsaveUpdate(Sender: TObject); begin (Sender as TAction).Enabled := ClientDataSet1.Active and (ClientDataSet1.State in dsEditModes); end; //移动记录的控制代码 procedure TForm2.actfirstUpdate(Sender: TObject); http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  begin //第一条、上一条 (Sender as TAction).Enabled := ClientDataSet1.Active and (not ClientDataSet1.IsEmpty ) and (not ClientDataSet1.Bof ); end; procedure TForm2.actnextUpdate(Sender: TObject); begin //下一条,最后一条 (Sender as TAction).Enabled := ClientDataSet1.Active and (not ClientDataSet1.IsEmpty ) and (not ClientDataSet1.eof ); End 进入相关的操作状态的代码很简单,我就不做过细的解说,直接贴上代码, 应该是很容易懂的: //在当前记录前插入数据 ClientDataSet1.Insert ; //在数据集的最后追加数据 ClientDataSet1.Append ; //编辑当前记录 ClientDataSet1.Edit ; //对当前所作的修改保存,ADO 会直接保存在数据库(非批量模式),CDS 则 只是保存到内存表 ClientDataSet1.Post ; //删除当前记录 if Application.MessageBox(PChar('确认删除当前记录?'), PChar('提示信息'), MB_OKCANCEL + MB_ICONQUESTION + MB_TOPMOST) = IDOK then begin ClientDataSet1.Delete ; end; //撤销当前记录的 post 之前的修改,注意:只能撤销当前记录 ClientDataSet1.Cancel ; //移动到第一条 ClientDataSet1.First ; //移动到上一条 ClientDataSet1.Prior ; //移动到下一条 ClientDataSet1.Next ; http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  //移动到最后一条 ClientDataSet1.Last ; //移动到指定记录,正数为向前,负数为向后,超过则移到最近的一条 if not ClientDataSet1.Active then begin Application.MessageBox(PChar('请先加载数据! '), PChar('提示信息 '), MB_OK + MB_ICONINFORMATION + MB_TOPMOST); Abort; end; ClientDataSet1.MoveBy(StrToIntDef(Edit1.Text,0) ) ; 2.3  数据过滤;  CDS  的数据过滤功能在 delphi 2007  以下版本中,有一个 bug  ,哪就是如果你是 单个汉字的话,就有可能出错,不过些问题在新的版本中已解决,还用老版本的 就要注意一下。  过滤功能在三方的 grid 控件里面做得很强大,有一些是利用 cds本身的功能,有 一些则是自己实现了另一个内存表,此次课程中,我们只说 CDS自带的两个过滤 方法中最常用的一个:  最简单的代码为:  ClientDataSet1.Filtered :=False ;  ClientDataSet1.Filter :=你的过滤表达式  ;  ClientDataSet1.Filtered :=True ;  当 clientdataset  的过滤条件设置为 TRUE时,你的过滤条件就会生效。  下面列举一些 delphi 支持的过滤表达式:  运算符或函数的比较 1、=(等于)                    示例: State = 'CA'  2、<>(不等于)              示例: State <> 'CA'  3、>=(大于或等于)      示列:DateEntered >= '1/1/1998'  4、<=(小于或等于)示例:  Total <= 100,000      5、>  (大于)            示例:Percentile > 50      6、<  (小于)            示列:Field1 < Field2      7、BLANK(空白)      示列:State <> 'CA' or State = BLANK      注:除非明确的包含在过滤器中,否则空白条件是不会出现的  8、IS NULL(值为 NULL)示例:Field1 IS NULL  9、IS NOT NULL(值不为 null)示例:  Field1 IS NOT NULL.  逻辑运算符 10、and(并且)        示例:State = 'CA' and Country = 'US'  11、or(或者)          示列:State = 'CA' or State = 'MA'      12、not  (并非)      示例:not (State = 'CA')  算术运算符 13、+(加) 示例:Total + 5 > 100 注:此运算符适用于数字、日期(时间)和字符串 http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  14、‐(减)                    示例:Field1 ‐ 7 <> 10      注:此运算符适用于数字、日期(时间)  15、  *(乘)            示例:Discount * 100 > 20  注:只适用于数字  16、/(除)              示例:    Discount > Total / 5 注:只适用于数字  字符串函数 17、Upper(转为为大写)示例:  Upper(Field1) = 'ALWAYS'      18、Lower(转换为小写)示例:  Lower(Field1 + Field2) = 'josp'  19 、 Substring ( 取 子 串 )     示 例 : Substring(DateString,8)  =  '1998'  |  Substring(DateString,1,3) = 'JAN'  20、Trim(去除字符串前后的空格)示例:Trim(Field1 + Field2) | Trim(Field1, '‐')      21、TrimLeft(去除左边空格)      示例:TrimLeft(StringField) | TrimLeft(Field1, '$') <>    22、TrimRight(去除右边空格)  示例:  TrimRight(StringField) | TrimRight(Field1, '.') <>    日期时间函数 23、Year(年)        示例:Year(DateField) = 2000        24、Month(月)    示例:Month(DateField) <> 12        25、Day(日)    示例:Day(DateField) = 1        26、Hour(时)  示例:  Hour(DateField) < 16        27、Minute(分)示例:Minute(DateField) = 0        28、Second(秒)    示例:Second(DateField) = 30      29、GetDate(取当前日期时间)    示例:GetDate ‐ DateField > 7    30、  Date(日期)    示例:DateField = Date(GetDate)      31、Time(时间)示例:  TimeField > Time(GetDate)      杂项 32、Like(模糊匹配)  示例:  Memo LIKE '%filters%'  说明:  Works  like SQL‐92 without  the ESC  clause. When applied  to BLOB  fields, FilterOptions  determines whether case is considered.(翻译可能不对:类似于没有 ESC 子句的 SQL- 92 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 代码。当应用到 BLOB 字段,则跟据 FilterOptions 的情况来考滤)  33、In(在..里面)    示例:Day(DateField) in (1,7)    说明:类似 SQL- 92。第二个参数是所有相同类型的值的列表。 34、*(部份通配符)  示例:  State = 'M*'  TFilterOptions 的定义: TFilterOption = (foCaseInsensitive, foNoPartialCompare); TFilterOptions = set of TFilterOption; 说明:指定过滤与否是区分大小写,以及是否允许部分比较筛选记录时。 设置 FilterOptions 指定过滤与否是不区分大小写字符串或字符字段过滤时,是 否允许不符合筛选条件的部分比较。 注:由于单向数据集不支持过滤器,当您设置的一个单向的数据集 FilterOptions 属性,它会引发一个异常。 默认情况下,FilterOptions 是一个空集。基于字符串字段的过滤器,设置 FilterOptions foCaseInsensitive 赶上一个字符串的所有变体无论资本化。 当在过滤器中的字符串用一个星号(*)结束后,它可以被用来匹配部分字符串。 要禁用部分字符串匹配和治疗星号作为文字字符在字符串比较,FilterOptions 包 括 foNoPartialCompare 注意:我们的 CDS 是双向的数据集或者是一个本地内存数据库 http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  现在,再来看我示例中的代码: procedure TForm2.Button2Click(Sender: TObject); var str:string; option:TFilterOptions; begin str:=Edit3.Text ; ClientDataSet1.Filtered :=False ; //关闭过滤器 option:=[];//设置过滤选项为空,此设置是默认的 if CheckBox3.Checked then begin option:=option+[foCaseInsensitive]; //设置是否区分大小写 end; if CheckBox4.Checked then begin option:=option+[foNoPartialCompare]; //设置 *等通配符是否支当做文 本来查找 end; ClientDataSet1.FilterOptions:=option; //设置过滤选项 if str<>'' then begin ClientDataSet1.Filter :=str ; //设置过滤表达式 ClientDataSet1.Filtered :=True ;//应用过滤器 end; 对过滤的,先说到这儿,其它的过滤,在后面的课程中,会再进行讲解 2.4  简单 locate 定位  CDS定位的方法有好几种,不过我们以上课内容为配套讲解,还有就是其它的定位方式 很少用,所以这一节,也只介绍  locate .  Locate  函数原型及参数介绍:  function TCustomClientDataSet.Locate(const KeyFields: string;      const KeyValues: Variant; Options: TLocateOptions): Boolean;  KeyFields:需要定位的字段集合,多个字段之间用分号分隔。  KeyValues:需要定位的字段值,是一个变态类型,如果有多个值的话,需要以数组方式 出现。  Options:选项    选项的定义原型为:  TLocateOption = (loCaseInsensitive, loPartialKey);      TLocateOptions = set of TLocateOption;  loCaseInsensitive  代码不区分大小写,而  loPartialKey  代表模糊定位    返回值,逻辑型,真为定位成功,假为没找到。  示例:  区分大小写,精确定位  http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  If clientdataset.locate(‘name’,’Boa’,[]) then Begin Showmesage(‘’定位成功!;) End; 不分大小写,精确定位  If clientdataset.locate(‘name’,’Boa’,[ loCaseInsensitive]) then Begin Showmesage(‘’定位成功!;) End; 不分大小写,模糊定位  If clientdataset.locate(‘name’,’Boa’,[ loCaseInsensitive, loPartialKey]) then Begin Showmesage(‘’定位成功!;) End; 多字段定位:  区分大小写,精确定位  If clientdataset.locate(‘name;size’, VarArrayOf([’Boa’,10]),[]) then Begin Showmesage(‘’定位成功!;) End; 不分大小写,精确定位  If clientdataset.locate(‘name;size’, VarArrayOf([’Boa’,10]), [ loCaseInsensitive]) then Begin Showmesage(‘’定位成功!;) End; 多字段的模糊定位没有测试成功,如果有测试成功的,希望能告诉我下。  DEMO中的单字段过滤代码就不再重复了,现在发下多字段的实现:  procedure TForm2.Button12Click(Sender: TObject); var MyValues: array of Variant; lst:TStringList; i:Integer ; option:TLocateOptions; begin lst :=TStringList.Create ; try // 先把字符串按分号分节 lst.Delimiter:=';'; lst.DelimitedText := Edit18.Text ; // 设置数组长度 SetLength(MyValues,lst.Count); // 写数组下标值 for I := 0 to lst.Count-1 do http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  MyValues[I] := lst[I]; // 选项,由于测试 loPartialKey 好像不起作用,所以没有加上 if CheckBox9.Checked then option:= [loCaseInsensitive] else option:= []; // 过滤,实际工作中请参考注释了的哪一行代码来写 ClientDataSet1.Locate(Edit17.Text ,MyValues ,option ) ; //ClientDataSet1.Locate('name;size',VarArrayOf([Edit15.Text ,Edit16. Text ]),[loCaseInsensitive,loPartialKey]); finally lst.Free ; end; end; 2.5 索引  简单索引:  示例 1、以 name列建索引  ClientDataSet1.IndexFieldNames:=’name’;  示例二、以  name、size建索引  ClientDataSet1.IndexFieldNames:=’name;size’;  简单索引的操作简单,但是功能也很有限,他只能升序排序,不能降序排序。  如果想要更复杂的,则需要用 AddIndex 了。  AddIndex    定义、    TIndexOption = (ixPrimary, ixUnique, ixDescending, ixCaseInsensitive, ixExpression, ixNonMaintained); TIndexOptions = set of TIndexOption; procedure AddIndex(const Name, Fields: string; Options: TIndexOptions; const DescFields: string = ''; const CaseInsFields: string = ''; const GroupingLevel: Integer = 0); TIndexOption 参数介绍  ,有资料说 ixUnique, ixDescending, ixCaseInsensitive ixNonMaintained 只能动态使用,没看 明白意思,有搞懂的希望能告知我。  ixPrimary(建立主键  dbase  不可用,不过,现在还有人用 dbase 吗?,还有,我们平时 的主键是唯一的,这儿我测试的结果是可以不唯一)  ixUnique(建立唯一索引)  ixDescending(建立包含降序列的索引,测试结果好像是指点了 DescFields,本参数也就 无效了)  ixCaseInsensitive(不区分大小写)  ixExpression(依运算结果排序,只适用于 Dbase,历史遗留品)  ixNonMaintained(当索引栏位有变动时,不自动更新索引,奇怪,为什么我测试此行没 http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  有效果呢,还请高手指点原因)  AddIndex  参数介绍  Name(索引名,唯一,不可重复)  Fields(字段列表,多个用分号分隔)  Options(相关选项,见上文介绍)  DescFields(降序排序字段,多个用分号分隔)  CaseInsFields(不区分大小写字段,多个用分隔符分开)  GroupingLevel(分组级别,后面用分组的示例中可以见到效果,默认 0,不分组)  示例:  以 size及 name列建立索引  ClientDataSet1.AddIndex('idx1','size;name',[]    );    ClientDataSet1.IndexName:='idx1';  以 size,weight,name建立索引,基中 weight 为降序  ClientDataSet1.AddIndex('idx1','size; weight;name',[],’weight’    );    ClientDataSet1.IndexName:='idx1';  以 size,weight,name建立索引,基中 size,weight 为降序,建立维一索引,不区分大小 写  ClientDataSet1.AddIndex('idx1','size; weight;name',  [ ixUnique; ixCaseInsensitive],’weight’    );    ClientDataSet1.IndexName:='idx1';      //恢复默认排序  ClientDataSet1.IndexName := 'DEFAULT_ORDER';  //删除索引  ClientDataSet1.DeleteIndex(‘idx1’);    2.6 Aggregates(聚合)  之(简单统计)    注:之所以说是简单统计,是因为本节只介绍简单功能,一些复杂应用,安排到后 面的章节中去完成,本小节只简单的介绍基本功能。  CDS 里面的 Aggregates 有很强大的功能,特别与索引等联合起来,会有一些原本想 不到的强大之处.  Aggregates的类型为:TAggregates    我们再看下 TAggregates  的定义  TAggregates = class(TCollection) private FOwner: TPersistent; function GetItem(Index: Integer): TAggregate; procedure SetItem(Index: Integer; Value: TAggregate); protected function GetOwner: TPersistent; override; public constructor Create(Owner: TPersistent); function Add: TAggregate; http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  procedure Clear; function Find(const DisplayName: string): TAggregate; function IndexOf(const DisplayName: string): Integer; property Items[Index: Integer]: TAggregate read GetItem write SetItem; default; end; 通过上面的代码,我们可以看到,从 TCollection 继承,表明他是一个容器对象,也就是 有 TCollection 的通用特性,在此也不做细入介绍,我们看下我们如何添加一个聚合对象 到其中。  在界面上放一个 tclientdataset 控件,选中后,按 F11  切换到  object inspector(对象浏览 器)  上,在  properties(属性)里面的第二项并是 aggregtes,选中后如图:    后面出现三个点,这表明里面还有更多的细节可供处理。  点击后,出现一个容器编辑框,点上面的新增项目后,如图    添加了一个项,  其中 active  代表是否可用,如果为 false则就算定义了,也不使用。  aggregateName  为聚合项的名称  Expression 为聚合表达式  http://datasnap.5d6d.com delphi分布式编程,专注 delphi管理软件开发,不求火爆,只求专注  系列 QQ 群 ⑦:193300710 ⑤:8964240 ③:19905713     ⑥:122104774[XE2新技术] ④:81666221[RO方向]  Groupinglevel  为分组级别,需要配合 indexname  使用。  indexName  是指所使用的索引名  visible  表示,是否显示  表达式(Expression)可选一些简单的函数及参与运算,但是不可以嵌套使用  操作 说明 Sum 求合 Avg 计算平均数 Count 统计非空记录条数 Min 求最小值 Max 求最大值 Sum(Qty * Price) 汇总 Qty * Price 的结果 Max(Field1) - Max(Field2) 列 1 的最大值减列 2的最大值 Avg(DiscountRate) * 100 求平均后再乘 100 Min(Sum(Field1)) 错误写法(同时也不符逻辑规定) Count(Field1) - Field2 错误写法(同时也不符逻辑规定) 设置好相关参数后,再设置 ClientDataSet1.AggregatesActive:=true;  此时就可以取值了,  ClientDataSet1.Aggregates.Find('聚合名称').Value ;  ClientDataSet1.Aggregates[0].Value  通过上面两种方法,都可以取到对应的计算结果.  下面再提供代码设置供参考  procedure TForm2.Button10Click(Sender: TObject); var i:Integer ; begin // 此处需要关闭了才能添加新的聚合 ClientDataSet1.AggregatesActive:=False ; //此处是判断同名的,就不添加了 if ClientDataSet1.Aggregates.IndexOf(Edit10.Text )>=0
本文档为【TClientdataset 使用教程1】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_687460
暂无简介~
格式:pdf
大小:308KB
软件:PDF阅读器
页数:16
分类:互联网
上传时间:2013-03-15
浏览量:71