Como deletar varios dados usando o multselect no dbGrid?

Delphi

13/12/2006

Pessoal, gostaria de saber se tem como deletar varios registros de um dbgrid usando o multselect, mais com o componente IBX ibQuery

Tentei de varias formas e nao consegui
tentei assim
procedure TForm4.Button5Click(Sender: TObject);
var
i: integer;
chaves: array[1..100] of string;
begin
for i:= 1 to JVdbgrid1.SelectedRows.Count do begin
DM.QSAIDA.Bookmark := JVdbgrid1.SelectedRows.Items[i-1];
chaves[i]:= DM.QSAIDA.FIELDBYNAME(´SEQUENCIA´).value;
end;

for i:= 1 to JVdbgrid1.SelectedRows.Count do begin
DM.QSAIDA.first;
If DM.QSAIDA.Locate(´SEQUENCIA´, chaves[i], [loPartialKey]) then DM.QSAIDA.Delete;
end;

DM.QSAIDA.first;
DM.QSAIDA.Refresh;
Aparece mensagem de erro: ´Update Failed´

Assim
if Application.MessageBox(´Deseja realmente Excluir esse Registro ?´,´Aviso´,MB_ICONQUESTION+mb_yesno)=idyes then
Begin
// apagar MULTSELECT
With JVDBGrid1.DataSource.DataSet do
Begin
  For I := 0 to JVDBGrid1.SelectedRows.Count - 1 do
    Begin
      GotoBookMark(Pointer(JVDBGrid1.SelectedRows.Items[I]));
      // Primeiro
      DM.QSAIDA.first;
      // Enquanto não terminar então
      while not DM.QSAIDA.eof do
      Begin
         // Verifica qual o row selecionado
         if JVDBGrid1.SelectedRows.CurrentRowSelected then
         begin
           // O parametro recebe o codlin selecionado
           dm.qsaida.close;
           DM.QSAIDA.FIELDBYNAME(´SEQUENCIA´).value;
           DM.QSAIDA.ExecSQL;
           // Ultimo
           DM.QSAIDA.Last;
         end;
      // Proximo
      DM.QSAIDA.Next;
      end;
    end;
end;
end;
Para nesta linha na hora de deletar [b:766b448ae3]DM.QSAIDA.Last;[/b:766b448ae3] e apareçe a mensagem ´User Open for a Select Stratement´

e tentei este ultimo usando a variavel vExclui para ver se selecionava todos os campos sequencia que marquei para deletar
if vExclui = 0 then begin
raise Exception.Create(´É necessário selecionar a Linha na Grade para Excluir´);
end else
if application.messagebox(Pchar(´Deseja Excluir este Lançamento:´ + #13+
dm.qSaida.FieldByName(´Sequencia´).AsString +´  ´+ 13+ dm.qSaida.FieldByName(´basecalculo´).AsString), Pchar(´Excluir Dados´+Self.Caption), MB_ICONQUESTION
+ MB_YESNO) = IDYES then begin
with dm.qsaida do begin
    Close;
    sql.text := ´delete from saidas where sequencia = :sequencia´;
    ParamByName(´sequencia´).value :=vExclui;  //multselect

    try
      ExecSQL;
      dm.TRsaida.Active:=true;
      dm.TRsaida.Commit;
      SQL.clear;
      dm.qsaida.Close;
      sql.add(´ Select * from saidas ´);
      sql.add(´ where cnpjempresa =:p_cnpjempresa and ano =:p_ano order by sequencia desc ´);
      parambyname(´p_cnpjempresa´).asstring:=label20.caption;
      parambyname(´p_Ano´).AsString:=label21.Caption;
      open;

      BitBtn9.setfocus;
      sbar.SimpleText:=´Dados Excluidos´;
   except
   on E:Exception do
   begin
      dm.TRsaida.RollBack;
      sbar.SimpleText:=´Abortado´;
      ShowMessage(´Falha na Exclusão dos Dados!´#1310´ Mensagem: ´+E.Message);
   end;

 end;
 end;
end;
E esse ultimo deleta somente o ultimo marcado e nao todos como desejo.

Entao a pergunta como deletar varios dados usando o multselect na grade do dbgrid?


Adriano_servitec

Adriano_servitec

Curtidas 0

Respostas

Catunda

Catunda

13/12/2006

vc está escrevendo demais pra pouca coisa colega.

seudbgrid.selectedrows.delete;

Simples assim.


GOSTEI 0
Adriano_servitec

Adriano_servitec

13/12/2006

vc está escrevendo demais pra pouca coisa colega. seudbgrid.selectedrows.delete; Simples assim.
Olah amigo, desta forma apareçe a mesma mensagem do primeiro codigo que eu postei.

[b:59e0d447f3]Aparece mensagem de erro: ´Update Failed´
[/b:59e0d447f3]Estou usando um IBQuery, ja coloquei ateh o componente UpdateSQL e direcionei ao ibQuery pra ver se funcionava e nada ainda.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/12/2006

quando vc apaga registros dessa forma, o melhor é tentar ir de trás pra frente, senão o ponteiro ´se perde´.

With JVDBGrid1.DataSource.DataSet do
Begin
For I := JVDBGrid1.SelectedRows.Count - 1 downto 0 do
Begin
GotoBookMark(Pointer(JVDBGrid1.SelectedRows.Items[I]));

// O parametro recebe o codlin selecionado
dm.qsaida.Close;
DM.qsaida.ParamByName(´sequencia´).asinteger := FIELDBYNAME(´SEQUENCIA´).asinteger;
DM.qsaida.ExecSQL;
end;
end;


o que há em qsaida? qual a instrução ali contida? por acaso qsaida não é o próprio dataset ligado à grade, é?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/12/2006

quando vc apaga registros dessa forma, o melhor é tentar ir de trás pra frente, senão o ponteiro ´se perde´.

With JVDBGrid1.DataSource.DataSet do
Begin
  For I := JVDBGrid1.SelectedRows.Count - 1 downto 0 do
    Begin
      GotoBookMark(Pointer(JVDBGrid1.SelectedRows.Items[I]));

      // O parametro recebe o codlin selecionado
      dm.qsaida.Close;
      DM.qsaida.ParamByName(´sequencia´).asinteger := FIELDBYNAME(´SEQUENCIA´).asinteger;
      DM.qsaida.ExecSQL;
    end;
end;

o que há em qsaida? qual a instrução ali contida? por acaso qsaida não é o próprio dataset ligado à grade, é?


GOSTEI 0
Adriano_servitec

Adriano_servitec

13/12/2006

o que há em qsaida? qual a instrução ali contida? por acaso qsaida não é o próprio dataset ligado à grade, é?
Sim o QSaida eh um compoente do IBS IBQuery, e esta ligado na grade sim.

Agora o problema esta eh que nao reconheçe o parametro ´sequencia´

O erro na hora de deletar
´QSaida Parameter ´Sequencia´ not found´

E aponta pra esta linha
[b:645e5dae4b]DM.qsaida.ParamByName(´sequencia´).asinteger := FIELDBYNAME(´SEQUENCIA´).asinteger; [/b:645e5dae4b]


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/12/2006

With JVDBGrid1.DataSource.DataSet do
Begin
  For I := JVDBGrid1.SelectedRows.Count - 1 downto 0 do
    Begin
      GotoBookMark(Pointer(JVDBGrid1.SelectedRows.Items[I]));
      Delete;
    end;
end;



GOSTEI 0
Adriano_servitec

Adriano_servitec

13/12/2006

With JVDBGrid1.DataSource.DataSet do Begin For I := JVDBGrid1.SelectedRows.Count - 1 downto 0 do Begin GotoBookMark(Pointer(JVDBGrid1.SelectedRows.Items[I])); Delete; [b:fe2095a243]end;[/b:fe2095a243] end;


Desculpe Emerson, mais da erro na hora de deletar e aponta para esse end em negrito.


A mesma mensagem

[b:fe2095a243]Aparece mensagem de erro: ´Update Failed´[/b:fe2095a243]

Lembrando que estou usando um IBQuery da paleta IBX


GOSTEI 0
Adriano_servitec

Adriano_servitec

13/12/2006

Agora tentei assim
begin
if vExclui = 0 then begin
raise Exception.Create(´É necessário selecionar a Linha na Grade para Excluir´);
end else
With JVDBGrid1.DataSource.DataSet do
Begin
  For I := JVDBGrid1.SelectedRows.Count - 1 downto 0 do
    Begin
      GotoBookMark(Pointer(JVDBGrid1.SelectedRows.Items[I]));
    with dm.qsaida do begin
       Close;
       sql.text := ´delete from saidas where sequencia = :sequencia´;
       ParamByName(´sequencia´).Value :=vexclui;
       ExecSQL;
    end;
    end;
end;
end;
E aparece o seguinte erro [b:85dd577cec]violation of primary or unique key constraint ´Pk_Saidas´ on Table ´Saidas´ at Trigger ´Saidas_ADO´[/b:85dd577cec]


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/12/2006

olha, você não deve manipular o mesmo dataset que está ligado à grade.


GOSTEI 0
Adriano_servitec

Adriano_servitec

13/12/2006

olha, você não deve manipular o mesmo dataset que está ligado à grade.
Hum como assim? Desculpe a pergunta, masi nao entendi.

Quer dizer que para eu excluir com multselect tenho que ter outro dataset? Mais ai como vou marcar os dados que eu quero excluir se eu marco(seleciono) eles dentro do dbgrid?


GOSTEI 0
Adriano_servitec

Adriano_servitec

13/12/2006

Page up


GOSTEI 0
POSTAR