Deletar registros selecionados numa DbGrid através de Botão
15/03/2006
0
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]; 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
Post mais votado
15/03/2006
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.
Ehvasc
Mais Posts
15/03/2006
Ehvasc
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.
16/03/2006
Zooropa
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
16/03/2006
Zooropa
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
16/03/2006
Zooropa
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
16/03/2006
Martins
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.
16/03/2006
Zooropa
cara, realmente funcionou. Muito obrigado. O que mais me encabula é não ter visto isso antes. Valews.
16/03/2006
Martins
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 :!:
29/03/2006
Pantoja
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
29/03/2006
Adriano Santos
if Application.MessageBox(´Deseja realizar a exclusão destes registros?´ , ´Aviso´ ,Mb_OkCancel) = IDOk then begin DbGrid.SelectedRows.Delete; end; ....
Nooooossssaa que doidera, nunca tinha pensado ou testado isso...caramba, chega de loops desnecessários...rsrs :D. boa [b:60be31f368]Martins[/b:60be31f368].
Clique aqui para fazer login e interagir na Comunidade :)