Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何限制TFDMemTable中的记录数?_Delphi_Firedac - Fatal编程技术网

Delphi 如何限制TFDMemTable中的记录数?

Delphi 如何限制TFDMemTable中的记录数?,delphi,firedac,Delphi,Firedac,我有一个TFDMemTable,里面有数千条记录。有没有办法只限制前50次的结果记录 我尝试使用: FDMemTable.FetchOptions.RecsSkip := 0; FDMemTable.FetchOptions.RecsMax := 50; FDMemTable.Open; 但它不起作用,数据保持不变。我希望@Victoria能够向您展示一个更好、更全面的解决方案 方法,但至少有两种方法: 使用FD的FDLocalSQL功能将FDMemTable的前X行复制到, 创建一个FDQ

我有一个TFDMemTable,里面有数千条记录。有没有办法只限制前50次的结果记录

我尝试使用:

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:那是他们的损失……我想用final
Resync
从内部存储器中删除元组。您甚至可以在
EmptyDataSet
方法中看到类似的内容。很容易修改范围删除而不是清除。顺便说一句,本地SQL支持
DELETE
,因此只能删除某些元组(无需复制)。但是复制和删除整个源数据集可能更有效。我正在考虑使用final
Resync
从内部存储中删除元组。您甚至可以在
EmptyDataSet
方法中看到类似的内容。很容易修改范围删除而不是清除。顺便说一句,本地SQL支持
DELETE
,因此只能删除某些元组(无需复制)。但是复制和删除整个源数据集可能更有效。