Como excluir vários registros no dbgrid com checkbox?
:D Fala galera blz?
Estou tentando excluir vários registros no dbgrid selecionando pelo checkbox.
Para isso estou usando este código:
O problema é que sempre o último registro não é excluído, e quando clico novamente no botão de excluir o programa trava.
Estou usando Delphi 7 + FireBird 2.0 + DBExpress.
O campo SELECAO esta como INTEGER, então se o checkbox estiver marcado ele recebe 1 se não recebe 0.
Desde já agradeço.
Estou tentando excluir vários registros no dbgrid selecionando pelo checkbox.
Para isso estou usando este código:
DmGeral.cdsClientes.First; while not DmGeral.cdsClientes.Eof do begin if DmGeral.cdsClientesSELECAO.Value = 1 then begin Transacao.TransactionID := 1; Transacao.IsolationLevel := xilREADCOMMITTED; DmGeral.Conexao.StartTransaction(Transacao); DmGeral.cdsClientes.Delete; DmGeral.cdsClientes.ApplyUpdates(0); DmGeral.Conexao.Commit(Transacao); DmGeral.cdsClientes.Next; end; end; end;
O problema é que sempre o último registro não é excluído, e quando clico novamente no botão de excluir o programa trava.
Estou usando Delphi 7 + FireBird 2.0 + DBExpress.
O campo SELECAO esta como INTEGER, então se o checkbox estiver marcado ele recebe 1 se não recebe 0.
Desde já agradeço.
Vitoreduardo
Curtidas 0
Respostas
Tnaires
24/10/2006
Olá
Creio que você não precisa dar um Next quando o registro estiver marcado, pois o método Delete já posiciona o cursor no próximo registro.
No caso, ficaria assim:
Abraços
Creio que você não precisa dar um Next quando o registro estiver marcado, pois o método Delete já posiciona o cursor no próximo registro.
No caso, ficaria assim:
DmGeral.cdsClientes.First; while not DmGeral.cdsClientes.Eof do begin if DmGeral.cdsClientesSELECAO.Value = 1 then begin Transacao.TransactionID := 1; Transacao.IsolationLevel := xilREADCOMMITTED; DmGeral.Conexao.StartTransaction(Transacao); DmGeral.cdsClientes.Delete; DmGeral.cdsClientes.ApplyUpdates(0); DmGeral.Conexao.Commit(Transacao); // Aqui não precisa dar Next. end // Aqui precisa, para verificar se o próximo registro está marcado else DmGeral.cdsClientes.Next; end;
Abraços
GOSTEI 0
Vitoreduardo
24/10/2006
Valeu tnaires
Agora sim funcionou blz.
Agora sim funcionou blz.
GOSTEI 0
Marco Salles
24/10/2006
o seu codigo me parece que voce esta iniciando uma transação e fechando uma transação dentro do laço ... isto alem de se desnecessário não é correto.
GOSTEI 0
Tnaires
24/10/2006
[quote:22ea5042eb=´Marco Salles´]o seu codigo me parece que voce esta iniciando uma transação e fechando uma transação dentro do laço ... isto alem de se desnecessário não é correto.[/quote:22ea5042eb]
Acho que isso depende do que ele quer... Se ele não quiser que as exclusões feitas com sucesso se desfaçam em caso de erro, esse código é apropriado. Mas se ele quiser que o sistema faça todas as exclusões ou não faça nenhuma, é necessário colocar o controle da transação fora do laço.
Acho que isso depende do que ele quer... Se ele não quiser que as exclusões feitas com sucesso se desfaçam em caso de erro, esse código é apropriado. Mas se ele quiser que o sistema faça todas as exclusões ou não faça nenhuma, é necessário colocar o controle da transação fora do laço.
GOSTEI 0
Marco Salles
24/10/2006
Acho que isso depende do que ele quer... Se ele não quiser que as exclusões feitas com sucesso se desfaçam em caso de erro, esse código é apropriado. Mas se ele quiser que o sistema faça todas as exclusões ou não faça nenhuma, é necessário colocar o controle da transação fora do laço.
Se for este o caso... Não precisa de inciar uma transação.. Basta usar o DmGeral.cdsClientes.ApplyUpdates(n); aonde n é o numero permitido para a quantidade de erros
e novamente , não colocar o DmGeral.cdsClientes.ApplyUpdates(n); dentro do laço..
Isto afeta diretamente a performance do aplicativo... O que pode causar uma lentidão com várias vezes foi postado aqui no forum
GOSTEI 0
Tnaires
24/10/2006
[quote:5abe2bd888=´Marco Salles´]Basta usar o DmGeral.cdsClientes.ApplyUpdates(n);[/quote:5abe2bd888]
É verdade... Não havia me lembrado desse detalhe :oops:
É verdade... Não havia me lembrado desse detalhe :oops:
GOSTEI 0