問題如下:
在Edit1中輸入類似:12854,25632,14785,16523,45872,然後利用POS取出逗點分隔的這5個數,再SQL中查詢出這5條記錄?
請各位前輩幫忙修正指出,如何實現類似的批量查詢功能???分不夠可加,謝謝!
procedure TCQ_JB_F.edt_wnKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  StrSQL,StrALL,StrX:string;
  i:Integer;
begin
  inherited;
  StrALL:=edt_wn.Text;
  for i:=0 to Pos(',',StrALL) -1 do
  begin
  if Pos(',',StrALL)>0 then
    begin
      StrX:=Copy(StrALL,0,Pos(',',StrALL)-1);
      StrALL:=Copy(StrALL,Pos(',',StrALL),Length(StrALL));
      ShowMessage(StrX);
    end
    else
    begin
      StrX:=StrALL;
      ShowMessage(StrX);
    end;
  end;
  {if not ( Key in[13,32,8,10]) then // 輸入一個數字模糊查詢
  begin
    StrSQL:='select * from Res_User_Temp where ACCOUNT_ID like '+''''+edt_wn.Text+'%''';
    if StrSQL<>''  then
    begin
      adoq_PLJB.Close;
      adoq_PLJB.SQL.Clear;
      adoq_PLJB.SQL.Add(StrSQL);
      adoq_PLJB.Open;
      end;
  end;}
end;

解决方案 »

  1.   

    使用in子句如何?
    'select * from Res_User_Temp where ACCOUNT_ID in(' + QuotedStr(n1) + ',' + QuotedStr(n2) + ',' + ... + )
      

  2.   

    like n1 or like n2 or 
      

  3.   


    你其实不用拆分的...只要在EDIT1中规定好规则就行了.像这样>>>[12854,25632,14785,16523,45872]不管有多长.
    在SELECT中你用IN来解决.如:
    select * from Res_User_Temp where ACCOUNT_ID in (12854,25632,14785,16523,45872)如果理解错了,如你真的需要12854是否模糊查询,那我就说错了.如果12854是帐号的完整值,那就是对的.
      

  4.   

    To hulihui():查詢我知道,就是POS語句好像只能取出前一條記錄?
      

  5.   

    To nbzip :
    select * from Res_User_Temp where ACCOUNT_ID in (EDIT.TEXT怎樣傳參數呢?)
      

  6.   

    ADODataSet1.CommandText:='select * from Res_User_Temp where ACCOUNT_ID in ('+edit1.Text+')';
      

  7.   

    這樣也像也不行???procedure TCQ_JB_F.edt_wnKeyPress(Sender: TObject; var Key: Char);
    var
      StrSQL:string;
    begin
      inherited;
      if Key=#13 then
      begin
        StrSQL:='select * from Res_User_Temp where ACCOUNT_ID in ('''+ edt_wn.Text+''')';
        if StrSQL<>''  then
        begin
          adoq_PLJB.Close;
          adoq_PLJB.SQL.Clear;
          adoq_PLJB.SQL.Add(StrSQL);
          adoq_PLJB.Open;
          end;
      end;
    end;
      

  8.   

    利用tstringlist分割字符串
    procedure TForm1.Button1Click(Sender: TObject);
    var list:tstringlist;
         s:string;
         i:integer;
    begin
      s:='12854,25632,14785,16523,45872';
      list:=tstringlist.Create;
      list.CommaText:=s;  for i:=0 to list.Count-1 do
      begin
      showmessage(list[i]);
      end;
      list.Free;
    end;
      

  9.   

    利用tstringlist分割字符串
    procedure TForm1.Button1Click(Sender: TObject);
    var list:tstringlist;
         s:string;
         i:integer;
    begin
      s:='12854,25632,14785,16523,45872';
      list:=tstringlist.Create;
      list.CommaText:=s;  for i:=0 to list.Count-1 do
      begin
      showmessage(list[i]);
      end;
      list.Free;
    end;
      

  10.   

    var
      SQL:string;
      i:integer;
      S:TString;
    begin  SQl:='Select * from Table where ';
     //查询个数和赋值我这就不写了
      for i:=0 to S.count-1 do begin
        if i>0 then SQL:=SQL+' or ';
        SQL:=SQL+'Item like '%''+S[i]+''%'';
      end;  .....
      //我这只写出了SQL语句,执行都差不多的
     //语句中的Or 表示可同时满足多个条件,但不需要都一样
    end;
      
      

  11.   


    汗,直接把EDIT.TEXT给递过去啊.
    str,tmp:string;str=edit.Text.Trim;   //假设str==12854,25632,14785,16523,45872
    tmp='select * from Res_User_Temp where ACCOUNT_ID in ('+str+') ';>>>把TMP传给ADOQUERY....
    >>>写到tmp的时候,我发现如果ACCOUNT_ID是否字符型的,也是错...字符型是要加单引号的.在MS SQL中.
      

  12.   

    汗,你不能把查询放在KeyPress事件下啊. KeyPress事件是按一下键盘键就触发.你应该把查询放在一个查询BUTTON的CLICK事件下面,按一下有效果.KeyPress事件,一般做为EDIT录入值(TEXT里面的内容),进行检验用的.如不能录入字母,只能录数值.....就是在这事件中进行的.(一般这事件在你键按下
    触发一次,键弹起时触发一次)当然在BUTTON的CLICK事件中,进行检验也行,就是对EDIT1.TEXT的值进行验算处理.