Como excluir vários registros no dbgrid com checkbox?

Delphi

24/10/2006

:D Fala galera blz?

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

Vitoreduardo

Curtidas 0

Respostas

Tnaires

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

Vitoreduardo

24/10/2006

Valeu tnaires

Agora sim funcionou blz.


GOSTEI 0
Marco Salles

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

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.


GOSTEI 0
Marco Salles

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

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:


GOSTEI 0
POSTAR