Array
(
)

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

Zooropa
   - 15 mar 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:
#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.


Ehvasc
   - 15 mar 2006

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:

#Código


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
   - 15 mar 2006

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:

#Código


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.


Zooropa
   - 16 mar 2006

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


Zooropa
   - 16 mar 2006

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


Zooropa
   - 16 mar 2006

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


Martins
   - 16 mar 2006

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

#Código


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.


Zooropa
   - 16 mar 2006

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


Martins
   - 16 mar 2006


Citação:
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 :!:


Pantoja
   - 29 mar 2006

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


Adriano Santos
   - 29 mar 2006


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

#Código


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 Martins.