如果有做过任意查询生成器的,请给点意见,或有程序可发给我参照。
谢谢!!!
   [email protected]

解决方案 »

  1.   

    sql:='select * from mytable';
    if (combobox1.itemindex>0) and (edit1.text<>'') then
    sql:=sql+' where '+combobox1.text+'='+#39+edit1.text+#39;
    ...
      

  2.   

    其实就是一个组合SQL语句的问题
      

  3.   

    不是記菊花能說明的:
    procedure TFrmPosI44FtrS.BitBtn1Click(Sender: TObject);
    var aStrX,aStrSQL:String;    aStrB,aStrE,aStrFilter:String;
        aStrFldNm1,aStrFldNm2,aStrFldNm3,aStrFldNm4:ShortString;
        aBeFirst:Boolean;begin
    try
      aStrFilter:='';
      aBeFirst:=True;//標誌是否初次遇到有效條件;
      ////處理日期篩選條件:////
      aStrX:='';
      aStrFldNm1:='POSTM.TM003';
      aStrB:=trim(EdtDateB.Text); //(開}{始}{日}{期)
      aStrE:=trim(EdtDateE.Text);//(結束日期)
      if (aStrB<>'') then
      begin
        if (aStrE='') then
        begin
           aStrX:='('+aStrFldNm1+'>='+USDlmt+aStrB+USDlmt+')';
        end else
        begin
           aStrX:='(('+aStrFldNm1+'>='+USDlmt+aStrB+USDlmt+')and('+aStrFldNm1+'<='+USDlmt+aStrE+USDlmt+'))';
        end;
      end else if (aStrE<>'') then
      begin
           aStrX:='('+aStrFldNm1+'<='+USDlmt+aStrE+USDlmt+')';
      end;
      if (aStrX<>'') then
      begin
         aStrFilter:=aStrX;
         aBeFirst:=False;
      end;
      ////End of 處理日期篩選條件////
      //獲取ListBox中的多項"或"關係的篩選條件:
      aStrFldNm2:='POSTM.TM008';
      aStrX:=fGetFltr1Fld(ListBox1.Items,aStrFldNm2);
      //收集前面的條件成為與(AND)關係:
      if aStrX<>'' then //有條件內容則:
      begin
        //非首次,則加上' AND ':
        if Not aBeFirst then aStrFilter:=aStrFilter+' AND ';
        //連起來:
        aStrFilter:=aStrFilter+aStrX;
        aBeFirst:=False;
      end;
      ////確認碼:
      aStrFldNm3:='POSTN.TN012';
      aStrB:=Trim(CmbBxQueRen.Text);
      aStrE:=fGetHead(aStrB);
      if aStrE<>'' then
      begin
        aStrX:='('+aStrFldNm3+'='+USDlmt+aStrE+USDlmt+')';
      end else
      begin
        aStrX:='';
      end;
      //收集條件:
      if aStrX<>'' then
      begin
        if Not aBeFirst then aStrFilter:=aStrFilter+' AND ';
        aStrFilter:=aStrFilter+aStrX;
        aBeFirst:=False;
      end;
      ////簽回碼:
      aStrFldNm4:='POSTN.S_SGN';
      aStrB:=Trim(CmbBxQianHui.Text);
      aStrE:=fGetHead(aStrB);
      if aStrE<>'' then
      begin
        if aStrE='N' then
        begin //特殊處理簽回碼為'N'的狀況:
          aStrX:='(('+aStrFldNm4+'='+USDlmt+aStrE+USDlmt+')OR('+aStrFldNm4+'='+USDlmt+''+USDlmt+')OR('+aStrFldNm4+' IS NULL))';
        end else
        begin
          aStrX:='('+aStrFldNm4+'='+USDlmt+aStrE+USDlmt+')';
        end;
      end else
      begin
        aStrX:='';
      end;
      //收集條件:
      if aStrX<>'' then
      begin
        if Not aBeFirst then aStrFilter:=aStrFilter+' AND ';
        aStrFilter:=aStrFilter+aStrX;
        //aBeFirst:=False;//最後一次不要;
      end;
      if aStrFilter<>'' then
      begin
        aStrFilter:=' WHERE ('+aStrFilter+') ';
      end;
      ///////////////// 收集條件 END ////////////////////////  //顯示報表:
      aStrSQL:='SELECT MIN (TN008) AS TN008,MIN (TN004) AS TN004,MIN (TN005) AS TN005,MIN (TN006) AS TN006,MIN(TN007) AS TN007,SUM(TN010) AS TN010 FROM POSTN '
              +'INNER JOIN POSTM ON ((POSTM.TM001=POSTN.TN001) AND ( POSTM.TM002=POSTN.TN002)) '
              +aStrFilter
              +' GROUP BY TN008,TN004,TN005 '
              +' ORDER BY TN008,TN004,TN005' ;
      if not assigned(QRPT6) then
           QRPT6:=TQRPT6.Create(application);
      with QRpt6.QryRTM do
      begin
        aStrX:=SQL.Text;
        if aStrX<>aStrSQL then
        begin
          Active:=False;
          Filter:='';
          Filtered:=False;
          SQL.Text:=aStrSQL;    end;
        if not Active then
        begin
          Active:=True;
        end;
      end;
      if  QRPT6.QryRTM.RecordCount<=0 then
      begin
         Showmessage('沒有符合條件的紀錄.');
         exit;
      end;
      //////////對報表窗體控件標題設置://////
      aStrB:=trim(EdtDateB.Text); //(開}{始}{日}{期)
      aStrE:=trim(EdtDateE.Text);//(結束日期)
      aStrB:=LeftStr(aStrB+'        ',8);
      aStrE:=LeftStr(aStrE+'        ',8);
      QRpt6.qrlabel2.Caption:=aStrB+' To '+aStrE;  ///////////////////////////////////////
        QRpt6.Preview;
     except
        on E:exception do
          showmessage(E.message);
     end;
      ///////////////////////////////////////
    end;