首页 > 解决方案 > 如何从 ADO 过滤代码迁移到 Firedac

问题描述

我有这个代码:

datamodule1.tbabonne.Filter := '';
  if (scGPEdit2.Text) = '' then exit ;
  try
    ref_Abonne:= QuotedStr (scGPEdit2.Text + '*');
    if (scGPEdit2.Text <> '') then
      datamodule1.tbabonne.Filter:= Format('(ref_Abonne LIKE %s)', [ref_abonne])
    else
      datamodule1.tbabonne.Filtered := Trim((scGPEdit2.Text)) <> '' ;
  except
    abort;
  end;
  //edit1.Text := '';
  end;

我的问题是:
上面的代码不适用于 Firedac,而在 ADO 中作为魅力使用

标签: sql-serverdelphiadofiredacdelphi-10.3-rio

解决方案


在 FireDAC 过滤器中,通配符_用于单个字符和%多个字符 - 请参阅http://docwiki.embarcadero.com/Libraries/Sydney/en/FireDAC.Comp.Client.TFDQuery.Filter给出此示例

使用 LIKE 运算符时,可以在条件中使用标准 SQL 通配符,例如百分比 (%) 和下划线 (_)。以下过滤条件检索所有以“F”开头的国家

国家喜欢 'F%'

所以你需要调整你的线路

ref_abonne:= QuotedStr (scGPEdit2.Text + '*');

因此,要使用 LIKE 运算符和%通配符。

只是猜测,但也许 ADO 使用*通配符和=运算符将 VB 用户与 SQL 通配符和语法隔离开来。

更新LIKE这里是一个在过滤器中使用 FireDAC % 通配符和运算符的示例项目。请仔细注意内联注释。

  TForm1 = class(TForm)
    //  Create a new VCL project and drop the following components
    //  onto it.  There is no need to set any of their properties
    FDMemTable1: TFDMemTable;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    edFilter: TEdit;
    //  Use the Object Inspector to create the following event handlers
    //  and add the code shown in the implementation section to them
    procedure FormCreate(Sender: TObject);
    procedure edFilterChange(Sender: TObject);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.edFilterChange(Sender: TObject);
begin
  UpdateFilter;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGrid1.DataSource := DataSource1;
  DataSource1.DataSet := FDMemTable1;

  //  Adjust the following line to suit the location of Employee.Fds on your system
  FDMemTable1.LoadFromFile('D:\D10Samples\Data\Employee.Fds');

  FDMemTable1.IndexFieldNames := 'LastName;FirstName';
  FDMemTable1.Open;
  FDMemTable1.First;

  //  Make the filter disregard string case
  FDMemTable1.FilterOptions := [foCaseInsensitive];

  UpdateFilter;
end;

procedure TForm1.UpdateFilter;
var
  FilterExpr : String;
begin
  FilterExpr := edFilter.Text;
  if FilterExpr <> '' then
    FilterExpr := 'LastName Like ' + QuotedStr(FilterExpr + '%');
  FDMemTable1.Filter := FilterExpr;
  FDMemTable1.Filtered := FDMemTable1.Filter <> '';
end;

然后只需编译并运行


推荐阅读