Delphi:过滤 DBGrid 时不执行 SQL 查询

问题描述 投票:0回答:1

我正在尝试过滤从数据库加载到 DBGrid 中的产品。当我尝试过滤时,无法执行查询。它返回给我一个空白

sql.Text
。我不知道为什么会出现这种情况?

这是我的代码

procedure TProizvodiForm.PronadjiButtonClick(Sender: TObject);

var Filter: string;

begin
     Filter := 'SELECT productid as ID, name as Proizvod, code as Kod, manufname as Proizvodjac, unitname as Pakovanje FROM product WHERE ';

    if prizvodFilterTEdit.Text <> '' then
      begin

          Filter := Filter + '`name` LIKE ' + QuotedStr(prizvodFilterTEdit.Text+'%');

      end;
    if kodFilterTEdit.Text <> '' then
      begin
        Filter := Filter + ' AND code LIKE ' + QuotedStr(kodFilterTEdit.Text+'%');
      end;
    if proizvodjacFilterTEdit.Text <> '' then
      begin
        Filter := Filter + ' AND manufname LIKE ' + QuotedStr(proizvodjacFilterTEdit.Text+'%');
      end;

     with DB.ZQuerySelect do
      begin
        Active := false;
        sql.Clear;
        sql.Text := Filter;
        Active := true;

        ShowMessage(sql.Text); // debug
      end;
     
end;

但是,这个工作 当我直接将查询放入

sql.Text
时,它可以工作,但是当设置为变量时,则不起作用。

with DB.ZQuerySelect do
      begin
        Active := false;
        sql.Clear;
        sql.Text := 'SELECT productid as ID, name as Proizvod, code as Kod, manufname as Proizvodjac, unitname as Pakovanje FROM product WHERE `name` LIKE ' + QuotedStr(prizvodFilterTEdit.Text+'%');
        Active := true;

        ShowMessage(sql.Text);
      end;
delphi pascal
1个回答
0
投票

不确定这是否是问题所在,但我在你的代码中看到的一个问题是,如果任何

TEdit
控件为空,那么你的
Filter
将是一个 malformed SQL 语句(并且你应该得到一个运行时错误关于那个)。您没有足够准确地处理
WHERE
AND
子句,以至于无法忽略任何过滤子句。

试试这个:

procedure TProizvodiForm.PronadjiButtonClick(Sender: TObject);
var
  FullSQL, Filter: string;
begin
  FullSQL := 'SELECT productid as ID, name as Proizvod, code as Kod, manufname as Proizvodjac, unitname as Pakovanje FROM product';

  if prizvodFilterTEdit.Text <> '' then
  begin
    Filter := '`name` LIKE ' + QuotedStr(prizvodFilterTEdit.Text+'%');
  end;
  if kodFilterTEdit.Text <> '' then
  begin
    if Filter <> '' then
    begin
      Filter := Filter + ' AND ';
    end;
    Filter := Filter + 'code LIKE ' + QuotedStr(kodFilterTEdit.Text+'%');
  end;
  if proizvodjacFilterTEdit.Text <> '' then
  begin
    if Filter <> '' then
    begin
      Filter := Filter + ' AND ';
    end;
    Filter := Filter + 'manufname LIKE ' + QuotedStr(proizvodjacFilterTEdit.Text+'%');
  end;

  if Filter <> '' then
  begin
    FullSQL := FullSQL + ' WHERE ' + Filter;
  end;

  with DB.ZQuerySelect do
  begin
    Active := false;
    SQL.Clear;
    SQL.Text := FullSQL;
    Active := true;

    ShowMessage(SQL.Text); // debug
  end;
     
end;
© www.soinside.com 2019 - 2024. All rights reserved.