Delphi 如何限制TFDMemTable中的记录数?
我有一个TFDMemTable,里面有数千条记录。有没有办法只限制前50次的结果记录 我尝试使用:Delphi 如何限制TFDMemTable中的记录数?,delphi,firedac,Delphi,Firedac,我有一个TFDMemTable,里面有数千条记录。有没有办法只限制前50次的结果记录 我尝试使用: FDMemTable.FetchOptions.RecsSkip := 0; FDMemTable.FetchOptions.RecsMax := 50; FDMemTable.Open; 但它不起作用,数据保持不变。我希望@Victoria能够向您展示一个更好、更全面的解决方案 方法,但至少有两种方法: 使用FD的FDLocalSQL功能将FDMemTable的前X行复制到, 创建一个FDQ
FDMemTable.FetchOptions.RecsSkip := 0;
FDMemTable.FetchOptions.RecsMax := 50;
FDMemTable.Open;
但它不起作用,数据保持不变。我希望@Victoria能够向您展示一个更好、更全面的解决方案 方法,但至少有两种方法:
- 使用FD的FDLocalSQL功能将FDMemTable的前X行复制到, 创建一个FDQuery,然后将它们复制回FDMemTable
- 对FDMemTable应用筛选器要筛选出其他记录,请使用FDBatchMove 将X记录复制到第二个FDMemTable中,然后将其复制回原始FDMemTable FDMemTable
FDLocalSQL1: TFDLocalSQL;
FDConnection1: TFDConnection;
FDQuery1: TFDQuery;
FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink;
然后执行如下代码:
procedure TForm3.CopyData1;
begin
FDConnection1.DriverName := 'SQLite';
FDConnection1.Connected := True;
FDLocalSQL1.Connection := FDConnection1;
FDLocalSQL1.DataSets.Add(FDMemTable1); // this is the source dataset
FDLocalSQL1.Active := True;
FDQuery1.SQL.Text := 'select * from FDMemTable1 order by ID limit 5'; // ID being an Integer field of the FDMemTable
FDQuery1.Active := True;
FDMemTable1.Close;
FDMemTable1.Data := FDQuery1.Data; // Re-opens FDMemTable 1, which now contains only the first X records
end;
FD的LocalSQL使用Sqlite完成它的工作。Sqlite的SQL中的函数等价物
“选择顶部X…”是其限制条款
当然,在任务中使用LocalSQL的一个优点是,因为LocalSQL
支持order by,您可以通过它来确定保留哪些(顶部)X记录
batchmove方法需要更少的代码,但需要有一种识别方法
第一个X使用筛选器表达式记录。使用ID字段的示例可能是
procedure TForm3.CopyData2;
begin
FDMemTable1.Filter := 'ID <=50';
FDMemTable1.Filtered := True;
FDBatchMove1.Execute; // move data from FDMemTable1 to FDMemTable2;
FDMemTable1.Close;
FDMemTable1.Data := FDMemTable2.Data; // Re-opens FDMemTable 1, which now contains only the first X records
end;
程序TForm3.CopyData2;
开始
FDMemTable1.Filter:='ID我希望@Victoria能够向您展示一个更好、更通用的
方法,但至少有两种方法:
- 使用FD的FDLocalSQL功能将FDMemTable的前X行复制到,
创建一个FDQuery,然后将它们复制回FDMemTable
- 对FDMemTable应用筛选器要筛选出其他记录,请使用FDBatchMove
将X记录复制到第二个FDMemTable中,然后将其复制回原始FDMemTable
FDMemTable
要实现其中的第一个,请将以下组件添加到表单/数据模块:
FDLocalSQL1: TFDLocalSQL;
FDConnection1: TFDConnection;
FDQuery1: TFDQuery;
FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink;
然后执行如下代码:
procedure TForm3.CopyData1;
begin
FDConnection1.DriverName := 'SQLite';
FDConnection1.Connected := True;
FDLocalSQL1.Connection := FDConnection1;
FDLocalSQL1.DataSets.Add(FDMemTable1); // this is the source dataset
FDLocalSQL1.Active := True;
FDQuery1.SQL.Text := 'select * from FDMemTable1 order by ID limit 5'; // ID being an Integer field of the FDMemTable
FDQuery1.Active := True;
FDMemTable1.Close;
FDMemTable1.Data := FDQuery1.Data; // Re-opens FDMemTable 1, which now contains only the first X records
end;
FD的LocalSQL使用Sqlite完成它的工作。Sqlite的SQL中的函数等价物
“选择顶部X…”是其限制条款
当然,在任务中使用LocalSQL的一个优点是,因为LocalSQL
支持order by,您可以通过它来确定保留哪些(顶部)X记录
batchmove方法需要更少的代码,但需要有一种识别方法
第一个X使用筛选器表达式记录。使用ID字段的示例可能是
procedure TForm3.CopyData2;
begin
FDMemTable1.Filter := 'ID <=50';
FDMemTable1.Filtered := True;
FDBatchMove1.Execute; // move data from FDMemTable1 to FDMemTable2;
FDMemTable1.Close;
FDMemTable1.Data := FDMemTable2.Data; // Re-opens FDMemTable 1, which now contains only the first X records
end;
程序TForm3.CopyData2;
开始
FDMemTable1.Filter:=“ID是的,有:)现在没有时间。对不起。@Victoria,你的姓可能是Fermat吗?@Uwe,不,不:)席尔瓦是我的姓。@Victoria:我会猜到Shirunova。@Victoria:那是他们的损失……是的,现在没有时间了。对不起。@Victoria,你的姓可能是Fermat吗?@Uwe,不,不:)Silva是我的姓。@Victoria:我会猜到Shirunova。@Victoria:那是他们的损失……我想用finalResync
从内部存储器中删除元组。您甚至可以在EmptyDataSet
方法中看到类似的内容。很容易修改范围删除而不是清除。顺便说一句,本地SQL支持DELETE
,因此只能删除某些元组(无需复制)。但是复制和删除整个源数据集可能更有效。我正在考虑使用finalResync
从内部存储中删除元组。您甚至可以在EmptyDataSet
方法中看到类似的内容。很容易修改范围删除而不是清除。顺便说一句,本地SQL支持DELETE
,因此只能删除某些元组(无需复制)。但是复制和删除整个源数据集可能更有效。