| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
iammedeiros Novato

Registrado: Segunda-Feira, 10 de Abril de 2017 Mensagens: 31
|
Enviada: Ter Abr 11, 2017 9:23 pm Assunto: Erro: cannot perform this operation on an open dataset |
|
|
Bom pessoal, sou novo no delphi e estou desenvolvendo uma aplicação apenas para fins de aprendizado, no meu form tenho um capo pesquisar e um botão filtrar que ao ser pressionado deveria ir no banco e buscar uma consulta conforme for digitado um valor no campo de pesquisar, o problema é que meu código está dando o seguinte erro: cannot perform this operation on an open dataset.
segue abaixo meu código:
dmDados.cdsUsuarios.Close;
case cbFiltros.ItemIndex of
0 : dmDados.cdsUsuarios.CommandText := 'SELECT * FROM USUARIOS WHERE NOME LIKE ' + QuotedStr('%'+edtPesquisar.Text+'%');
1 : dmDados.cdsUsuarios.CommandText := 'SELECT * FROM USUARIOS WHERE LOGIN LIKE ' + QuotedStr('%'+edtPesquisar.Text+'%');
end;
dmDados.cdsUsuarios.Open;
Agradeço desde já! |
|
| Voltar ao Topo |
|
 |
joseY Novato

Registrado: Domingo, 9 de Abril de 2017 Mensagens: 13
|
Enviada: Ter Abr 11, 2017 10:17 pm Assunto: |
|
|
Ola iammedeiros.
fiz assim:
cdsUsuarios.Close;
case ComboBox1.ItemIndex of
0 : SQLDataSet1.CommandText := 'SELECT * FROM VI_USUARIOS WHERE NOME LIKE ' + QuotedStr('%'+edit1.Text+'%');
1 : SQLDataSet1.CommandText := 'SELECT * FROM VI_USUARIOS WHERE LOGIN LIKE ' + QuotedStr('%'+edit1.Text+'%');
end;
cdsUsuarios.Open;
cdsUsuarios que está ligado a um dataSetProvider e este ligado a um SqlDataSet que recebe o comandText.
Espero que ajude.. |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Abr 12, 2017 10:08 am Assunto: |
|
|
Bom dia,
iammedeiros, você por acaso está executando o método Open do SQLDataSet (ou outro tipo de DataSet que está ligado ao DataSetProvider)?
Se estiver experimente remover o Open (e consequentemente o Close) mantendo apenas o Open no ClientDataSet.
Espero que ajude
_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-venda-guarulhos!gopouva-residencial-casa |
|
| Voltar ao Topo |
|
 |
iammedeiros Novato

Registrado: Segunda-Feira, 10 de Abril de 2017 Mensagens: 31
|
Enviada: Qua Abr 12, 2017 6:46 pm Assunto: |
|
|
| joseY escreveu: | Ola iammedeiros.
fiz assim:
cdsUsuarios.Close;
case ComboBox1.ItemIndex of
0 : SQLDataSet1.CommandText := 'SELECT * FROM VI_USUARIOS WHERE NOME LIKE ' + QuotedStr('%'+edit1.Text+'%');
1 : SQLDataSet1.CommandText := 'SELECT * FROM VI_USUARIOS WHERE LOGIN LIKE ' + QuotedStr('%'+edit1.Text+'%');
end;
cdsUsuarios.Open;
cdsUsuarios que está ligado a um dataSetProvider e este ligado a um SqlDataSet que recebe o comandText.
Espero que ajude.. |
O código está igual ao meu, só removeu o dmDados que é meu datamodulo onde estão os componentes para conexão com banco |
|
| Voltar ao Topo |
|
 |
iammedeiros Novato

Registrado: Segunda-Feira, 10 de Abril de 2017 Mensagens: 31
|
Enviada: Qua Abr 12, 2017 7:18 pm Assunto: |
|
|
Bom cara ja tentei removendo tanto o open quando o close, mas não vai de jeito nenhum, quando não da erro, simplesmente não me retorna valor algum |
|
| Voltar ao Topo |
|
 |
iammedeiros Novato

Registrado: Segunda-Feira, 10 de Abril de 2017 Mensagens: 31
|
Enviada: Qua Abr 12, 2017 7:19 pm Assunto: |
|
|
| O engraçado é que estou fazendo está aplicação estudando atraves de vídeo aulas e no do professor funciona perfeitamente com este msm código, e o meu está exatamente igual ao dele |
|
| Voltar ao Topo |
|
 |
joseY Novato

Registrado: Domingo, 9 de Abril de 2017 Mensagens: 13
|
Enviada: Qua Abr 12, 2017 9:29 pm Assunto: |
|
|
Olá..
Veja bem no código que eu te passei, estou utilizado o commandText do SqlDataSet e não do ClientDataSet.
e também:
cdsUsuarios que está ligado a um dataSetProvider e este ligado a um SqlDataSet que recebe o comandText. |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Abr 13, 2017 9:23 am Assunto: |
|
|
iammedeiros, o que aconteceu exatamente sem o Open e o Close no SQLDataSet?
Acredito que quando deu erro estava com um problema e quando não retornou nada estava com outro problema. |
|
| Voltar ao Topo |
|
 |
iammedeiros Novato

Registrado: Segunda-Feira, 10 de Abril de 2017 Mensagens: 31
|
Enviada: Qui Abr 13, 2017 10:04 am Assunto: |
|
|
| joseY escreveu: | Olá..
Veja bem no código que eu te passei, estou utilizado o commandText do SqlDataSet e não do ClientDataSet.
e também:
cdsUsuarios que está ligado a um dataSetProvider e este ligado a um SqlDataSet que recebe o comandText. |
Msms subistituindo o comando do ClientDataSet para o SQlDataSet da o msm erro, ja não sei mais o que fazer, ja tentei de tudo e não funciona, quando não da este erro ai, ele simplesmente não me retorna nada, se caso eu tirar o metodo open ou o close.
[/img] |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Abr 13, 2017 10:45 am Assunto: |
|
|
Experimente fazer uns testes sem o Open e o Close no SQLDataSet e o código da seguinte forma para ver o que acontece:
| Código: | dmDados.cdsUsuarios.Close;
case cbFiltros.ItemIndex of
0 : dmDados.cdsUsuarios.CommandText := 'SELECT * FROM USUARIOS WHERE NOME LIKE ' + QuotedStr('%' + edtPesquisar.Text + '%');
1 : dmDados.cdsUsuarios.CommandText := 'SELECT * FROM USUARIOS WHERE LOGIN LIKE ' + QuotedStr('%' + edtPesquisar.Text + '%');
end;
dmDados.cdsUsuarios.Open;
ShowMessage('Quantidade de registros: ' + IntToStr(dmDados.cdsUsuarios.RecordCount)); |
Se o resultado for zero nos testes, experimente fazer outro teste removendo o filtro da query para ver se o resultado continua zero:
| Código: | dmDados.cdsUsuarios.Close;
dmDados.cdsUsuarios.CommandText := 'SELECT * FROM USUARIOS';
dmDados.cdsUsuarios.Open;
ShowMessage('Quantidade de registros: ' + IntToStr(dmDados.cdsUsuarios.RecordCount)); |
Espero que ajude |
|
| Voltar ao Topo |
|
 |
iammedeiros Novato

Registrado: Segunda-Feira, 10 de Abril de 2017 Mensagens: 31
|
Enviada: Qui Abr 13, 2017 11:26 am Assunto: |
|
|
| imex escreveu: | Experimente fazer uns testes sem o Open e o Close no SQLDataSet e o código da seguinte forma para ver o que acontece:
| Código: | dmDados.cdsUsuarios.Close;
case cbFiltros.ItemIndex of
0 : dmDados.cdsUsuarios.CommandText := 'SELECT * FROM USUARIOS WHERE NOME LIKE ' + QuotedStr('%' + edtPesquisar.Text + '%');
1 : dmDados.cdsUsuarios.CommandText := 'SELECT * FROM USUARIOS WHERE LOGIN LIKE ' + QuotedStr('%' + edtPesquisar.Text + '%');
end;
dmDados.cdsUsuarios.Open;
ShowMessage('Quantidade de registros: ' + IntToStr(dmDados.cdsUsuarios.RecordCount)); |
Se o resultado for zero nos testes, experimente fazer outro teste removendo o filtro da query para ver se o resultado continua zero:
| Código: | dmDados.cdsUsuarios.Close;
dmDados.cdsUsuarios.CommandText := 'SELECT * FROM USUARIOS';
dmDados.cdsUsuarios.Open;
ShowMessage('Quantidade de registros: ' + IntToStr(dmDados.cdsUsuarios.RecordCount)); |
Espero que ajude |
Olha cara, com esse código aqui que vc me passou
| Código: | dmDados.cdsUsuarios.Close;
case cbFiltros.ItemIndex of
0 : dmDados.cdsUsuarios.CommandText := 'SELECT * FROM USUARIOS WHERE NOME LIKE ' + QuotedStr('%' + edtPesquisar.Text + '%');
1 : dmDados.cdsUsuarios.CommandText := 'SELECT * FROM USUARIOS WHERE LOGIN LIKE ' + QuotedStr('%' + edtPesquisar.Text + '%');
end;
dmDados.cdsUsuarios.Open;
ShowMessage('Quantidade de registros: ' + IntToStr(dmDados.cdsUsuarios.RecordCount)); |
Da o msm erro, mas com o segundo código removendo o filtro da query funciona perfeitamente, exibi a quantidade de registros e faz a consulta, então creio que o problema seja o filtro da minha query, mas e ai vcs sabem que pode estar acontecendo? |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Abr 13, 2017 12:07 pm Assunto: |
|
|
Você sabe em qual linha exatamente ocorre o erro?
Se não sabe, experimente colocar um Breakpoint na linha do Close, execute sua aplicação com debug e quando a execução chegar no Breakpoint prossiga pressionando F8 até que ocorra o erro. Depois você também pode fazer testes pressionando F7 quando chegar na linha em que ocorre o erro para ver o que acontece quando essa linha é executada.
Desconfio que esse erro deva estar ocorrendo por causa de algum código que está em outro ponto do projeto, em função do resultado retornado pela query, por isso pode estar variando quando tem ou não filtro na query. |
|
| Voltar ao Topo |
|
 |
iammedeiros Novato

Registrado: Segunda-Feira, 10 de Abril de 2017 Mensagens: 31
|
Enviada: Sex Abr 14, 2017 9:35 am Assunto: |
|
|
| imex escreveu: | Você sabe em qual linha exatamente ocorre o erro?
Se não sabe, experimente colocar um Breakpoint na linha do Close, execute sua aplicação com debug e quando a execução chegar no Breakpoint prossiga pressionando F8 até que ocorra o erro. Depois você também pode fazer testes pressionando F7 quando chegar na linha em que ocorre o erro para ver o que acontece quando essa linha é executada.
Desconfio que esse erro deva estar ocorrendo por causa de algum código que está em outro ponto do projeto, em função do resultado retornado pela query, por isso pode estar variando quando tem ou não filtro na query. |
Fiz como vc falou cara, ele passa normalmente pela linha da query, mas dispara a exceção na linha do open, mas apertei f7 como falou e a linha do end do evendo do botão ficou marcada com vermelho, depois não fez mais nada |
|
| Voltar ao Topo |
|
 |
lokasso Aprendiz

Registrado: Terça-Feira, 11 de Abril de 2017 Mensagens: 174
|
Enviada: Sex Abr 14, 2017 3:24 pm Assunto: |
|
|
Brother, pelo que vi no seu código nao tem o parametro
ParamByName.
| Código: | SQL.Add('Where id = :id');
ParamByName('id').Value:= Edt_Busca.Text;
Open; |
|
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sáb Abr 15, 2017 11:12 am Assunto: |
|
|
| iammedeiros, então quando chegar na linha do Open pressione F7 para ver para onde a execução vai e continue até que ocorra o erro. |
|
| Voltar ao Topo |
|
 |
|