我的代码如下:运行时总时提示,关键字'where附近的语法不正确
sFilter:=' Where';
if Trim(lktvArea.Text)<>'' then
   begin
   sFilter:= sFilter+' fAreaCode like '''+QArea.fieldbyName('fCode').asString+'%''';
   end;
   
if sFilter=' Where' then sFilter:='';   QBaseInfo.Close;
   QBaseInfo.SQL.Clear ;
   QBaseInfo.SQL.Add(sSql+frmLookupProCus.sFilter);//*******主要是这行有错******
  QBaseInfo.Open ;
sFilter,sSql我都定义成STRING

解决方案 »

  1.   

    还好只有一个条件,要是多了还不累死啊,还要判断是不是已经有Where了,再判断条件数是不是大于1个了以决定要不要加AND...天!
    一般我都是这样做的
    var SQLStr:String;
    begin
      SQLStr:='Select * From mTable Where 1=1';
      if Trim(ComboBox1.Text)<>'' then
        SQLStr:=SQLStr+' And Condition1='''+ComboBox1.Text+'''';
      if Trim(ComboBox2.Text)<>'' then
        SQLStr:=SQLStr+' And Condition2='''+ComboBox2.Text+'''';
      ...
      myQuery.Active:=False;
      myQuery.SQL.Clear;
      myQuery.SQL.Add(SQLStr);
      myQuery.Open;
    end;//这是先说思路;照楼主的说法,在出错行上最大的可能是frmLookupProCus已经被Close了,这当然会报错;
      

  2.   

    li_zhifu(东北人):谢谢你,本来程式是这样的
    procedure TfrmLookupProCus.btOkClick(Sender: TObject);
    begin
    sFilter:=' Where';
    if Trim(lktvArea.Text)<>'' then
       begin
       sFilter:= sFilter+' fAreaCode like '''+QArea.fieldbyName('fCode').asString+'%''';
       end;
    if Trim(edtCode.Text) <> '' then
       begin
       if sFilter<>' Where' then sFilter := sFilter+' and';
       if pos('%',EdtCode.Text)>0 then
          sFilter:= sFilter+' fCode like '''+Trim(EdtCode.Text)+''''
          else
          sFilter:= sFilter+' fCode='''+Trim(EdtCode.text)+'''';
       end;
    if Trim(edtName.Text) <> '' then
       begin
       if sFilter<>' Where' then sFilter := sFilter+' and';
       if pos('%',EdtName.Text)>0 then
          sFilter:= sFilter+' fName like '''+Trim(EdtName.Text)+''''
          else
          sFilter:= sFilter+' fName='''+Trim(EdtName.text)+'''';
       end;
       
    if sFilter=' Where' then sFilter:='';
    end;
    我只给出了一部分以及出错的部分,完整代码是以上的代码,而且不是在同一窗体中,我这所以那样写是便如读写。
    照楼主的说法,在出错行上最大的可能是frmLookupProCus已经被Close了,这当然会报错;这好象不太可能,在调用窗体中我是这样写的
    if frmLookupProCus.ShowModal=mrOk then
       begin
       QBaseInfo.Close;
       QBaseInfo.SQL.Clear ;
       QBaseInfo.SQL.Add(sSql+frmLookupProCus.sFilter);
       QBaseInfo.Open ;
       end;
    而且在frmLookupProCus的Close中没有写任何程式。请帮我分析一下这到底错在那
      

  3.   

    假设下述代码在FormMain中
    if frmLookupProCus.ShowModal=mrOk then
       begin
       QBaseInfo.Close;
       QBaseInfo.SQL.Clear ;
       QBaseInfo.SQL.Add(sSql+frmLookupProCus.sFilter);
       QBaseInfo.Open ;
       end;则在FormMain的Public中定义sFilter1在 frmLookupProCus中uses UnitMain;//假设FormMain对应的Unit为UnitMain;
    并修改以下代码:
    if sFilter<>' Where' then sFilter := sFilter+' and';
       if pos('%',EdtName.Text)>0 then
          sFilter:= sFilter+' fName like '''+Trim(EdtName.Text)+''''
          else
          sFilter:= sFilter+' fName='''+Trim(EdtName.text)+'''';
       end;
       
    if sFilter=' Where' then sFilter:='';
    FormMain.sFilter1:=sFilter;//加这一句
    end;当然了,根据代码情况,采用我上文的思路可以节省好多代码,程序可读性也大为提高
      

  4.   

    还有,FormMain里的
    QBaseInfo.SQL.Add(sSql+frmLookupProCus.sFilter);
    改为
    QBaseInfo.SQL.Add(sSql+sFilter1);
      

  5.   

    myQuery.SQL.Add(SQLStr);
    showmessage(myQuery.SQL.text);
    myQuery.Open;运行看一下就知道了,我怀疑是你 这句:
    ' fAreaCode like '''+QArea.fieldbyName('fCode').asString+'%'''
     里的 QArea.fieldbyName('fCode').asString 根本就没有值
      

  6.   

    li_zhifu(东北人)完全是在瞎掰>>照楼主的说法,在出错行上最大的可能是frmLookupProCus已经被Close了,这当然会报错;如果你做过sql开发,你就应该清楚,“关键字'where附近的语法不正确”不是delphi报的,而是sql server报的。
    明显是组合出来的sql语句有问题
      

  7.   

    楼上的,你说得很有道理,我也是后来才注意到的,但这事也不能完全怪我,请注意楼主的原话
    ------------------------------------------------------------------------------------
    我的代码如下:运行时总时提示,关键字'where附近的语法不正确
    sFilter:=' Where';
    if Trim(lktvArea.Text)<>'' then
       begin
       sFilter:= sFilter+' fAreaCode like '''+QArea.fieldbyName('fCode').asString+'%''';
       end;
       
    if sFilter=' Where' then sFilter:='';   QBaseInfo.Close;
       QBaseInfo.SQL.Clear ;
       QBaseInfo.SQL.Add(sSql+frmLookupProCus.sFilter);//*******主要是这行有错******
       *****************************************************************************
      QBaseInfo.Open ;
    sFilter,sSql我都定义成STRING注释里写得明白,主要是这行出错,所以我才会这样想的,如果说是在Open时出错我不是就明白了嘛这完全是我审题不清,怪我至于“如果你做过sql开发,你就应该...”,我只能说,我从92年开始学编程,95年学数据库,99年工作,数据库一直贯串着,偶竟然还是没学好,惭愧呀
      

  8.   

    现在问题很清楚了,楼主可以在
    QBaseInfo.Open ;前先加一句
    ShowMessage(sSql+frmLookupProCus.sFilter);
    来看一下,你所生成的SQL语句到底是什么样的
      

  9.   

    to li_zhifu(东北人)不管怎么说,最重要的信息应该是出错信息本身,然后才是出错位置。你把位置看得太重了。他的意思实际是怀疑那个Add里面的组合有问题。啥也别说了,问题不是找出来了嘛?