博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
delphi 新版内存表 FDMemTable
阅读量:4881 次
发布时间:2019-06-11

本文共 6753 字,大约阅读时间需要 22 分钟。

c++builder XE

官方demo最全60多个

http://community.embarcadero.com/blogs?view=entry&id=8761

 

FireDAC.Comp.Client

 

用好FDMemTable代替之前的ClientDataSet,以前ClientDataSet内存表转换太繁琐了步骤。

TClientDataSet *cds = new TClientDataSet(this);

DataSetProvider1->DataSet = dm->ADOQueryPub;
cds->ProviderName = "DataSetProvider1";
cds->Open();

 

一句就可以了

FDMemTable1->CopyDataSet(dm->ADOQueryPub, TFDCopyDataSetOptions() << coStructure << coRestart << coAppend);

 

多用FDMemTable,不再用ClientDataSet\DataSetProvider1做转换了

FDMemTable2->Data = FDMemTable1->Data;

FDMemTable2->CopyDataSet(FDMemTable1, TFDCopyDataSetOptions() << coStructure << coRestart << coAppend);

 

建立缓存表

复制代码

FDMemTable1.Close();
FDMemTable1.FieldDefs.Clear();
FDMemTable1.FieldDefs.Add('ID', ftInteger, 0, True);
FDMemTable1.FieldDefs.Add('Name', ftString, 20, false);
FDMemTable1.CreateDataSet();
FDMemTable1.AppendRecord([101, 'aaa']);
FDMemTable1.AppendRecord([102, 'bbb']);
FDMemTable1.AppendRecord([103, 'ccc']);
复制代码

0)FDMemTable1.SourceView遍历各行数据,取任意行数据无需Next移动指针了。TFDDatSView

for (int i = 0; i < FDMemTable1->SourceView->Rows->Count; i++)

{
Caption = FDMemTable1->SourceView->Rows->ItemsI[i]->GetData(1);
}

FDMemTable1->SourceView->Rows->ItemsI[i]->GetData("fieldName");//取指定行指定字段名的值

}

9行7列的值。

FDMemTable1.Data.DataView.Rows.ItemsI[9].ValueI[7];

FDMemTable1.Table.Rows[i].ValueI[oCol.Index]

Caption = FDMemTable1->SourceView->Rows->Count;//过滤后1条

Caption = FDMemTable1->Table->Rows->Count;//过滤无效,全部记录3条

 

iMax := 0;

for i := 0 to FDQuery1.SourceView.Rows.Count - 1 do
if FDQuery1.SourceView.Rows[i].GetData('id', @iVal) and (iVal > iMax) then
iMax := iVal

数据集拷贝,复制数据集,合并数据集

FDMemTable1->Filter = "id=102";

FDMemTable1->Filtered = true;

FDMemTable1只有1条记录

1)Data

FDMemTable2->Data = FDMemTable1->Data;

 

FDQuery->Open("select * from tt");

FDMemTable2->Data = FDQuery->Data;

 

FDMemTable2是全部记录,有3条记录。

FDMemTable1->Delete();后的记录不在Data里。

2)CopyDataSet

带结构拷贝

FDMemTable2->CopyDataSet(FDMemTable1, TFDCopyDataSetOptions() << coStructure << coRestart << coAppend);

FDMemTable2->CommitUpdates();

缓存更新用到changeCount,所以copy完后加上CommitUpdates

 

不带结构,仅拷贝数据,字段个数可以不一致,字段数以目标数据集FDMemTable2为标准。

FDMemTable2->CopyDataSet(FDMemTable1, TFDCopyDataSetOptions() << coRestart << coAppend);

//第二个参数默认是coRestart << coAppend,所以下面就更简单了。

FDMemTable2->CopyDataSet(FDMemTable1);

FDMemTable2只有1条记录

3)CopyRecord\CopyField

copy the current record field values .Only One Record

FDMemTable2->CopyDataSet(FDMemTable1, TFDCopyDataSetOptions() << coStructure);

FDMemTable2->Edit();
FDMemTable2->CopyRecord(FDMemTable1);

4)CloneCursor

All Record, ignore filter

CloneCursor,数据共享,一个修改,另一个也修改了,但是FDMemTable1->Close之后FDMemTable2还正常显示。

FDMemTable2->CloneCursor( FDMemTable1);

2016.3.4 test 不能排序,FDMemTable2->IndexFieldNames = "ID";不起作用,所以尽量不建议用这个方式。

5)AtrachTable

All Record,ignore filter,TFDDatSTable

FDMemTable2->AttachTable(FDMemTable1->Table, NULL);

//or

//FDMemTable2->AttachTable(FDMemTable1->Table,FDMemTable1->View);

FDMemTable2->Open();

6)FilteredData

FDQuery1.Filter := 'upper(name) like ''D%''';

FDQuery1.Filtered := True;
// copy to FDMemTable1 all FDQuery1 visible (where name starts from D) records
FDMemTable1.Data := FDQuery1.FilteredData;

RecordCount是过滤后的记录数。过滤前有100行,过滤后有5行,那么RecordCount就是5

7)XMLData
All Record ignore filter
Memo1->Text = FDMemTable1->XMLData;
FDMemTable2->XMLData = Memo1->Text;

FDMemTable1->ChangeCount,

通过Data赋值,默认全部记录都是修改过的,也就是ChangeCount=RecordCount,有100条记录,获取ChangeCount属性就是100.这样合适还是不合适呢?
FDMemTable1->Data = FDQuery->Data;
FDMemTable1->CancelUpdates();或者FDMemTable1->CommitUpdates();
加上CancelUpdates这句话,ChangeCount就正常了!!反应真实的修改记录数。
Append的记录需要把属性CachedUpdates设为true,ChangeCount就正确了。
8)Delta
IFDDataSetReference类型
FDMemTable2->Delta= FDMemTable1->Delta;

ADMemTable1.FilterChanges := [rtModified, rtInserted, rtDeleted];

ADMemTable1.Data := ADQuery1.Delta;

9)查看删除过的记录UpdateStatus

FDMemTable想要找到并显示删除的记录

FDMemTable1->Delete();
FDMemTable2->FilterChanges << Firedac::Comp::Dataset::rtDeleted;
FDMemTable1->Data = FDMemTable1->Data;
while (!FDMemTable1.eof)
{
if( table->UpdateStatus() == usDeleted)
...
}
默认是不显示删除过的记录的,FilterChanges不包括rtDeleted属性。
10)分页及加载全部页
FetchOptions的Mode默认是fmOnDemand表示分页,每页50,改为fmAll表示全部记录。
分页TFDFetchOptions.RowsetSize
FetchNext
FetchAll
FetchOptions.RecordCountMode property

FDQuery1.Open;

FDQuery1.FetchAll;//必须加这一句,否则数据集不全。
FDMemTable1.Data := FDQuery1.Data;
用了grideh,为何导致分页不灵了???全部记录出来了?field设置了ftsum导致,不设置每次就50行记录。

LocateEx

11)增强的Locate功能LocateEx、LookupEx函数

lxoCheckOnly If included, then LocateEx does not:

Change the current position. Fire BeforeScroll / AfterScroll events. Finish editing mode
不改变位置和编辑状态的搜索,强大!
12)刷新数据集
query1.Refresh();

13)只读字段

select '' as temp,flag=0,sql返回的虚拟字段,以前clientDataSet可以修改,FDMemTable里不能改了。
ClientDataSet1->FieldByName("flag")->AsString="1";
但是FDMemTable不能改了。怎么办?以前的这种虚拟字段的方式挺好用啊。
解决办法:设置属性TFDMemTable.UpdateOptions.CheckReadonly=true

14)主从表关系

第一步:
fdqueryDetail.MasterSource := DataSource1;
第二步:
fdqueryDetail.MasterFields := 'OrderNo'; { 多个字段时用分号隔开 }
或者
fdqueryDetail.sql.text='select * from OrderDetail where OrderMasterKey=:OrderMasterKey';

两个FDMemTable做主从怎么不起作用呢?

15)过滤数据FilterChanges

只显示修改后的数据
ClientDataSet1->FilterChanges = TFDUpdateRecordTypes() << Firedac::Comp::Dataset::rtModified;

ClientDatSet用Grideh可以排序,添加EhLibCDS.pas文件即可。

TFDMemTable添加EhLibFireDAC.pas怎么不起不能排序,报错TFDMemTable is not SQL based dataset,FDQuery排序可以了
把SortLocal=true,也不能排序,报错 TSQLDatasetFeaturesEh can not sort data in dataset "FDMemTable1" in local mode
TFDMemTable不能排序,ClientDatSet替换为TFDMemTable的进程又得延缓.
比较和跟踪源码,Delphi里TFDMemTable排序正常。c++builder新建一个工程添加内存表和数据也排序正常。

最终解决了,原来是旧的ehlib控件卸载不干净,原来的工程里还有路径和ehlib.lib文件的链接,清除后排序全部OK!

FDQuery.Fields.DataSet ?这也是数据集?
Data.DB.TFields.DataSet
Identifies the dataset to which a TFields object belongs.
A DataTable or a DataView must be supplied. Hint: if that is TFDMemTable, use CreateDataSet or CloneCursor to open dataset

TFDDataSet 基类

fdquery,dbgrideh控件的ftsum字段求和影响

C++Builder 返回数据集

_di_IFDDataSetReference

16)已有数据的FDMemTable添加列,动态添加列

原有数据集,现有数据集,现有字段,原有字段,添加新增选择列
FDMemTable2.FieldDefs := FDMemTable1.FieldDefs;
FDMemTable2.FieldDefs.Add('Test', ftString, 20 { , False } ); // default parameter
FDMemTable2.FieldDefs.Find('Test').Index := 0;
FDMemTable2.CreateDataSet; // or just Open that sets Active to true;
FDMemTable2.CopyDataSet(FDMemTable1);

17)缓存更新

FDMemTable1->ChangeCount
执行了ApplyUpdates或CommitUpdates后ChangeCount变为0
FDMemTable1->ApplyUpdates(0);

C++builder Berlin //Berlin 排序无效 2017.3.12

delphi正常

升序

self.FDMemTable1.IndexFieldNames := 'ID:A';

降序

self.FDMemTable1.IndexFieldNames := 'ID:D';

FDMemTable1->IndexFieldNames = "ID:D";

FDMemTable1->CloneCursor(m->dsModule, true, true);
CloneCurso的数据集均无法用IndexFieldNames排序。用CreateDataSet创建的数据集排序正常!

Data赋值、CopyDataSet后的数据集均排序可以正常。建议不用CloneCursor。

转载于:https://www.cnblogs.com/Thenext/p/9549380.html

你可能感兴趣的文章
Java中String类(字符串操作)的10个常见问题和解决方法
查看>>
电子书下载:Microsoft Windows Workflow Foundation 4.0 Cookbook
查看>>
centos7用docker安装elasticsearch5.6.13的主从
查看>>
jmeter跟随重定向与自动重定向区别
查看>>
Python:GeoJson格式的多边形裁剪Tiff影像并计算栅格数值
查看>>
免费下载知网文献的方法 | sci-hub免费下载SCI论文方法
查看>>
测试用例,变量之间,相互调用的方法,和修改原来初始化变量的方法
查看>>
ASP.NET MVC中将控制器分离到类库的实现(转)
查看>>
Poj 2304 Combination Lock(模拟顺、逆时钟开组合锁)
查看>>
Palindrome Number
查看>>
H5上传功能
查看>>
three.js尝试(二)模拟游戏开发:3D人物在地图上行走
查看>>
PHP命名空间(Namespace)的使用详解
查看>>
java项目@override报错问题
查看>>
DataTable 和Json 字符串互转
查看>>
Django中Template does not exit
查看>>
Redis安装 java中的连接 序列化 反序列化
查看>>
hdu 1896 优先队列的应用
查看>>
递推和迭代的比较
查看>>
12306HTTP请求过程
查看>>