GARANTIR DESCONTO

Fórum Consulta SQL com dois parâmetros #348037

26/10/2007

0

Caros amigos, mais uma vez estou contando com a ajuda de voces.
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

Brener Leão

Responder

Posts

26/10/2007

Martins

[quote:5bb145ec12=´Brener Bento Leão´]Caros amigos, mais uma vez estou contando com a ajuda de voces.
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!


Responder

Gostei + 0

26/10/2007

Brener Leão

Veja como eu construo o Select
   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.


Responder

Gostei + 0

27/10/2007

Martins

Com aquele trecho de código q coloquei vc consulta vários campos sem precisar sair do form, mas acho q com o componente q vc está desenvolvendo pode-se fazer o q vc deseja, se vc precisar de ajuda para concluí-lo é só falar q o pessoal aqui pode te dar uma força.

  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; 



Responder

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...


Responder

Gostei + 0

27/10/2007

Martins

[quote:f2fd8c4b83=´Brener Bento 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...[/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´
o q não te serve, pois para funcionar deveria estar assim:
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.


Responder

Gostei + 0

27/10/2007

Brener Leão

Nooossa, como eu sou burro!!! é claro!!!
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.


Responder

Gostei + 0

27/10/2007

Martins

[quote:dee1125843=´Brener Bento Leão´]Nooossa, como eu sou burro!!! é claro!!!
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.


Responder

Gostei + 0

27/10/2007

Brener Leão

Exatamente, eu criei um componente derivado de TCustomComboEdit (RX Library 2.75) e quando o usuário clica no botão ou pressiona enter com o combo vazio ele abre então o form de consulta, ou ainda se o usuário conhecer código do que está buscando, basta que ele digite o código na combo editável e pressione enter ou clique no botão para que o componente possa verificar a existência do código. Caso seja encontrado ele retorna em um edit pré determinado um campo com a intensão de de detalhar o código.

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar