IBQuery + ParamByName Não Exibe Dados no DBGrid
Pessoal, boa noite!!!
Pesquisei muito antes de postar aqui, mas não teve jeito, então lá vai:
Estou tentando passar um parâmetro utilizando o IBQuery para que no DBGrid só sejam exibidos os dados cujo campo CODLOGIN for igual a "joao", mas quando executo o programa o DBGrid vem vazio. Se eu tirar o parâmetro o DBGrid vem todo preenchido, mas preciso que exiba apenas onde o CODLOGIN for "joao".
No Edit SQL do IBQuery configurei o código assim:
E no FormShow do Form coloquei:
Por favor, alguém me diz o que estou fazendo de errado? Já tentei modificar várias coisas, mas o problema persiste.
Obrigado!!!
Pesquisei muito antes de postar aqui, mas não teve jeito, então lá vai:
Estou tentando passar um parâmetro utilizando o IBQuery para que no DBGrid só sejam exibidos os dados cujo campo CODLOGIN for igual a "joao", mas quando executo o programa o DBGrid vem vazio. Se eu tirar o parâmetro o DBGrid vem todo preenchido, mas preciso que exiba apenas onde o CODLOGIN for "joao".
No Edit SQL do IBQuery configurei o código assim:
select * from CLIENTES where codlogin=:pcodlogin
E no FormShow do Form coloquei:
DataModule1.IBQuery1.Close;
DataModule1.IBQuery1.ParamByName('pcodlogin').Value:='joao';
DataModule1.IBQuery1.Open;
Por favor, alguém me diz o que estou fazendo de errado? Já tentei modificar várias coisas, mas o problema persiste.
Obrigado!!!
Ricardo
Curtidas 0
Respostas
Joel Rodrigues
29/06/2013
Você verificou diretamente no banco se essa consulta retorna registros? Ou seja, se o filtro 'joao' é válido.
GOSTEI 0
Ricardo
29/06/2013
Você verificou diretamente no banco se essa consulta retorna registros? Ou seja, se o filtro 'joao' é válido.
Verifiquei sim e retorna, o problema é que há algo errado com o que estou fazendo.
Meu código está correto? Não sei mais o que pode estar acontecendo.
GOSTEI 0
Joel Rodrigues
29/06/2013
Veja se ao invés de .Value consegue usar .AsString.
GOSTEI 0
Ricardo
29/06/2013
Veja se ao invés de .Value consegue usar .AsString.
Tentei já, mas dá no mesmo.
GOSTEI 0
Landerson Santos
29/06/2013
Bom dia.
Tente passar o parâmetro usando a função QUOTEDSTR(), assim o "joao" será incluido entre aspas simples, já que o banco está como string isso é necessário para achar o valor.
Outro ponto que sugiro é é que force para que os dois lados sejam verificados em maiusculo por exemplo.
Aplique UpperCase na coluna codlogin do banco de dados e aplique tambem a seu parametro.
Amigão acho que é isso... passando com o QuotedStr já vai resolver seu caso.
Até.
Tente passar o parâmetro usando a função QUOTEDSTR(), assim o "joao" será incluido entre aspas simples, já que o banco está como string isso é necessário para achar o valor.
Outro ponto que sugiro é é que force para que os dois lados sejam verificados em maiusculo por exemplo.
Aplique UpperCase na coluna codlogin do banco de dados e aplique tambem a seu parametro.
Amigão acho que é isso... passando com o QuotedStr já vai resolver seu caso.
Até.
GOSTEI 0
Ricardo
29/06/2013
Bom dia.
Tente passar o parâmetro usando a função QUOTEDSTR(), assim o "joao" será incluido entre aspas simples, já que o banco está como string isso é necessário para achar o valor.
Outro ponto que sugiro é é que force para que os dois lados sejam verificados em maiusculo por exemplo.
Aplique UpperCase na coluna codlogin do banco de dados e aplique tambem a seu parametro.
Amigão acho que é isso... passando com o QuotedStr já vai resolver seu caso.
Até.
Tente passar o parâmetro usando a função QUOTEDSTR(), assim o "joao" será incluido entre aspas simples, já que o banco está como string isso é necessário para achar o valor.
Outro ponto que sugiro é é que force para que os dois lados sejam verificados em maiusculo por exemplo.
Aplique UpperCase na coluna codlogin do banco de dados e aplique tambem a seu parametro.
Amigão acho que é isso... passando com o QuotedStr já vai resolver seu caso.
Até.
Não entendi muito bem, não.
Como ficaria isso, assim?
DataModule1.IBQuery1.ParamByName('plogin').AsString:=QUOTEDSTR('joao');
GOSTEI 0
Joel Rodrigues
29/06/2013
Exato, a dica do colega acima foi essa. Assim deu certo?
GOSTEI 0
Ricardo
29/06/2013
Exato, a dica do colega acima foi essa. Assim deu certo?
Deu certo não =(
GOSTEI 0
Landerson Santos
29/06/2013
Ricardo eu não tenho um FB/IB aqui... netão não posso testar... mas vamos tentar de maneira simples.
Note que você com a evolução dos seus posts trocou o nome do parametro... vamos fazer passo a passo.
DataModule1.IBQuery1.Close;
DataModule1.IBQuery1.ParamByName('pcodlogin').Value:='joao';
DataModule1.IBQuery1.Open;
Apenas para não termos o problema com relação ao nome do parametro mudaremos essa linha
DataModule1.IBQuery1.ParamByName('pcodlogin').Value:='joao';
Para
DataModule1.IBQuery1.Params[0].asString := QuotedStr('joao');
Vc está usando ClientDataSet na sua aplicação???
Caso sim... o parametro vc deve passar no clientdataset após aplicar o Fecth dele.
Note que você com a evolução dos seus posts trocou o nome do parametro... vamos fazer passo a passo.
DataModule1.IBQuery1.Close;
DataModule1.IBQuery1.ParamByName('pcodlogin').Value:='joao';
DataModule1.IBQuery1.Open;
Apenas para não termos o problema com relação ao nome do parametro mudaremos essa linha
DataModule1.IBQuery1.ParamByName('pcodlogin').Value:='joao';
Para
DataModule1.IBQuery1.Params[0].asString := QuotedStr('joao');
Vc está usando ClientDataSet na sua aplicação???
Caso sim... o parametro vc deve passar no clientdataset após aplicar o Fecth dele.
GOSTEI 0
Ricardo
29/06/2013
Pow, cara! Obrigadão por me ajudar!
É verdade! Mas aqui está correto, até porque se o parâmetro estiver errado dá um erro na hora de executar dizendo que o parâmetro não existe.
Apenas para não termos o problema com relação ao nome do parametro mudaremos essa linha
DataModule1.IBQuery1.ParamByName('pcodlogin').Value:='joao';
Para
DataModule1.IBQuery1.Params[0].asString := QuotedStr('joao');
Testei aqui, mas como diria o Mussun "deu erradis"!
Vc está usando ClientDataSet na sua aplicação???
Não, eu uso IBDataBase, IBTransaction, IBQuery, IBUpdateSQL e DataSource.
O curioso é que se eu tirar o parâmetro ele exibe todos os dados no DBGrid. E se eu colocar o parâmetro, ele não exibe nenhum, mas funciona para inserir novos dados. E ele fica exibindo os novos dados que inseri enquanto não fechar o Delphi. Depois que executo novamente, passando parâmetro, os novos dados que havia inserido também somem. Eles são inseridos no banco, mas o DBGrid não exibe por causa do bendito parâmetro.
Note que você com a evolução dos seus posts trocou o nome do parametro...
É verdade! Mas aqui está correto, até porque se o parâmetro estiver errado dá um erro na hora de executar dizendo que o parâmetro não existe.
Apenas para não termos o problema com relação ao nome do parametro mudaremos essa linha
DataModule1.IBQuery1.ParamByName('pcodlogin').Value:='joao';
Para
DataModule1.IBQuery1.Params[0].asString := QuotedStr('joao');
Testei aqui, mas como diria o Mussun "deu erradis"!
Vc está usando ClientDataSet na sua aplicação???
Não, eu uso IBDataBase, IBTransaction, IBQuery, IBUpdateSQL e DataSource.
O curioso é que se eu tirar o parâmetro ele exibe todos os dados no DBGrid. E se eu colocar o parâmetro, ele não exibe nenhum, mas funciona para inserir novos dados. E ele fica exibindo os novos dados que inseri enquanto não fechar o Delphi. Depois que executo novamente, passando parâmetro, os novos dados que havia inserido também somem. Eles são inseridos no banco, mas o DBGrid não exibe por causa do bendito parâmetro.
GOSTEI 0
Landerson Santos
29/06/2013
Ricardo... vamos esquecer o DELPHI...
Os dados estão gravados no banco, ou seja, se vc verificar no banco esses dados estão lá???
Que banco vc está usando?
Tem skype?
Os dados estão gravados no banco, ou seja, se vc verificar no banco esses dados estão lá???
Que banco vc está usando?
Tem skype?
GOSTEI 0
Ricardo
29/06/2013
Ricardo... vamos esquecer o DELPHI...
Os dados estão gravados no banco, ou seja, se vc verificar no banco esses dados estão lá???
Que banco vc está usando?
Tem skype?
Os dados estão gravados no banco, ou seja, se vc verificar no banco esses dados estão lá???
Que banco vc está usando?
Tem skype?
Mas o problema é no Delphi mesmo.
Quando eu consulta colocando "where codlogin = 'joao'" ele me retorna os dados. E no próprio programa eu uso outro IBQuery para passar um parâmetro a uma consulta e obter o resultado.
Vou ter que pensar numa forma de filtrar os dados que são exibidos no DBGrid.
GOSTEI 0
Joel Rodrigues
29/06/2013
Considerando os erros absurdos que o Delphi nos arranja de vez em quando, vamos partir para o ridículo: separe o sinal de igualdade, no SQL, do nome do campo e do parâmetro. Além disso, use o QuotedStr.
GOSTEI 0
Ricardo
29/06/2013
Considerando os erros absurdos que o Delphi nos arranja de vez em quando, vamos partir para o ridículo: separe o sinal de igualdade, no SQL, do nome do campo e do parâmetro. Além disso, use o QuotedStr.
Bom, realmente o sinal de = tem que colocar separado do parâmetro. Muito obrigado!
Mas ainda não está exibindo o resultado. Mas pelo menos fiz uns testes para tentar descobrir o porque.
Se eu configurar diretamente no IBQuery1 assim:
select * from CLIENTES where codlogin = 'joao'
O programa retorna os registros onde codlogin é = a 'joao' no DBGrid certinho! Mas se eu tento passar um parâmetro, ele já não retorna nada!
Então na verdade ele não está aceitando a passagem de parâmetro. É como se ele só aceitasse o que já está configurado no IBQuery no momento em que inicio o programa.
GOSTEI 0
Landerson Santos
29/06/2013
Ricardo... você disse que está chamando a consulta no show do Form?!
Tente atribuir num button ou no duplo click do dbgird para ver se persiste o problema.
Tente atribuir num button ou no duplo click do dbgird para ver se persiste o problema.
GOSTEI 0
Ricardo
29/06/2013
Ricardo... você disse que está chamando a consulta no show do Form?!
Tente atribuir num button ou no duplo click do dbgird para ver se persiste o problema.
Tente atribuir num button ou no duplo click do dbgird para ver se persiste o problema.
Persiste.
Eu fiz o seguinte, fiz um programa só com a parte do meu programa que não funciona e coloquei aqui: http://www.fileconvoy.com/dfl.php?id=gef46a0c42c226bde99932384006a77c070b5ec687
Se alguém puder dar uma olhadinha, o banco está aí também, é só colocar o caminho do banco com "localhost:" na frente no IBDatabase e colocar o connected para "true" e setar "true" no active dos outros componentes.
Tenho certeza que estou fazendo algo besta de errado e não consigo ver o que é =/
Muito obrigado a todos!!!
GOSTEI 0
Landerson Santos
29/06/2013
Ricardo vc não setou o tipo de dados do parametro.
[url]http://vivaitaocara.com.br/landersongomes/downloads/parametro_sem_setar.png[/url]
Tente setar o parametro como string e veja se fica ok?!
Seria mais ou menos assim:
[url]http://vivaitaocara.com.br/landersongomes/downloads/parametro_setado_como_string.png[/url]
Espero que resolva!
[url]http://vivaitaocara.com.br/landersongomes/downloads/parametro_sem_setar.png[/url]
Tente setar o parametro como string e veja se fica ok?!
Seria mais ou menos assim:
[url]http://vivaitaocara.com.br/landersongomes/downloads/parametro_setado_como_string.png[/url]
Espero que resolva!
GOSTEI 0
Landerson Santos
29/06/2013
Outra coisa...
Já conversamos antes sobre isso:
select * from CLIENTES
where sobrenome = :p1
e isso:
DataModule1.IBQuery1.close;
DataModule1.IBQuery1.Params[0].AsString := '%' + Edit1.text + '%';
DataModule1.IBQuery1.open;
Está errado... se está passando uma string deve passar dentro de QuotedStr()...
Note que na sua sentença SQL você vai trazer quem for "igual" então também não haveria motivos para colocar os "%" no código.
Para isso funcionar como parece que está querendo que funcione altere seu sql:
select * from CLIENTES
where sobrenome LIKE :p1
E seu código para o parâmetro passa a ser:
Amigão... nem cheguei a abrir seu BANCO pois não tenho fb aqui... mas já dá pra notar tudo isso.
Acho que agora vai.
Já conversamos antes sobre isso:
select * from CLIENTES
where sobrenome = :p1
e isso:
DataModule1.IBQuery1.close;
DataModule1.IBQuery1.Params[0].AsString := '%' + Edit1.text + '%';
DataModule1.IBQuery1.open;
Está errado... se está passando uma string deve passar dentro de QuotedStr()...
Note que na sua sentença SQL você vai trazer quem for "igual" então também não haveria motivos para colocar os "%" no código.
Para isso funcionar como parece que está querendo que funcione altere seu sql:
select * from CLIENTES
where sobrenome LIKE :p1
E seu código para o parâmetro passa a ser:
DataModule1.IBQuery1.Close;
DataModule1.IBQuery1.Params[0].AsString := QuotedStr('%' + Edit1.text + '%');
DataModule1.IBQuery1.Open;
Amigão... nem cheguei a abrir seu BANCO pois não tenho fb aqui... mas já dá pra notar tudo isso.
Acho que agora vai.
GOSTEI 0
Ricardo
29/06/2013
Ricardo vc não setou o tipo de dados do parametro.
[url]http://vivaitaocara.com.br/landersongomes/downloads/parametro_sem_setar.png[/url]
Tente setar o parametro como string e veja se fica ok?!
Seria mais ou menos assim:
[url]http://vivaitaocara.com.br/landersongomes/downloads/parametro_setado_como_string.png[/url]
Espero que resolva!
[url]http://vivaitaocara.com.br/landersongomes/downloads/parametro_sem_setar.png[/url]
Tente setar o parametro como string e veja se fica ok?!
Seria mais ou menos assim:
[url]http://vivaitaocara.com.br/landersongomes/downloads/parametro_setado_como_string.png[/url]
Espero que resolva!
Na realidade tenho outras consultas parecidas no programa e nunca precisei setar o parâmetro como string ou outro tipo. Não sei explicar porque, mas sempre funcionaram.
Em todo o caso, setei como string e modifiquei a SQL para like, como você disse e também adicionei o QuotedStr na hora de passar o parâmetro, mas o resultado é o mesmo. O DBGrid só fica vazio.
Talvez quando utilizar um DataSource ligado a um IBQuery para preencher um DBGrid não seja possível passar parâmetro para esse IBQuery. Começo a acreditar que isso seja impossível. Acho que vou ter que buscar outra solução para preencher o DBGrid e filtrar o resultado.
GOSTEI 0