如何限制TFDMemTable中的记录数?

时间:2018-09-01 15:06:52

标签: delphi firedac

我有一个 TFDMemTable ,其中包含成千上万条记录。有没有办法只限制前50个结果记录?

我尝试使用:

FDMemTable.FetchOptions.RecsSkip := 0;
FDMemTable.FetchOptions.RecsMax := 50;
FDMemTable.Open;

但是它不起作用,数据保持不变。

1 个答案:

答案 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中拥有记录时,尝试以尝试的方式限制它们的数量为时已晚。 *)