Problema ao excluir usando loop..

Delphi

17/09/2005

estou com um probleminha onde uso aki esta função...

  BD_CONT_REC.First;
    while not BD_CONT_REC.Eof do
  BD_CONT_REC.Delete;
  Close;


O problema é que a função esta excluindo somente um registro..a tabela tem vários registros que são excluidos de uma só vez, e depois ele sai do formulário automáticamente...tem como executar a função toda primeiro para depois sair do form ?...t+ vlw..


Gigatel

Gigatel

Curtidas 0

Respostas

Rjun

Rjun

17/09/2005

Aparentemente seu código está OK. Você usou o trace para ver se ele passa somente um vez pelo loop? Pq você não utiliza um sql para fazer a exclusão dos registros.

DELETE FROM Tabela



GOSTEI 0
Martins

Martins

17/09/2005

Aparentemente seu código está OK. Você usou o trace para ver se ele passa somente um vez pelo loop? Pq você não utiliza um sql para fazer a exclusão dos registros.
DELETE FROM Tabela


vc pode fazer assim, mas se vc quiser utilizar a sua função, vc vai fazer algumas alterações para que ela fique assim:
begin
  while not Ds1.Eof do
   begin
     Ds1.Delete;
     ShowMessage(´Nome: ´+Ds1Nome.AsString); //Só para checar!!!
   end;
  Close;  //Só vai fechar o form depois q excluí todos os reg Ok!
end;


Boa sorte e bom desenvolvimento!!!


GOSTEI 0
Gigatel

Gigatel

17/09/2005

Vou fazer uns teste... aki, más parece estar funcionando...blz...t+


GOSTEI 0
Gameiro

Gameiro

17/09/2005

não sei se pode ser isso mas eu uso assim



begin 
Ds1.first; 
while not Ds1.Eof do 
   begin 
     Ds1.Delete; 
     ShowMessage(´Nome: ´+Ds1Nome.AsString); //Só para checar!!! 
     Ds1.next;  
   end; 
  Close;  //Só vai fechar o form depois q excluí todos os reg Ok! 
end; 




uso o first e o next


ate mais. :)


GOSTEI 0
Userba

Userba

17/09/2005

estou com um probleminha onde uso aki esta função...
  BD_CONT_REC.First;
    while not BD_CONT_REC.Eof do
  BD_CONT_REC.Delete;
  Close;
O problema é que a função esta excluindo somente um registro..a tabela tem vários registros que são excluidos de uma só vez, e depois ele sai do formulário automáticamente...tem como executar a função toda primeiro para depois sair do form ?...t+ vlw..


Olá!

Está faltando um ´Next´ no seu código :)

...
  BD_CONT_REC.First;
  while not BD_CONT_REC.Eof do
  begin
    BD_CONT_REC.Delete;
    BD_CONT_REC.Next;
  end;  
  close;
...



GOSTEI 0
Gigatel

Gigatel

17/09/2005

Aí galera valew pelo apoio..más por encrível que pareça esta é a função que funcionou sem problema...
  while not BD_CONT_REC.Eof do
    begin
    BD_CONT_REC.Delete;
    end;
  Close;


Valw..o apoio de todos..t+


GOSTEI 0
Marco Salles

Marco Salles

17/09/2005

Aí galera valew pelo apoio..más por encrível que pareça esta é a função que funcionou sem problema... Código: while not BD_CONT_REC.Eof do begin BD_CONT_REC.Delete; end; Close;


Não é nenhuma surpesa que é este codigo funcione

Está faltando um ´Next´ no seu código


Não porque o propio delete faz as vias do Next


GOSTEI 0
Martins

Martins

17/09/2005

[quote:a14007b580=´Marco Salles´]
Aí galera valew pelo apoio..más por encrível que pareça esta é a função que funcionou sem problema... Código: while not BD_CONT_REC.Eof do begin BD_CONT_REC.Delete; end; Close;


Não é nenhuma surpesa que é este codigo funcione

Está faltando um ´Next´ no seu código


Não porque o propio delete faz as vias do Next[/quote:a14007b580]

Verdade [b:a14007b580]Marcos[/b:a14007b580], por isso não coloquei o [b:a14007b580]Next[/b:a14007b580], vamos ter mais atenção pessoal e dar mais enfase no estudo das estruturas dos blocos de comando do Delphi.

Boa Sorte a todos!!!


Martins


GOSTEI 0
Rjun

Rjun

17/09/2005

Eu achei estranho o bloco só funcionar com um begin..end. Era só uma linha. Não teria que funcionar sem o begin..end?


GOSTEI 0
Martins

Martins

17/09/2005

Eu achei estranho o bloco só funcionar com um begin..end. Era só uma linha. Não teria que funcionar sem o begin..end?


Com certeza [b:3041189d62]Rjun[/b:3041189d62], mas isso seria correto desde que ele não quisesse sair do form após a exclusões, veja novamente o código dele:
BD_CONT_REC.First; //Vai para o ínicio da tabela.
    while not BD_CONT_REC.Eof do //enquanto não chegar ao fim da tab.
  BD_CONT_REC.Delete; //delete os registros, não precisa do next Ok!
  Close; // Feche o formulário.

Pois bem, ele fez quase tudo certo, e estaria tudo certo de ele não estivesse colocado aquele [b:3041189d62]Close[/b:3041189d62], pq para todos os efeitos ele vai ser lido após o [b:3041189d62]Delete[/b:3041189d62], e isso fecha o form e não permite q a rotina dele seja efetuada com sucesso, então faz-se necessário a utilização do bloco [b:3041189d62]begin... end;[/b:3041189d62]. Pq enquanto a condição for verdadeira, será executado o q estiver entre esse bloco, somente quando for falso, será executado o q estiver fora dele, blz!!

Espero ter ajudado.

Boa sorte a todos!!

Martins


GOSTEI 0
Rjun

Rjun

17/09/2005

Martins, acho que você esta enganado. De acordo com o código mostrado, ele teria que executar o comando Delete até que o arquivo chegasse ao fim. Somente depois que saisse do while o close seria executado. O código abaixo teria que funcionar sem o begin..end.

BD_CONT_REC.First; //Vai para o ínicio da tabela. 

while not BD_CONT_REC.Eof do //enquanto não chegar ao fim da tab. 
  BD_CONT_REC.Delete; //delete os registros, não precisa do next Ok! 

Close; // Feche o formulário. 



GOSTEI 0
Adriano Santos

Adriano Santos

17/09/2005

Martins, acho que você esta enganado. De acordo com o código mostrado, ele teria que executar o comando Delete até que o arquivo chegasse ao fim. Somente depois que saisse do while o close seria executado. O código abaixo teria que funcionar sem o begin..end.
BD_CONT_REC.First; //Vai para o ínicio da tabela. 

while not BD_CONT_REC.Eof do //enquanto não chegar ao fim da tab. 
  BD_CONT_REC.Delete; //delete os registros, não precisa do next Ok! 

Close; // Feche o formulário. 


[b:67b99e1a0a]Martins[/b:67b99e1a0a], o [b:67b99e1a0a]Rjun[/b:67b99e1a0a] está correto. O Algoritimo será executado até terminar o while, depois ele sairá e executará o Close. Faça o teste. É batata.


GOSTEI 0
Gigatel

Gigatel

17/09/2005

[quote:bbf06d4943=´Adriano Santos´]
Martins, acho que você esta enganado. De acordo com o código mostrado, ele teria que executar o comando Delete até que o arquivo chegasse ao fim. Somente depois que saisse do while o close seria executado. O código abaixo teria que funcionar sem o begin..end.
BD_CONT_REC.First; //Vai para o ínicio da tabela. 

while not BD_CONT_REC.Eof do //enquanto não chegar ao fim da tab. 
  BD_CONT_REC.Delete; //delete os registros, não precisa do next Ok! 

Close; // Feche o formulário. 





[b:bbf06d4943]Martins[/b:bbf06d4943], o [b:bbf06d4943]Rjun[/b:bbf06d4943] está correto. O Algoritimo será executado até terminar o while, depois ele sairá e executará o Close. Faça o teste. É batata.[/quote:bbf06d4943]


Aí galera sem querer botar lenha na fogueira, mas temos que práticos ..por isso que falei POR INCRIVÉL que paressa eu tbm acha que funcionava assim tbm..más na prática o que funcionou foi mesmo este codigo outro acima não dá certo...flw...

  while not BD_CONT_REC.Eof do
    begin
    BD_CONT_REC.Delete;
    end;
  Close;
end;




Más dúvidadas estão aqui para tentar ser resolvidas..t+...


GOSTEI 0
Adriano Santos

Adriano Santos

17/09/2005

Aí galera sem querer botar lenha na fogueira, mas temos que práticos ..por isso que falei POR INCRIVÉL que paressa eu tbm acha que funcionava assim tbm..más na prática o que funcionou foi mesmo este codigo outro acima não dá certo...flw...
  while not BD_CONT_REC.Eof do
    begin
    BD_CONT_REC.Delete;
    end;
  Close;
end;

Más dúvidadas estão aqui para tentar ser resolvidas..t+...



Cara, que loko...não tinha que dar erro.


GOSTEI 0
Gigatel

Gigatel

17/09/2005

Deixa falar erro num dá..más ele deleta somente um registro...que para mim num era viável...heheheheeh...tenho cada ganbiarra aki no delphi de deixar qualquer programador de cabelo em pé...t+


GOSTEI 0
Martins

Martins

17/09/2005

[quote:e81831b81e=´Adriano Santos´]
Martins, acho que você esta enganado. De acordo com o código mostrado, ele teria que executar o comando Delete até que o arquivo chegasse ao fim. Somente depois que saisse do while o close seria executado. O código abaixo teria que funcionar sem o begin..end.
BD_CONT_REC.First; //Vai para o ínicio da tabela. 

while not BD_CONT_REC.Eof do //enquanto não chegar ao fim da tab. 
  BD_CONT_REC.Delete; //delete os registros, não precisa do next Ok! 

Close; // Feche o formulário. 


[b:e81831b81e]Martins[/b:e81831b81e], o [b:e81831b81e]Rjun[/b:e81831b81e] está correto. O Algoritimo será executado até terminar o while, depois ele sairá e executará o Close. Faça o teste. É batata.[/quote:e81831b81e]
Hehehe!!!!

Certo pessoal!!!

Eu tb sempre acreditei q assim
 while not BD_CONT_REC.Eof do //enquanto não chegar ao fim da tab. 
  BD_CONT_REC.Delete; //delete os registros, não precisa do next Ok! 

fosse funcnionar, e deveria funcionar pq já utilizei assim antes e funcionou Ok!, mas como ele disse q não estava funcionando, só acrescentei o [b:e81831b81e]begin ... end[/b:e81831b81e], e os comentários anteirores foram dentro da lógica imaginada para solucionar o caso do colega, quero pedir desculpas a quem por ventura tenha se sentido de alguma forma atingido por mim, na boa pessoal, hehehe!!!

[b:e81831b81e]RJun[/b:e81831b81e], estou com vc, e sempre q preciso fazer exclusões, faço tudo via [b:e81831b81e]SQL[/b:e81831b81e]


GOSTEI 0
Rjun

Rjun

17/09/2005

Bom, desculpem minha insistência, mas estou curioso para saber o motivo de não funcionar sem o begin..end. Se alguem me der uma resposta lógica, juro que paro.


GOSTEI 0
Martins

Martins

17/09/2005

Martins, acho que você esta enganado. De acordo com o código mostrado, ele teria que executar o comando Delete até que o arquivo chegasse ao fim. Somente depois que saisse do while o close seria executado. O código abaixo teria que funcionar sem o begin..end.
BD_CONT_REC.First; //Vai para o ínicio da tabela. 

while not BD_CONT_REC.Eof do //enquanto não chegar ao fim da tab. 
  BD_CONT_REC.Delete; //delete os registros, não precisa do next Ok! 

Close; // Feche o formulário. 


[b:93696ec649]RJun[/b:93696ec649] assumo meu ledo engano, tb utilizei assim, quando não utilizava ainda [b:93696ec649]SQL[/b:93696ec649], agora faço tudo por [b:93696ec649]SQL[/b:93696ec649], mas como ele disse q não estava funcionando, só acrescentei o begin.. end, mas o código.
while not BD_CONT_REC.Eof do 

 BD_CONT_REC.Delete;

Close; 

funciona aqui perfeitamente, com ou sem begin... end, então passei uma segunda alternativa para o colega, agora pq não deu certo da forma acima, não sei mesmo.

T+


GOSTEI 0
Gigatel

Gigatel

17/09/2005

aí galera...eu fiz assim..

 while not BD_CONT_REC.Eof do
    begin
    BD_CONT_REC.Delete;
    end;
  Close;





até ontem o código funcionava e do nada parou... ????será que é o que...veja o código completo..


unit Unit33;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Grids, Wwdbigrd, Wwdbgrid, DBCtrls, Mask,
  XPMenu, DB, IBCustomDataSet, IBUpdateSQL, IBQuery;

type
  T_FORM_CR_MS = class(TForm)
    Image1: TImage;
    GroupBox1: TGroupBox;
    Label21: TLabel;
    XPMenu1: TXPMenu;
    Button1: TButton;
    BD_CONT_REC: TIBQuery;
    BD_CONT_RECSelected: TIntegerField;
    BD_CONT_RECGS_COR_CODIGO: TIntegerField;
    BD_CONT_RECGS_COR_NOME: TIBStringField;
    BD_CONT_RECGS_COR_DESCRICAO: TIBStringField;
    BD_CONT_RECGS_COR_DATA_VENC: TIBStringField;
    BD_CONT_RECGS_COR_VALOR_PARCELA: TIBStringField;
    BD_CONT_RECGS_COR_DATRASO: TFloatField;
    BD_CONT_RECGS_COR_SELECT: TIntegerField;
    BD_CONT_RECGS_COR_VALOR_ENT: TIBStringField;
    BD_CONT_RECGS_COR_END: TIBStringField;
    BD_CONT_RECGS_COR_COMP: TIBStringField;
    BD_CONT_RECGS_COR_BAIRRO: TIBStringField;
    BD_CONT_RECGS_COR_CIDADE: TIBStringField;
    BD_CONT_RECGS_COR_TEL_01: TIBStringField;
    BD_CONT_RECGS_COR_TEL_02: TIBStringField;
    BD_CONT_RECGS_COR_TEL_03: TIBStringField;
    BD_CONT_RECGS_COR_TEL_04: TIBStringField;
    BD_CONT_RECGS_COR_CPF_CNPJ: TIBStringField;
    BD_CONT_RECGS_COR_UF: TIBStringField;
    BD_CONT_RECGS_COR_CEP: TIBStringField;
    BD_CONT_RECGS_COR_N_PARCELAS: TIBStringField;
    BD_CONT_RECGS_COR_DATA_CAD: TIBStringField;
    BD_CONT_RECGS_COR_CODACES: TIntegerField;
    BD_CONT_RECGS_COR_CODPROD: TIBStringField;
    BD_CONT_RECGS_COR_VALOR_TOTAL: TIBStringField;
    BD_CONT_RECGS_COR_VENDEDOR: TIBStringField;
    BD_CONT_RECGS_COR_CODACESPAR: TIntegerField;
    BD_CONT_RECGS_COR_CODCLI: TIntegerField;
    IBUP_CONT_REC: TIBUpdateSQL;
    DS_CONT_REC: TDataSource;
    wwDBGrid1: TwwDBGrid;
    Label1: TLabel;
    Label3: TLabel;
    Label2: TLabel;
    Edit6: TEdit;
    Edit2: TEdit;
    Edit7: TEdit;
    Edit1: TEdit;
    Edit8: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Edit3: TEdit;
    Edit5: TEdit;
    CheckBox2: TCheckBox;
    CheckBox1: TCheckBox;
    Button2: TButton;
    BD_ARQUIVO_MORTO_FIN: TIBQuery;
    BD_ARQUIVO_MORTO_FINGS_ARF_CODIGO: TIntegerField;
    BD_ARQUIVO_MORTO_FINGS_ARF_NOME: TIBStringField;
    BD_ARQUIVO_MORTO_FINGS_ARF_CPF_CNPJ: TIBStringField;
    BD_ARQUIVO_MORTO_FINGS_ARF_N_PARCELAS: TIBStringField;
    BD_ARQUIVO_MORTO_FINGS_ARF_DATA_VENC: TIBStringField;
    BD_ARQUIVO_MORTO_FINGS_ARF_DATA_CAD: TIBStringField;
    BD_ARQUIVO_MORTO_FINGS_ARF_CODACES: TIntegerField;
    BD_ARQUIVO_MORTO_FINGS_ARF_DATA_BAX: TIBStringField;
    BD_ARQUIVO_MORTO_FINGS_ARF_DESCRICAO: TIBStringField;
    BD_ARQUIVO_MORTO_FINGS_ARF_CODPROD: TIBStringField;
    BD_ARQUIVO_MORTO_FINGS_ARF_VALOR_TOTAL: TIBStringField;
    BD_ARQUIVO_MORTO_FINGS_ARF_VALOR_PARCELA: TIBStringField;
    BD_ARQUIVO_MORTO_FINGS_ARF_VALOR_ENT: TIBStringField;
    BD_ARQUIVO_MORTO_FINGS_ARF_VENDEDOR: TIBStringField;
    BD_ARQUIVO_MORTO_FINGS_ARF_CODCLI: TIntegerField;
    BD_ARQUIVO_MORTO_FINGS_ARF_VALOR_PAGO: TIBStringField;
    IBUP_ARQUIVO_MORTO_FIN: TIBUpdateSQL;
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure CheckBox1Click(Sender: TObject);
    procedure CheckBox2Click(Sender: TObject);
    procedure Edit6Exit(Sender: TObject);
    procedure Edit6KeyPress(Sender: TObject; var Key: Char);
    procedure wwDBGrid2KeyPress(Sender: TObject; var Key: Char);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure BD_CONT_RECCalcFields(DataSet: TDataSet);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BD_CONT_RECAfterPost(DataSet: TDataSet);
    procedure BD_CONT_RECBeforeDelete(DataSet: TDataSet);
    procedure FormShow(Sender: TObject);
  private

    { Private declarations }
  public
    { Public declarations }
  end;

var
  _FORM_CR_MS: T_FORM_CR_MS;

implementation

uses Unit18, Unit21, Unit40;

{$R *.dfm}

procedure T_FORM_CR_MS.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if not((ssctrl in shift) or (ssalt in shift) or (ssshift in shift)) then begin
   begin
     if key=vk_f2 then begin
     end
   else
     if key=vk_f3 then begin
     end
   else
     if key=vk_f4 then begin
     end
   else
     if key=vk_f5 then begin
     end
   else
     if key=vk_f8 then begin
     end
     else
   if key=vk_escape then begin
     close;
     end;
   end;

end;
end;
procedure T_FORM_CR_MS.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked = true then
begin
edit7.Visible := true;
edit7.enabled := true;
edit7.text := ´0´;

edit7.SetFocus;
end
else
edit7.Visible := false;

edit2.text := ´0,00´;


end;

procedure T_FORM_CR_MS.CheckBox2Click(Sender: TObject);
begin
if CheckBox2.Checked = true then
begin
edit8.Visible := true;

edit8.text := ´0´;

edit8.SetFocus;
end
else
edit8.Visible := false;

edit1.text := ´0,00´;


end;

procedure T_FORM_CR_MS.Edit6Exit(Sender: TObject);
begin
    edit6.Text:= format(´¬n´, [strtofloat(edit6.Text)]);


end;

procedure T_FORM_CR_MS.Edit6KeyPress(Sender: TObject;
  var Key: Char);
begin
if not ( Key In [´0´..´9´,8] ) then
Abort;

If Key = 13 Then
Begin
SelectNext(Sender as tWinControl, True, True );
Key := 0;
end;

end;

procedure T_FORM_CR_MS.wwDBGrid2KeyPress(Sender: TObject;
  var Key: Char);
begin
 If Key = 13 Then
  Begin
  SelectNext(Sender as tWinControl, True, True );
  Key := 0;
  end;

end;

procedure T_FORM_CR_MS.Button1Click(Sender: TObject);
begin
Close;
end;

procedure T_FORM_CR_MS.FormCreate(Sender: TObject);
begin
  BD_CONT_REC.Close;
  BD_CONT_REC.Open;
  BD_ARQUIVO_MORTO_FIN.Close;
  BD_ARQUIVO_MORTO_FIN.Open;
end;

procedure T_FORM_CR_MS.BD_CONT_RECCalcFields(DataSet: TDataSet);
var
  Atraso: Double;
begin
 Atraso:= Date - BD_CONT_RECGS_COR_DATA_VENC.AsDateTime;
  if Atraso > 0 then
    BD_CONT_RECGS_COR_DATRASO.AsFloat := Atraso
  else
    BD_CONT_RECGS_COR_DATRASO.AsFloat := 0;

end;

procedure T_FORM_CR_MS.Button2Click(Sender: TObject);
begin
  while not BD_CONT_REC.Eof do
    begin
    BD_CONT_REC.Delete;
    end;
  Close;
end;
procedure T_FORM_CR_MS.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action := Cafree;
end;

procedure T_FORM_CR_MS.BD_CONT_RECAfterPost(DataSet: TDataSet);
begin
  if DM1.IBTransaction1.InTransaction then
     DM1.IBTransaction1.CommitRetaining;

end;

procedure T_FORM_CR_MS.BD_CONT_RECBeforeDelete(DataSet: TDataSet);
begin
  BD_ARQUIVO_MORTO_FIN.Close;
  BD_ARQUIVO_MORTO_FIN.Open;
  BD_ARQUIVO_MORTO_FIN.Insert;
  BD_ARQUIVO_MORTO_FINGS_ARF_DESCRICAO.Value := BD_CONT_RECGS_COR_DESCRICAO.Value;
  BD_ARQUIVO_MORTO_FINGS_ARF_NOME.Value := BD_CONT_RECGS_COR_NOME.Value;
  BD_ARQUIVO_MORTO_FINGS_ARF_CPF_CNPJ.Value := BD_CONT_RECGS_COR_CPF_CNPJ.Value;
  BD_ARQUIVO_MORTO_FINGS_ARF_CODPROD.Value := BD_CONT_RECGS_COR_CODPROD.Value;
  BD_ARQUIVO_MORTO_FINGS_ARF_N_PARCELAS.Value := BD_CONT_RECGS_COR_N_PARCELAS.Value;
  BD_ARQUIVO_MORTO_FINGS_ARF_DATA_VENC.Value := BD_CONT_RECGS_COR_DATA_VENC.Value;
  BD_ARQUIVO_MORTO_FINGS_ARF_DATA_CAD.Value := BD_CONT_RECGS_COR_DATA_CAD.Value;
  BD_ARQUIVO_MORTO_FINGS_ARF_CODACES.Value := BD_CONT_RECGS_COR_CODACESPAR.Value;
  BD_ARQUIVO_MORTO_FINGS_ARF_DATA_BAX.Value := FormatDateTime(´dd/mm/yyyy´,Date);
  BD_ARQUIVO_MORTO_FINGS_ARF_VALOR_TOTAL.Value := BD_CONT_RECGS_COR_VALOR_TOTAL.Value;
  BD_ARQUIVO_MORTO_FINGS_ARF_VALOR_PARCELA.Value := BD_CONT_RECGS_COR_VALOR_PARCELA.Value;
  BD_ARQUIVO_MORTO_FINGS_ARF_VALOR_ENT.Value := BD_CONT_RECGS_COR_VALOR_ENT.Value;
//  BD_ARQUIVO_MORTO_FINGS_ARF_VALOR_PAGO.Value := Edit2.Text;
  BD_ARQUIVO_MORTO_FINGS_ARF_VENDEDOR.Value := BD_CONT_RECGS_COR_VENDEDOR.Value;
  BD_ARQUIVO_MORTO_FIN.Post;
  if DM1.IBTransaction1.InTransaction then
     DM1.IBTransaction1.CommitRetaining;

end;

procedure T_FORM_CR_MS.FormShow(Sender: TObject);
Var
  i,r: integer;
  n: real;
begin
  n:= 0;
  r:= BD_CONT_REC.RecordCount;
  BD_CONT_REC.First;
    for i:=1 to r do
    begin
    n:= n + BD_CONT_RECGS_COR_VALOR_PARCELA.asfloat;
    BD_CONT_REC.Next;
  end;
  Edit6.Text:= formatfloat(´R$ ,#,,0.00´,n);

end;

end.





Alguém pode dar uma analizada...o curioso é que pararei de trabalhar nesta função por acreditar ter resolvido o problema...


GOSTEI 0
Martins

Martins

17/09/2005

Como assim parou?

vou ver se tenho tempo para olhar todo esse código... Vc já tentou remover o [b:3a9d62609b]Begin .. end[/b:3a9d62609b], onde realmente está o erro?


GOSTEI 0
Martins

Martins

17/09/2005

Como assim parou?

vou ver se tenho tempo para olhar todo esse código... Vc já tentou remover o [b:ebaead3e64]Begin .. end[/b:ebaead3e64], onde realmente está o erro?


GOSTEI 0
Gigatel

Gigatel

17/09/2005

Como assim parou? vou ver se tenho tempo para olhar todo esse código... Vc já tentou remover o [b:6be7d45946]Begin .. end[/b:6be7d45946], onde realmente está o erro?


Papo federau mesmo...fui usar pra valer o programa..cadastreis novos dados, desta vez o defenitivo...fui excluir os testes nenhum saiu...


GOSTEI 0
Gigatel

Gigatel

17/09/2005

estou usando esta fumção para chamar o código...
var I : integer; Titulos : string; begin if wwDBGrid1.SelectedList.Count = 0 then ShowMessage(´Selecione ao menos um registro´) else begin for I := 0 to wwDBGrid1.SelectedList.Count - 1 do begin BD_CONT_REC.GotoBookmark(wwDBGrid1.SelectedList.items[i]); Titulos := Titulos + QuotedStr(BD_CONT_RECGS_COR_CODIGO.asstring); if I < (wwDBGrid1.SelectedList.Count - 1) then Titulos := Titulos + ´,´; end; _FORM_CR_MS := T_FORM_CR_MS.Create(Self); _FORM_CR_MS.BD_CONT_REC.close; _FORM_CR_MS.BD_CONT_REC.SQL.Text := ´SELECT * FROM CONTAS_RECEBER´ + ´ WHERE GS_COR_CODIGO IN ( ´ + Titulos + ´)´; _FORM_CR_MS.BD_CONT_REC.Open; _FORM_CR_MS.ShowModal; BD_CONT_REC.Close; BD_CONT_REC.open; wwDBGrid1.UnselectAll; end;


pode ter algo aki...más olhei e nada...


GOSTEI 0
Martins

Martins

17/09/2005

[quote:4b285e539c=´Martins´]Como assim parou? vou ver se tenho tempo para olhar todo esse código... Vc já tentou remover o [b:4b285e539c]Begin .. end[/b:4b285e539c], onde realmente está o erro?


Papo federau mesmo...fui usar pra valer o programa..cadastreis novos dados, desta vez o defenitivo...fui excluir os testes nenhum saiu...[/quote:4b285e539c]

É só a exclusão q tá com problema? Vc já tentou reescrever a instrução sem begin end? Pq cara tá sinistro esse teu BD, não quer perder os dados não, hehe!!!

Não dá nenhum erro? coloca um ShowMessage lá para ver o q tá havendo cara.


GOSTEI 0
Gigatel

Gigatel

17/09/2005

indentifiquei a possível falha...Quando o registro é vizualizado o ponteiro do grid fica no ultimo registro ( provavelmente por causa do cáuculo ) aí posiciono para p primeiro registro aí ele faz as exclusões...aí coloquei um First..simplesmete TRAVA o aplicativo...hehehehe doideira...e de fato depois que coloquei a função de cálculos eu num testei depois a função num tinha reparado...más é só dá uma olhada no código acima.. acho que agora tá fácil de resolver..


GOSTEI 0
Gigatel

Gigatel

17/09/2005

Confirmado o bug se apresenta depois da execução desta função..

no evento ONSHOW coloquei ..

Var
  i,r: integer;
  n: real;
begin
//  n:= 0;
//  r:= BD_CONT_REC.RecordCount;
//  BD_CONT_REC.First;
//    for i:=1 to r do
//    begin
//    n:= n + BD_CONT_RECGS_COR_VALOR_PARCELA.asfloat;
//    BD_CONT_REC.Next;
//  end;
//  Edit6.Text:= formatfloat(´R$ ,#,,0.00´,n);


Para poder realizar o cálculo dos valores no grid...más eu presciso desta função funcionando..talvez alguma outra forma...vlw..t+


GOSTEI 0
Isabelct

Isabelct

17/09/2005

aí galera...eu fiz assim..
procedure T_FORM_CR_MS.Button2Click(Sender: TObject);
begin
  while not BD_CONT_REC.Eof do
    begin
    BD_CONT_REC.Delete;
    end;
  Close;
end;


Qual o componente de acesso? Me parece que está faltando um commit aí...

Pelo seu código, parece ser IBX. Tenta colocar a instrução
BD_CONT_REC.Transaction.CommitRettaining;
antes do Close;


GOSTEI 0
Gigatel

Gigatel

17/09/2005

[quote:8f575d29ba=´Gigatel´]aí galera...eu fiz assim..
procedure T_FORM_CR_MS.Button2Click(Sender: TObject);
begin
  while not BD_CONT_REC.Eof do
    begin
    BD_CONT_REC.Delete;
    end;
  Close;
end;


Qual o componente de acesso? Me parece que está faltando um commit aí...

Pelo seu código, parece ser IBX. Tenta colocar a instrução
BD_CONT_REC.Transaction.CommitRettaining;
antes do Close;[/quote:8f575d29ba]

Oi blz ?..para evitar de ficar colocando esta função acima eu coloquei ele no BeofreDelete, para ficar mais fácil..más meu problema agora esta mesmo na função..

Var 
  i,r: integer; 
  n: real; 
begin 
//  n:= 0; 
//  r:= BD_CONT_REC.RecordCount; 
//  BD_CONT_REC.First; 
//    for i:=1 to r do 
//    begin 
//    n:= n + BD_CONT_RECGS_COR_VALOR_PARCELA.asfloat; 
//    BD_CONT_REC.Next; 
//  end; 
//  Edit6.Text:= formatfloat(´R$ ,#,,0.00´,n); 


depois que executo este código é q apresenta o bug... vlw pela ajuda..


GOSTEI 0
Rjun

Rjun

17/09/2005

Você ja tentou usar um [b:ad46f633bf]while not eof[/b:ad46f633bf] em vez de um [b:ad46f633bf]for[/b:ad46f633bf] pelo número de registros?


GOSTEI 0
Gigatel

Gigatel

17/09/2005

Você ja tentou usar um [b:26e5c0fd70]while not eof[/b:26e5c0fd70] em vez de um [b:26e5c0fd70]for[/b:26e5c0fd70] pelo número de registros?


De onde, da função de excluir ou somar .


GOSTEI 0
Gigatel

Gigatel

17/09/2005

Talvez tenha outra forma de excluir sem prescisar usar um loop....


GOSTEI 0
Rjun

Rjun

17/09/2005

Eu quis dizer para usar o [b:e9fb9ae0ea]while[/b:e9fb9ae0ea] nesse momento:

var 
  n: double; 
begin 
  n:= 0; 
  BD_CONT_REC.First; 
  while not BD_CONT_REC.Eof do
  begin
    n := n + BD_CONT_REC.FieldByName(´GS_COR_VALOR_PARCELA´).asfloat; 
    BD_CONT_REC.Next; 
  end; 
  Edit6.Text := FormatFloat(´R$ ,#,,0.00´,n); 
end;



GOSTEI 0
Gigatel

Gigatel

17/09/2005

Não deu certo...num dá erro, más tbm num exclui...


GOSTEI 0
Rjun

Rjun

17/09/2005

Coloque um First no seu código de exclusão.

procedure T_FORM_CR_MS.Button2Click(Sender: TObject); 
begin 
  BD_CONT_REC.First;
  while not BD_CONT_REC.Eof do 
      BD_CONT_REC.Delete; 
  
  Close; 
end;



GOSTEI 0
Gigatel

Gigatel

17/09/2005

Rjun Valeu.. fiz uma pequena modificação e deu certo ( aparentimente )..vlw..t+


Var
   n: double;
begin
  n:= 0;
  BD_CONT_REC.First;
  while not BD_CONT_REC.Eof do
  begin
    n := n + BD_CONT_REC.FieldByName(´GS_COR_VALOR_PARCELA´).asfloat;
    BD_CONT_REC.Next;
  end;
  BD_CONT_REC.First;
  Edit6.Text := FormatFloat(´R$ ,#,,0.00´,n);



é isso aí..outra coisa o q acontece se eu colocar um Commit no evento afterdelete ?


GOSTEI 0
Isabelct

Isabelct

17/09/2005

Oi blz ?..para evitar de ficar colocando esta função acima eu coloquei ele no BeofreDelete, para ficar mais fácil..más meu problema agora esta mesmo na função..


No beforeDelete não resolve. Os eventos ´Before´ acontecem antes. Teria que ser no AfterDelete, ou seja, depois de deletar. Daí sim daria o mesmo efeito.

Mas pensando a nivel de performance isso é ruim, pois você encerraria a transação a cada registro apagado e isso te traria dois problemas: 1) O processo fica mais lento; 2) Se a exclusão der erro, os registros já excluidos não podem mais ser recuperados.

Por isso mantenho minha opinião inicial de que você deveria colocar a chamada do Commit após o laço while que fará a deleção dos registros.


GOSTEI 0
Gigatel

Gigatel

17/09/2005

[quote:7816f9d39b=´Gigatel´] Oi blz ?..para evitar de ficar colocando esta função acima eu coloquei ele no BeofreDelete, para ficar mais fácil..más meu problema agora esta mesmo na função..


No beforeDelete não resolve. Os eventos ´Before´ acontecem antes. Teria que ser no AfterDelete, ou seja, depois de deletar. Daí sim daria o mesmo efeito.

Mas pensando a nivel de performance isso é ruim, pois você encerraria a transação a cada registro apagado e isso te traria dois problemas: 1) O processo fica mais lento; 2) Se a exclusão der erro, os registros já excluidos não podem mais ser recuperados.


Blz..vou testar, e sua idéia é boa..vou analiza-la..vlw..

Por isso mantenho minha opinião inicial de que você deveria colocar a chamada do Commit após o laço while que fará a deleção dos registros.[/quote:7816f9d39b]


GOSTEI 0
Daniel_mc

Daniel_mc

17/09/2005

Olha só pessoal, eu costumo utilizar isto. O erro é que esta faltando uma linha:

 BD_CONT_REC.First;
    while not BD_CONT_REC.Eof do
       begin
           BD_CONT_REC.First; //Posiciona na primira lnha novamente 
           BD_CONT_REC.Delete;
       end;
   Close;


O que acontece é que a função EOF verifica se chegou ao fim da tabela mas não perorre ela, ela deixa esse trabalho por sua conta.


GOSTEI 0
POSTAR