按多个 Field 过滤 ClientDataSet

Filter ClientDataSet by more than one Field

以下代码允许我按一个字段过滤客户端数据集:

begin
dmodule.cds.DisableControls;
try
  dmodule.cds.Filtered := False;

  dmodule.cds.FilterOptions := [foCaseInsensitive,foNoPartialCompare];
  dmodule.cds.Filter := 'Field LIKE '+ QuotedStr('%'+ editSearch.Text + '%');

  dmodule.cds.Filtered := True;
finally
  dmodule.cds.EnableControls;
end;

我在第一个 'cds.Filter' 行之后添加了另一行,我认为这可以让我按另一个字段进行过滤,但它不会带回任何记录。

行是:

dmodule.cds.Filter := 'Field2 LIKE '+ QuotedStr('%'+ editSearch.Text + '%');

我是否需要执行其他操作才能允许多重过滤?

谢谢,

您只需将它们与 and 组合(如果需要,您也可以使用 or):

begin
  dmodule.cds.DisableControls;
  try
    dmodule.cds.Filtered := False;

    dmodule.cds.FilterOptions := [foCaseInsensitive,foNoPartialCompare];
    dmodule.cds.Filter := 'Field LIKE '+ QuotedStr('%'+ editSearch.Text + '%') +
                          'AND Field2 LIKE ' + QuotedStr(editSearch2.Text) + '%');


    dmodule.cds.Filtered := True;
  finally
    dmodule.cds.EnableControls;
  end;

你的第二行基本上替换了第一行的过滤器。你可能想要:

dmodule.cds.Filter := 
         'Field LIKE '+ QuotedStr('%'+ editSearch.Text + '%') + 
     ' OR Field2 LIKE '+ QuotedStr('%'+ editSearch.Text + '%');

注意:我假设您想要 OR,因为您对没有 returning 任何数据感到惊讶。当然,如果您要求两个条件都对 return 数据为真,则使用 AND;但你仍然得不到任何记录。