我有一个 TFDMemTable ,其中包含成千上万条记录。有没有办法只限制前50个结果记录?
我尝试使用:
FDMemTable.FetchOptions.RecsSkip := 0;
FDMemTable.FetchOptions.RecsMax := 50;
FDMemTable.Open;
但是它不起作用,数据保持不变。
答案 0 :(得分:2)
我希望@Victoria能够向您展示更好,更笼统的 方式,但是至少有两种方式可以做到这一点:
使用FD的FDLocalSQL功能将FDMemTable的前X行复制到,例如, FDQuery,然后将它们复制回您的FDMemTable。
对FDMemTable应用过滤器以过滤掉其他记录,请使用FDBatchMove 将X记录复制到第二个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中的功能等效项 “ Select Top X ...”是其限制条款。
使用LocalSQL进行任务的优点当然是因为LocalSQL 支持排序依据,您可以确定保留哪个(顶部)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;
顺便说一句
我有一个TFDMemTable,其中包含数千条记录。我
我认为您尝试过的方法的问题可能是,当您在FDMemTable中拥有记录时,尝试以尝试的方式限制它们的数量为时已晚。 *)