Fórum IBQuery + ParamByName Não Exibe Dados no DBGrid #447202

29/06/2013

0

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

Ricardo

Responder

Posts

29/06/2013

Joel Rodrigues

Você verificou diretamente no banco se essa consulta retorna registros? Ou seja, se o filtro 'joao' é válido.
Responder

Gostei + 0

29/06/2013

Ricardo

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

Gostei + 0

29/06/2013

Joel Rodrigues

Veja se ao invés de .Value consegue usar .AsString.
Responder

Gostei + 0

29/06/2013

Ricardo

Veja se ao invés de .Value consegue usar .AsString.


Tentei já, mas dá no mesmo.
Responder

Gostei + 0

30/06/2013

Landerson Santos

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

Gostei + 0

30/06/2013

Ricardo

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


Não entendi muito bem, não.
Como ficaria isso, assim?
DataModule1.IBQuery1.ParamByName('plogin').AsString:=QUOTEDSTR('joao');
Responder

Gostei + 0

30/06/2013

Joel Rodrigues

Exato, a dica do colega acima foi essa. Assim deu certo?
Responder

Gostei + 0

30/06/2013

Ricardo

Exato, a dica do colega acima foi essa. Assim deu certo?


Deu certo não =(
Responder

Gostei + 0

01/07/2013

Landerson Santos

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

Gostei + 0

01/07/2013

Ricardo

Pow, cara! Obrigadão por me ajudar!

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

Gostei + 0

02/07/2013

Landerson Santos

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?
Responder

Gostei + 0

02/07/2013

Ricardo

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?


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

Gostei + 0

02/07/2013

Joel Rodrigues

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

Gostei + 0

05/07/2013

Ricardo

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

Gostei + 0

05/07/2013

Landerson Santos

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.


Responder

Gostei + 0

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

Aceitar