ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Query dinâmica : parâmetros em componente ZQuery [RESOLVIDO]

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
andreluis78
Aprendiz
Aprendiz


Registrado: Domingo, 29 de Agosto de 2010
Mensagens: 135

MensagemEnviada: Ter Mai 26, 2015 10:35 am    Assunto: Query dinâmica : parâmetros em componente ZQuery [RESOLVIDO] Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Ter Mai 26, 2015 10:40 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
andreluis78
Aprendiz
Aprendiz


Registrado: Domingo, 29 de Agosto de 2010
Mensagens: 135

MensagemEnviada: Ter Mai 26, 2015 11:40 am    Assunto: . Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Ter Mai 26, 2015 12:09 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
andreluis78
Aprendiz
Aprendiz


Registrado: Domingo, 29 de Agosto de 2010
Mensagens: 135

MensagemEnviada: Ter Mai 26, 2015 2:52 pm    Assunto: . Responder com Citação

Agora deu outro erro :
List index out of bounds (0)

creio que não reconheceu o parâmetro
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Ter Mai 26, 2015 3:51 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
andreluis78
Aprendiz
Aprendiz


Registrado: Domingo, 29 de Agosto de 2010
Mensagens: 135

MensagemEnviada: Ter Mai 26, 2015 3:54 pm    Assunto: ... quase lá ! Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
andreluis78
Aprendiz
Aprendiz


Registrado: Domingo, 29 de Agosto de 2010
Mensagens: 135

MensagemEnviada: Ter Mai 26, 2015 4:01 pm    Assunto: ... quase lá ! Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
andreluis78
Aprendiz
Aprendiz


Registrado: Domingo, 29 de Agosto de 2010
Mensagens: 135

MensagemEnviada: Ter Mai 26, 2015 4:32 pm    Assunto: resolvido Responder com Citação

Olá natanbh1, consegui resolver.

Em vez de utilizar coalesce(nome,'') tentei com coalesce(nome,'''')

Muito Obrigado pela sua ajuda
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB