Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
andreluis78 Aprendiz

Registrado: Domingo, 29 de Agosto de 2010 Mensagens: 135
|
Enviada: Ter Mai 26, 2015 10:35 am Assunto: Query dinâmica : parâmetros em componente ZQuery [RESOLVIDO] |
|
|
Olá a todos !
Estou com a seguinte dúvida :
Estou utilizando banco firebird e gostaria de usar uma query que recebesse parâmetros dentro de um componente ZQuery. onde o campo a ser verificado pela cláusula WHERE, fosse verificado em tempo de execução
Tentei utilizar o seguinte código sql dentro na propriedade parâmentro do componente :
select * from clientes where :param like :valor order by :param
o parâmetro "0" (:param) receberia o campo que deseja pesquisar na tabela, e o parâmetro "1" (:valor), receberia o valor digitado no edit1.text
e no delphi passo os seguintes parâmetros para testar :
dm_dados.qry_select_clientes.Close;
dm_dados.qry_select_clientes.Params[0].Value := 'nome';
dm_dados.qry_select_clientes.Params[1].Value := '%'+Edit1.text+'%';
dm_dados.qry_select_clientes.Open;
O que ocasiona em erro .
Gostaria de saber se a sintaxe do comando SQL está incorreta.
Obrigado
Editado pela última vez por andreluis78 em Ter Mai 26, 2015 4:33 pm, num total de 2 vezes |
|
Voltar ao Topo |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Ter Mai 26, 2015 10:40 am Assunto: |
|
|
Qual erro aparece?
Repare que você cria 3 parâmetros mas só alimenta 2.
Teste assim:
Código: | 'select * from clientes where :param like :valor order by :param2' |
Código: | With dm_dados.qry_select_clientes do
Begin
Close;
Params[0].Value := 'nome'; //campo
Params[1].Value := Edit1.Text + '%'; // Edit1 recebe o valor
Params[2].Value := 'nome'; //campo
Open;
End; |
_________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
 |
andreluis78 Aprendiz

Registrado: Domingo, 29 de Agosto de 2010 Mensagens: 135
|
Enviada: Ter Mai 26, 2015 11:40 am Assunto: . |
|
|
Olá natanbh1, não deu certo.
Deu o mesmo erro : Dynamic SQL error code -804 Data type unknown
An error was found in the application program input parameters for the SQL statement. |
|
Voltar ao Topo |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Ter Mai 26, 2015 12:09 pm Assunto: |
|
|
Creio que o erro aconteça porque não se pode definir o nome do campo como parâmetro, somente valores.
Uma alternativa seria fazer tudo em tempo de execução.
Exemplo:
Código: | With dm_dados.qry_select_clientes do
Begin
Close;
SQL.Clear;
SQL.Add('select * from clientes ');
SQL.Add(' where ' + QuotedStr(edtCampo.Text) + ' like :valor order by ' + QuotedStr(edtCampo.Text));
Params[0].Value := edtValor.Text + '%';
Open;
End; |
edtValor é um Edit que recebe o valor a ser pesquisado.
edtCampo é um Edit (pode ser um combobox) que recebe o nome do campo. _________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
 |
andreluis78 Aprendiz

Registrado: Domingo, 29 de Agosto de 2010 Mensagens: 135
|
Enviada: Ter Mai 26, 2015 2:52 pm Assunto: . |
|
|
Agora deu outro erro :
List index out of bounds (0)
creio que não reconheceu o parâmetro |
|
Voltar ao Topo |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Ter Mai 26, 2015 3:51 pm Assunto: |
|
|
Retire o parâmetro para teste:
Código: | With dm_dados.qry_select_clientes do
Begin
Close;
SQL.Clear;
SQL.Add('select * from clientes ');
SQL.Add(' where ' + QuotedStr(edtCampo.Text) + ' like ' + QuotedStr(edtValor.Text +'%') + 'order by ' + QuotedStr(edtCampo.Text));
Open;
End; |
_________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
 |
andreluis78 Aprendiz

Registrado: Domingo, 29 de Agosto de 2010 Mensagens: 135
|
Enviada: Ter Mai 26, 2015 3:54 pm Assunto: ... quase lá ! |
|
|
Pessoal, consegui resolver, em partes, da seguinte maneira :
qry_select_clientes.Close;
teste := '%'+ed_consulta.Text+'%';
qry_select_clientes.SQL.Text := 'select * from clientes where nome like :valor';
qry_select_clientes.ParamCheck := true;
qry_select_clientes.ParamByName('valor').DataType := ftString;
qry_select_clientes.ParamByName('valor').Value := teste;
qry_select_clientes.Active := true;
porém .... nos nomes com valor nulo não aparecem na pesquisa.
Tentei utilizar (na 3a linha) :
qry_select_clientes.SQL.Text := 'select * from clientes where coalesce(nome,'') like :valor';
Porém, com o "coalesce" ele dá um erro : Parameter 'valor' not found.
Alguém ai sabe como utilizar o coalesce nesse caso ? |
|
Voltar ao Topo |
|
 |
andreluis78 Aprendiz

Registrado: Domingo, 29 de Agosto de 2010 Mensagens: 135
|
Enviada: Ter Mai 26, 2015 4:01 pm Assunto: ... quase lá ! |
|
|
Olá natanbh1
Dessa forma também funcionou !!!
Porém também não retorna resultados com valor nulo, e se eu utilizo o where coalesce (nome,'') ... também dá erro.
Para finalizar, poderia me ajudar a mostrar também os registros com valor nulo ??? |
|
Voltar ao Topo |
|
 |
andreluis78 Aprendiz

Registrado: Domingo, 29 de Agosto de 2010 Mensagens: 135
|
Enviada: Ter Mai 26, 2015 4:32 pm Assunto: resolvido |
|
|
Olá natanbh1, consegui resolver.
Em vez de utilizar coalesce(nome,'') tentei com coalesce(nome,'''')
Muito Obrigado pela sua ajuda |
|
Voltar ao Topo |
|
 |
|