SQL - ADOQuery

Delphi

21/09/2005

Amigos,
Coloquei em uma aplicação um ADOQuery onde em sua propriedade SQL coloquei esse código:
select * from Tab_Edificacoes where cod_Campo like sEd+´¬´
onde cod_Campo é o compo e sEd é uma variavel para o parâmetro.
Eu gostaria de que o campo também fosse uma variavel!

Como fazer isso???


Caezar

Caezar

Curtidas 0

Respostas

Michelli88

Michelli88

21/09/2005

select * from Tab_Edificacoes where cod_Campo like sEd+´¬´


Voce esqueceu do ´:´

select * from Tab_Edificacoes where cod_Campo like :sEd+´¬´ 


mas... nao entendo... como assim o campor ser uma variavel??


GOSTEI 0
Caezar

Caezar

21/09/2005

Porque eu coloquei em um coboBox os campos da tabela!
Então na hora da busca quero escolher o compo em que eu vou fazer a busca!


GOSTEI 0
Michelli88

Michelli88

21/09/2005

No combo vc tem tipo: Nome, Codigo, Tipo e vc quer na hora decidir se vai pesquisar por codigo ou por nome?

Se for isso, vc vai ter q ter um select pra cada um...


GOSTEI 0
Rogick

Rogick

21/09/2005

Vc pode fazer assim:

ADOQuery1.SQL.Add(´Select * from Tab_Edificacoes where ´ + combo.Items[combo.ItemIndex] + ´ like :sEd´´¬´´´);


Onde [i:df22aef36b]combo[/i:df22aef36b] é a combobox e [i:df22aef36b]ADOQuery1[/i:df22aef36b] é sua query(lógico né? :wink: ) onde está os campos.

Espero ter ajudado.


GOSTEI 0
Caezar

Caezar

21/09/2005

Amigo,
Tentei esse jeito e não deu muito certo!
Ele não faz nenhuma busca!


GOSTEI 0
Rjun

Rjun

21/09/2005

Tente fazer assim:

ADOQuery1.SQL.Add(´Select * from Tab_Edificacoes where ´ + combo.Items[combo.ItemIndex] + ´ like :sEd); 


E quando for passar o parâmetro, faça assim:

ADOQuery1.Parameters.ParamByName(´sEd´).Value := QuotedStr(valor + ´¬´);



GOSTEI 0
Rogick

Rogick

21/09/2005

Antes de Executar a query faça o seguinte:

ADOQuery1.SQL.SaveToFile(´C:\sql.txt´);


[i:9f67b68cbd]O [u:9f67b68cbd]C:\[/u:9f67b68cbd] pode ser substituído por qq pasta de sua preferencia.[/i:9f67b68cbd]

Abra o arquivo [u:9f67b68cbd]sql.txt[/u:9f67b68cbd] gerado e veja como está saindo a query.

Ah, siga o exemplo de sql do Rjun. O meu estava errado. :lol:


GOSTEI 0
Caezar

Caezar

21/09/2005

Amigos,
Alguem pode ver o que acontece com esse código?
Estou tentando passar o campo a ser pesquisado do ComboBox(cbCampoBusca) para a variavel sCampo
procedure TformAbrir.btBuscarClick(Sender: TObject);
var
sCampo:string;
begin
  dmConex.tb_Edific.SQL.Clear;
  dmConex.tb_Edific.SQL.Add(´Select * from Tab_Edificacoes where ´ + sCampo + ´ like :sEd´);
  CASE cbCampoBusca.ItemIndex OF
    0:sCampo:=´cod_Laudo´;
    1:sCampo:=´EmpresaSolicitante´;
    2:sCampo:=´EmpresaAvalianda´;
    3:sCampo:=´Cidade´  ;
    END;
    with dmConex.tb_Edific do
      begin
        close;
        Parameters.ParamByName(´sEd´).Value:=edPalavraBusca.Text;
        open;
      end;

end;



GOSTEI 0
Rjun

Rjun

21/09/2005

Qual o problema que está acontecendo? Está dando algum erro?


GOSTEI 0
Caezar

Caezar

21/09/2005

Ele diz:
Erro de sintaxe, operador faltando na expressão like?


GOSTEI 0
Rjun

Rjun

21/09/2005

Altere a linha em que você passa o parâmetro:

Parameters.ParamByName(´sEd´).Value := QuotedStr(edPalavraBusca.Text);



GOSTEI 0
Caezar

Caezar

21/09/2005

Memo problema, será que não é a variavel sCampo???


GOSTEI 0
Rjun

Rjun

21/09/2005

Agora que eu fui reparar. Coloque o case onde você atribui um valor para sCampo antes da linha que você monta o SQL.


GOSTEI 0
Caezar

Caezar

21/09/2005

Agora não dá mais erro nenhum!
Porem ele não faz a busca e quando eu faço um debug e percebo que o comando sql não recebe nenhum valor!


GOSTEI 0
Rjun

Rjun

21/09/2005

procedure TformAbrir.btBuscarClick(Sender: TObject); 
var 
  sCampo:string; 
begin 
  // Acho que você poderia por esse items no combobox e 
  // substituir esse case 
  // 
  //case cbCampoBusca.ItemIndex OF 
  // 0: sCampo := ´cod_Laudo´; 
  // 1: sCampo := ´EmpresaSolicitante´; 
  // 2: sCampo := ´EmpresaAvalianda´; 
  // 3: sCampo := ´Cidade´  ; 
  //end;
  
  sCampo := cbCampoBusca.Items[cbCampoBusca.ItemIndex];

  dmConex.tb_Edific.SQL.Clear; 
  dmConex.tb_Edific.SQL.Add(´Select * from Tab_Edificacoes where ´ + sCampo + ´ like :sEd´); 

  // Eu não gosto de usar WITH. Veja que aqui você está usando 3 
  // linhas a mais.
   dmConex.tb_Edific.close; 
   dmConex.tb_Edific.Parameters.ParamByName(´sEd´).Value := edPalavraBusca.Text; 
   dmConex.tb_Edific.open; 
end;


Quem não recebe valor? O parâmetro sED?


GOSTEI 0
Caezar

Caezar

21/09/2005

Sabe quando marcamos um ponto para que na hora que executarmos a aplicação ele para no ponto.
Então, notei que o parametro sql não recebe valor, ele aparece assim:

dmConex.tb_Edific.SQL.Add()


GOSTEI 0
Rjun

Rjun

21/09/2005

Acho que você esta engando, mas por via das dúvidas, acrescente a linha após você ter adicionado o SQL.

ShowMessage(dmConex.tb_Edific.SQL.Text);


Veja se aparece a instrução SQL.


GOSTEI 0
Caezar

Caezar

21/09/2005

Me enganei mesmo!
Mas pelo que pude reparar na mensagem, parece que o campo está passando corretamente mas a var sEd não
Mensagem:
Select * from Tab_Edificacoes where cod_Laudo like : sEd


GOSTEI 0
Rjun

Rjun

21/09/2005

Era isso mesmo que ele tinha q mostrar. Agora outra questão. edPalavraBusca.Text tem algum valor?


GOSTEI 0
Caezar

Caezar

21/09/2005

Tem
Ele recebe o valor dá caixa de texto!
Eu ponho o valor


GOSTEI 0
Rjun

Rjun

21/09/2005

Que banco você está usando? Tem alguma ferramenta para executar comandos SQL direto no banco?


GOSTEI 0
Caezar

Caezar

21/09/2005

tô usando Access!
Será que não está faltando alguma aspas??
pq sEd está dentro das aspas e sCampo não???


GOSTEI 0
Rjun

Rjun

21/09/2005

O problema com certeza não é em sCampo. Você pos QuotedStr? Faz o seguinte, coloque no código SQL um código completo, sem o parâmetro, apenas para fazer o teste. Em vez do parâmetro, coloque um valor real.


GOSTEI 0
Caezar

Caezar

21/09/2005

coloquei assim:

dmConex.tb_Edific.SQL.Add(´Select * from Tab_Edificacoes where ´ + sCampo + ´ like :0003´);

a mensagem foi:
Select * from Tab_Edificacoes where cod_Laudo like : 0003


GOSTEI 0
Rjun

Rjun

21/09/2005

Faça assim:

dmConex.tb_Edific.SQL.Add(´Select * from Tab_Edificacoes where ´ + sCampo + ´ like ´´0003´´´); 



GOSTEI 0
Caezar

Caezar

21/09/2005

Amigo, antes de tudo gostaria de te agradecer, pois refiz as Query´s e com o código que você me passou consegui fazer a busca!
O único problema agora é que tenho que escrever a palavra há ser procurada exatamente como ela está na tabela.
coloquei deste jeito e não deu resultados:
Parameters.ParamByName(´sEd´).Value:=QuotedStr(´*´+edPalavraBusca.Text+´*´);

nem deste:
Parameters.ParamByName(´sEd´).Value:=QuotedStr(edPalavraBusca.Text);



GOSTEI 0
Rjun

Rjun

21/09/2005

Ja tentou colocar ´¬´ em vez de ´*´?


GOSTEI 0
Caezar

Caezar

21/09/2005

Tentei deste jeito:
Parameters.ParamByName(´sEd´).Value:=QuotedStr(´¬´+edPalavraBusca.Text+´¬´);


GOSTEI 0
Rjun

Rjun

21/09/2005

E assim tb não deu certo? Posta o código de novo, para eu dar mais uma olhada.


GOSTEI 0
Caezar

Caezar

21/09/2005

Lavamos nós!!
Obrigado mesmo!!!
procedure TformAbrir.btBuscarClick(Sender: TObject);
var
sCampo:string;
begin
  CASE cbCampoBusca.ItemIndex OF
    0:sCampo:=´cod_Laudo´;
    1:sCampo:=´EmpresaSolicitante´;
    2:sCampo:=´EmpresaAvalianda´;
    3:sCampo:=´Cidade´  ;
    END;
  dmConex.qryTb_Laudos.SQL.Clear;
  dmConex.qryTb_Laudos.SQL.Add(´Select * from Tab_Laudos where ´ + sCampo + ´ like :sEd´);

    with dmConex.qryTb_Laudos do
      begin
        close;
        Parameters.ParamByName(´sEd´).Value:=QuotedStr(´*´+edPalavraBusca.Text+´*´);
        open;
      end;
    ShowMessage(dmConex.tb_Edific.SQL.Text);
end;



GOSTEI 0
Rjun

Rjun

21/09/2005

Aparentemente tá tudo certo. Faça um último teste. Em vez de você passar o parâmetro pelo edit, passe direto no código e veja se funciona.

Parameters.ParamByName(´sEd´).Value:=QuotedStr(´*00003*´);



GOSTEI 0
Caezar

Caezar

21/09/2005

Nada ainda!!!!
é muito estranho!


GOSTEI 0
Rjun

Rjun

21/09/2005

Amigo, realmente já não sei o que fazer. Se quiser e puder, passe-me o projeto via email, junto com o BD que dou uma olhada em casa hj a noite e te mando o problema.

rogerio.jun@gmail.com


GOSTEI 0
Lelê

Lelê

21/09/2005

vc pode dar um:

ADOquery.sql.clear;

depois:

ADOquery2.Parameters.CreateParameter(´nome1´,ftString,pdInput,0,null);
ADOquery2.Parameters.ParamValues[´nome1´] := combobox.Text;
ADOquery2.SQL.Append(´select * from tabela where campo = :nome1 order by tabela´);
ADOquery2.Active := true;
ADOquery2.Refresh;

se precisar de outro parametro cria ele antes do Appen.
os dois-pontos antes do nome do parametro é importantissimo, sem ele o delphi não aceita o parametro como partrametro

T+




GOSTEI 0
Caezar

Caezar

21/09/2005

O que significa esta parte?
ADOquery2.Parameters.CreateParameter(´nome1´,ftString,pdInput,0,null); 



GOSTEI 0
Rogick

Rogick

21/09/2005

Essa linha:
ADOquery2.Parameters.CreateParameter(´nome1´,ftString,pdInput,0,null); 

Serve para criar um parametro dinamicamente, mas se você colocar a propriedade [u:1bb13c0660]ParamsCheck[/u:1bb13c0660] da TADOQuery para True, os parametros são automaticamente definidos quando você montar a query na propriedade [u:1bb13c0660]SQL[/u:1bb13c0660] (mesmo que seja dinamicamente).


GOSTEI 0
Caezar

Caezar

21/09/2005

Então isso não me adianta muito, porque eu preciso é que na busca eu não precise escrever uma palavra existente em um campo e sim apenas parte dela!


GOSTEI 0
POSTAR