Fórum Consulta SQL com dois parâmetros #348037
26/10/2007
0
Preciso fazer uma consulta SQL dinâmica em uma tabela qualquer, e seria muito bom se pudesse ficar assim:
qry1.SQL.Add(´Select COD_GRUPO, NOME_GRUPO´); qry1.SQL.Add(´FROM GRUPOS´); qry1.SQL.Add(´WHERE :Param1 Like :Param2´); qry1.paramByName(Param1).AsString:= ComboBox1.Text; qry1.ParamByName(Param2).AsString:= Edit1.Text; qry1.open;
O problema é que essa consulta não retorna nenhum registro.
Minha intensão é que o usuário possa escolher em uma combo o campo a ser pesquisado e no edit o valor a ser buscado.
Sei que existe outras maneiras de fazer isso, mas seria muito mais prático se fosse assim, pois dessa forma eu poderia ter um comando SQL único precisando alterar só o valor dos parâmetros.
Agradeço desde já se alguém puder me dar uma luz.
Brener Leão
Curtir tópico
+ 0Posts
26/10/2007
Martins
Preciso fazer uma consulta SQL dinâmica em uma tabela qualquer, e seria muito bom se pudesse ficar assim:
qry1.SQL.Add(´Select COD_GRUPO, NOME_GRUPO´); qry1.SQL.Add(´FROM GRUPOS´); qry1.SQL.Add(´WHERE :Param1 Like :Param2´); qry1.paramByName(Param1).AsString:= ComboBox1.Text; qry1.ParamByName(Param2).AsString:= Edit1.Text; qry1.open;
O problema é que essa consulta não retorna nenhum registro.
Minha intensão é que o usuário possa escolher em uma combo o campo a ser pesquisado e no edit o valor a ser buscado.
Sei que existe outras maneiras de fazer isso, mas seria muito mais prático se fosse assim, pois dessa forma eu poderia ter um comando SQL único precisando alterar só o valor dos parâmetros.
Agradeço desde já se alguém puder me dar uma luz.[/quote:5bb145ec12]
Não sei se te ajudará, mas vc poderia tentar assim.
With Qry1 do begin Close; SQL.Clear; SQL.Add(´Select COD_GRUPO, NOME_GRUPO´´); SQL.Add(´ FROM GRUPOS´); SQL.Add(´ WHERE ´+ComboBox1.Text+´ Like :Param2´); ParamByName(´Param2´).AsString:= Edit1.Text; Open; end;
Bons códigos!
Gostei + 0
26/10/2007
Brener Leão
Localizar:= TLocalizar.Create(self); Localizar.DataSource1.DataSet:= CDSTabela; Localizar.ExprSQL:= TStringList.Create; SetLength(Localizar.vCampos, FCampos_e_Titulos.Count); SetLength(Localizar.vTitulos, FCampos_e_Titulos.Count); Localizar.cboxCampos.Clear; for i := 0 to FCampos_e_Titulos.Count - 1 do begin Localizar.cboxCampos.Items.Add(Copy( FCampos_e_Titulos.Strings[i], Pos(´;´, FCampos_e_Titulos.Strings[i])+1)); Localizar.vCampos[i]:= Copy(FCampos_e_Titulos.Strings[i], 1, Pos(´;´, FCampos_e_Titulos.Strings[i])-1); Localizar.vTitulos[i]:= Copy( FCampos_e_Titulos.Strings[i], Pos(´;´, FCampos_e_Titulos.Strings[i])+1); end; Localizar.cboxCampos.ItemIndex:= FCampoDefault; //------------------------------------------------- for I := 0 to Length(Localizar.vCampos) - 1 do begin cString:= cString + Localizar.vCampos[i] + ´, ´; end; Delete(cString, Length(cString)-1,1); Localizar.ExprSQL.Add(´SELECT ´ + cString); Localizar.ExprSQL.Add(´FROM ´ + FNomeTabelaOrigem ); //ShowMessage(Localizar.ExprSQL.Text); //------------------------------------------------- CDSTabela.CommandText:= Localizar.ExprSQL.Text; //CDSTabela.Open; Localizar.ShowModal; Localizar.ExprSQL.Free; Localizar.Release;
Trata-se de um componente de consulta que deve se adaptar a qualquer tabela através das propriedades ´Campos_e_Titulos´ e ´NomeTabelaOrigem´, portanto seria interessante que eu pudesse montar o Select antes de abrir o form de consulta, pois assim se o usuário fizer mais de uma busca sem abandonar o Form, bastaria alterar os valores dos parâmetros, sem a necessidade de construir todo o Select novamente.
Mas mesmo assim valeu a dica, serviu me desatolar dessa idéia. Acho que eu vou copiar o trecho do código que constrói a Select para o evento onKeyPress do Form de consulta.
Gostei + 0
27/10/2007
Martins
for I := 0 to Length(Localizar.vCampos) - 1 do begin cString:= cString + Localizar.vCampos[i] + ´, ´; end; Delete(cString, Length(cString)-1,1); Localizar.ExprSQL.Add(´SELECT ´ + cString); Localizar.ExprSQL.Add(´FROM ´ + FNomeTabelaOrigem ); //Aonde é q vc coloca as condições de filtragem com where? //ShowMessage(Localizar.ExprSQL.Text); //------------------------------------------------- CDSTabela.CommandText:= Localizar.ExprSQL.Text; //CDSTabela.Open;
Gostei + 0
27/10/2007
Brener Leão
//Aonde é q vc coloca as condições de filtragem com where?
Na verdade este código está incompleto.. o correto seria:
for I := 0 to Length(Localizar.vCampos) - 1 do begin cString:= cString + Localizar.vCampos[i] + ´, ´; end; Delete(cString, Length(cString)-1,1); Localizar.ExprSQL.Add(´SELECT ´ + cString); Localizar.ExprSQL.Add(´FROM ´ + FNomeTabelaOrigem ); Localizar.ExprSQL.Add(´WHERE :Param1 LIKE :Param2´); Localizar.ExprSQL.Add(´Order by :Param1´); CDSTabela.CommandText:= Localizar.ExprSQL.Text;
depois já dentro do Form eu atribuiria valores aos parâmetros e mandava executar a SQL todas as vezes que o usuário teclar ENTER, permitindo dessa forma que o usuário possa refinar sua busca até encontrar o que está buscando.
Sei que existe outras formas de se fazer isso, mas é que eu estou meio ´invocado´ em porque esse método não retorna nenhum resultado...
Gostei + 0
27/10/2007
Martins
//Aonde é q vc coloca as condições de filtragem com where?
Na verdade este código está incompleto.. o correto seria:
for I := 0 to Length(Localizar.vCampos) - 1 do begin cString:= cString + Localizar.vCampos[i] + ´, ´; end; Delete(cString, Length(cString)-1,1); Localizar.ExprSQL.Add(´SELECT ´ + cString); Localizar.ExprSQL.Add(´FROM ´ + FNomeTabelaOrigem ); Localizar.ExprSQL.Add(´WHERE :Param1 LIKE :Param2´); Localizar.ExprSQL.Add(´Order by :Param1´); CDSTabela.CommandText:= Localizar.ExprSQL.Text;
depois já dentro do Form eu atribuiria valores aos parâmetros e mandava executar a SQL todas as vezes que o usuário teclar ENTER, permitindo dessa forma que o usuário possa refinar sua busca até encontrar o que está buscando.
Sei que existe outras formas de se fazer isso, mas é que eu estou meio ´invocado´ em porque esse método não retorna nenhum resultado...[/quote:f2fd8c4b83]
Como são alimentados os parametros dentro do seu Form?
Seguitne, vc já deve ter um conhecimento em SQL, então veja q o q ele pode está fazendo é so seguinte suponhamos q vc queira q (Param1) seja igual ao campo NOME por exemplo, para poder comparar com
Where :Param1 LIKE :Param2´
Ambos serão vistos assim por exemplo:
´NOME´ Like ´JOÃO´
NOME Like ´JOÃO´
Mas dependendo de como são alimentados os parametros, poderemos ver uma solução para esse pequeno problema.
Bons códigos.
Gostei + 0
27/10/2007
Brener Leão
o campo esta levando aspas.... é por isso que não estava adiantando.. hehe
Resta agora descobrir uma forma de retirar as aspas de um determinado parâmetro, em nosso caso, o parâmetro que deveria ser o nome do campo..
Muito obrigado por tirar essa dúvida que estava me tirando o sono.
Ah... afinal resolvi fazer da seguinte forma:
coloquei código abaixo no evento onkeypress do edit localizado no form de consulta.
procedure TLocalizar.Edit1KeyPress(Sender: TObject; var Key: Char); var Campo : string; cString : String; i : Integer; begin If Key = #13 then begin TClientDataSet(DataSource1.DataSet).Close; ExprSQL.Clear; for I := 0 to Length(vCampos) - 1 do begin cString:= cString + vCampos[i] + ´, ´; end; Delete(cString, Length(cString)-1,1); ExprSQL.Add(´SELECT ´ + cString); ExprSQL.Add(´ FROM ´ + cNomeTabela ); ExprSQL.Add(´ WHERE ´ + vCampos[ cboxCampos.ItemIndex ] + ´ LIKE ´ + QuotedStr(Edit1.Text + ´¬´)); ExprSQL.Add(´ ORDER BY ´ + vCampos[ cboxCampos.ItemIndex ]); ShowMessage(Localizar.ExprSQL.Text); TClientDataSet(DataSource1.DataSet).CommandText:= ExprSQL.Text; TClientDataSet(DataSource1.DataSet).Open; DBGrid1.SetFocus; StatusBar1.SimpleText := Format(´¬d registro(s) encontrado(s) com "¬s"´, [DataSource1.DataSet.RecordCount, Edit1.Text]); end; end;
pretendo fazer algumas implementações nele, mas a princípio ela esta funcionando direitinho.
Gostei + 0
27/10/2007
Martins
o campo esta levando aspas.... é por isso que não estava adiantando.. hehe
Resta agora descobrir uma forma de retirar as aspas de um determinado parâmetro, em nosso caso, o parâmetro que deveria ser o nome do campo..
Muito obrigado por tirar essa dúvida que estava me tirando o sono.
Ah... afinal resolvi fazer da seguinte forma:
coloquei código abaixo no evento onkeypress do edit localizado no form de consulta.
procedure TLocalizar.Edit1KeyPress(Sender: TObject; var Key: Char); var Campo : string; cString : String; i : Integer; begin If Key = #13 then begin TClientDataSet(DataSource1.DataSet).Close; ExprSQL.Clear; for I := 0 to Length(vCampos) - 1 do begin cString:= cString + vCampos[i] + ´, ´; end; Delete(cString, Length(cString)-1,1); ExprSQL.Add(´SELECT ´ + cString); ExprSQL.Add(´ FROM ´ + cNomeTabela ); ExprSQL.Add(´ WHERE ´ + vCampos[ cboxCampos.ItemIndex ] + ´ LIKE ´ + QuotedStr(Edit1.Text + ´¬´)); ExprSQL.Add(´ ORDER BY ´ + vCampos[ cboxCampos.ItemIndex ]); ShowMessage(Localizar.ExprSQL.Text); TClientDataSet(DataSource1.DataSet).CommandText:= ExprSQL.Text; TClientDataSet(DataSource1.DataSet).Open; DBGrid1.SetFocus; StatusBar1.SimpleText := Format(´¬d registro(s) encontrado(s) com "¬s"´, [DataSource1.DataSet.RecordCount, Edit1.Text]); end; end;
pretendo fazer algumas implementações nele, mas a princípio ela esta funcionando direitinho.[/quote:dee1125843]
Da forma q vc colocou no OnKeyPress, vc não poderia adaptar para seu componente?
Se precisar de mais ajuda, colocamo-nos a disposição para tentar ajudar.
bons códigos.
Gostei + 0
27/10/2007
Brener Leão
Por exemplo:
em um cadastro de produtos, quando é solicitado o grupo do item, o usuário efetua a pesquisa através de nosso comboedit que após a consulta deverá armazenar o código do grupo enquanto que um edit ou DBEdit irá apresentar o nome do grupo escolhido.
Caso conheçam algum componente que faça isso ou algo parecido, peço por gentileza que postem aqui aonde posso conseguir.
Obrigado.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)