Deletar registros selecionados numa DbGrid através de Botão

15/03/2006

Saudações,
em minha aplicação inseri SpeedButtons que substituem o DbNavigator (cada operação do DBNavigator está sendo realizada por um botão). Está tudo funcionando exceto o botão de Exclusão. Eu peguei uma dica e implementei no sistema. Segue abaixo o código:
if Application.MessageBox(´Deseja realizar a exclusão destes registros?´ , ´Aviso´ ,Mb_OkCancel) = IDOk then
     begin
        for cont := 0 to Pred(dbGrid1.SelectedRows.Count) do
        Begin
           Ds.Dataset.Bookmark := dbGrid1.SelectedRows[cont&93;; 
           Ds.dataset.delete;
           ds.dataset.refresh;
           label4.caption      := ´Total de Registros: ´ + inttostr(ds.dataset.RecordCount);
        end;  
     end;

Assim da forma que está funciona apenas para um registro (se eu selecionar 3 linhas e excluir ele exclui apenas a primeira linha). Outro porém é que se eu setar uma query ao datasource e tazer os dados ele só exclui direito se eu não utilizar order by (com order by ele exclui apenas 1 registro e mesmo assim não atualiza a grid. Ou seja, se eu trouxer um registro ´Antonio´ e o bookmark dele for 1357 quando dou um order by ele nem exclui o Antonio e ainda fica exibindo o mesmo na grid). Alguém sabe como resolvo esse problema?
Muito obrigado.


Zooropa

Respostas

15/03/2006

Ehvasc

Olá Elias,

O problema é que quando vc dá um refresh o DB grid perde todas as referencias antigas, então os BOOKMARKs que vc colocou são descartados.
Uma solução pra isso é a seguinte:

Continue usando os BOOKMARKs para capturar todos os registros selecionados e só depois execute o comando de DELETE atraves de sentença SQL como segue abaixo:

var sCodigos:String;
      qryAux : TQuery;
begin
if Application.MessageBox(´Deseja realizar a exclusão destes registros?´ , ´Aviso´ ,Mb_OkCancel) = IDOk then 
     begin 
       sCodigos := ´´;
        for cont := 0 to Pred(dbGrid1.SelectedRows.Count) do 
           sCodigos := sCodigos + QUERY.FieldByName(´CODIGO´).asstring+´,´;
        sCodigos := Copy(sCodigos,1,Length(Trim(sCodigos))-1);
       //Vc terá algo do tipo sCodigos = 1,3,9,10
       qryAux : TQuery.Create(Self); 
       with qryAux do
       begin
          databasename := "Nome_do_seu_Alias";
          with SQL do
          begin
              Clear;
              Add(´delete FROM TABELA WHERE CODIGO IN (´+sCodigo+´);
              ExecSQL;
          end;
         //Produre usar controle de transação para evitar inconsistencias
       end; 
     end;
end;


Espero ter ajudado. Até a próxima.


Responder Citar

15/03/2006

Ehvasc

Olá Elias,

O problema é que quando vc dá um refresh o DB grid perde todas as referencias antigas, então os BOOKMARKs que vc colocou são descartados.
Uma solução pra isso é a seguinte:

Continue usando os BOOKMARKs para capturar todos os registros selecionados e só depois execute o comando de DELETE atraves de sentença SQL como segue abaixo:

var sCodigos:String;
      qryAux : TQuery;
begin
if Application.MessageBox(´Deseja realizar a exclusão destes registros?´ , ´Aviso´ ,Mb_OkCancel) = IDOk then 
     begin 
       sCodigos := ´´;
        for cont := 0 to Pred(dbGrid1.SelectedRows.Count) do 
           sCodigos := sCodigos + QUERY.FieldByName(´CODIGO´).asstring+´,´;
        sCodigos := Copy(sCodigos,1,Length(Trim(sCodigos))-1);
       //Vc terá algo do tipo sCodigos = 1,3,9,10
       qryAux : TQuery.Create(Self); 
       with qryAux do
       begin
          databasename := "Nome_do_seu_Alias";
          with SQL do
          begin
              Clear;
              Add(´delete FROM TABELA WHERE CODIGO IN (´+sCodigo+´);
              ExecSQL;
          end;
         //Produre usar controle de transação para evitar inconsistencias
       end; 
     end;
end;


Espero ter ajudado. Até a próxima.


Responder Citar

16/03/2006

Zooropa

Saudações Eduardo,
eu testei primeiro o refresh como vc me disse, retirei esta linha e ele excluiu mas ainda deixou uma linha tipo se eu selecionei 3 linhas a linha do meio não foi apagada. Quanto ao seu código propriamente dito, não pude testá-lo porque o que tenho como chave é a matrícula e o nome do aluno porém existem escolas que não nos enviam as matrículas, sendo assim existem nomes de alunos duplicados e/ou homônimos. Mas irei testar....agora fora isso...acho que a gente se conhece, vc não já trabalhou na Âncora? :-P


Responder Citar

16/03/2006

Zooropa

Saudações Eduardo,
eu testei primeiro o refresh como vc me disse, retirei esta linha e ele excluiu mas ainda deixou uma linha tipo se eu selecionei 3 linhas a linha do meio não foi apagada. Quanto ao seu código propriamente dito, não pude testá-lo porque o que tenho como chave é a matrícula e o nome do aluno porém existem escolas que não nos enviam as matrículas, sendo assim existem nomes de alunos duplicados e/ou homônimos. Mas irei testar....agora fora isso...acho que a gente se conhece, vc não já trabalhou na Âncora? :-P


Responder Citar

16/03/2006

Zooropa

Saudações Eduardo,
eu testei primeiro o refresh como vc me disse, retirei esta linha e ele excluiu mas ainda deixou uma linha tipo se eu selecionei 3 linhas a linha do meio não foi apagada. Quanto ao seu código propriamente dito, não pude testá-lo porque o que tenho como chave é a matrícula e o nome do aluno porém existem escolas que não nos enviam as matrículas, sendo assim existem nomes de alunos duplicados e/ou homônimos. Mas irei testar....agora fora isso...acho que a gente se conhece, vc não já trabalhou na Âncora? :-P


Responder Citar

16/03/2006

Martins

Amigo uma pequena sugestão, o código abaixo funciona com CDS, se vc quiser tentar.

if Application.MessageBox(´Deseja realizar a exclusão destes registros?´ , ´Aviso´ ,Mb_OkCancel) = IDOk then 
     begin 
       DbGrid.SelectedRows.Delete;
      end;  
....


Com o código acima, somente os registros selecionados serão deletados, já q o DBGrid é um espelho do DataSet, então, não vejo pq não funcionar, vale testar.

Espero ter ajudado e boa sorte.


Responder Citar

16/03/2006

Zooropa

Saudações Martins,
cara, realmente funcionou. Muito obrigado. O que mais me encabula é não ter visto isso antes. Valews.


Responder Citar

16/03/2006

Martins

Saudações Martins, cara, realmente funcionou. Muito obrigado. O que mais me encabula é não ter visto isso antes. Valews.


Não precisamos de tanto código para fazer, nem de laços :D

Encontrar soluções, esse é o propósito do desenvolvimento :wink:

Boa Sorte :!:


Responder Citar

29/03/2006

Pantoja

So complementando ao amigo martins...

os laços e complementos do codigo ja foram feitos por ´alguem´, por isso so usar o metodo DELETE do DBGRID e pronto!


heeehhe

moleza né!?


mas algue tem que ralar antes... :wink:


abrasssss


Responder Citar

29/03/2006

Adriano Santos

Amigo uma pequena sugestão, o código abaixo funciona com CDS, se vc quiser tentar.
if Application.MessageBox(´Deseja realizar a exclusão destes registros?´ , ´Aviso´ ,Mb_OkCancel) = IDOk then 
     begin 
       DbGrid.SelectedRows.Delete;
      end;  
....
Com o código acima, somente os registros selecionados serão deletados, já q o DBGrid é um espelho do DataSet, então, não vejo pq não funcionar, vale testar. Espero ter ajudado e boa sorte.


Nooooossssaa que doidera, nunca tinha pensado ou testado isso...caramba, chega de loops desnecessários...rsrs :D. boa [b:60be31f368]Martins[/b:60be31f368].


Responder Citar