Fórum Como deletar varios dados usando o multselect no dbGrid? #334671

13/12/2006

0

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

Responder

Posts

13/12/2006

Catunda

vc está escrevendo demais pra pouca coisa colega.

seudbgrid.selectedrows.delete;

Simples assim.


Responder

Gostei + 0

14/12/2006

Adriano_servitec

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.


Responder

Gostei + 0

14/12/2006

Emerson Nascimento

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, é?


Responder

Gostei + 0

14/12/2006

Emerson Nascimento

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, é?


Responder

Gostei + 0

14/12/2006

Adriano_servitec

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]


Responder

Gostei + 0

14/12/2006

Emerson Nascimento

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;



Responder

Gostei + 0

14/12/2006

Adriano_servitec

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


Responder

Gostei + 0

14/12/2006

Adriano_servitec

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]


Responder

Gostei + 0

14/12/2006

Emerson Nascimento

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


Responder

Gostei + 0

14/12/2006

Adriano_servitec

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?


Responder

Gostei + 0

17/12/2006

Adriano_servitec

Page up


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar