Fórum Como excluir vários registros no dbgrid com checkbox? #332002
24/10/2006
0
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
Curtir tópico
+ 0Posts
25/10/2006
Tnaires
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
26/10/2006
Vitoreduardo
Agora sim funcionou blz.
Gostei + 0
27/10/2006
Marco Salles
Gostei + 0
27/10/2006
Tnaires
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
27/10/2006
Marco Salles
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
27/10/2006
Tnaires
É verdade... Não havia me lembrado desse detalhe :oops:
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)