Döngü içinde table.delete

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Döngü içinde table.delete

Mesaj gönderen PROGRAMADOR »

Merhaba,

Kod: Tümünü seç

try 
  AbsTable1.First; 
  while not AbsTable1.Eof do 
  begin 
   
    AbsTable1.Delete; 
    AbsTable1.Next;
  end; 
finally 
  AbsTable1.EnableControls; 
end; 
Yukarıdaki kodda Delete satırından sonra Next satırı geliyor. Delete işleminden sonra kayıdı hemen sildiği için iki ileri kayda mı gider next ile? Dolayısıyla döngüde bir silme işleminden sonra bir kaydı es geçmiş olur muyum?
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Döngü içinde table.delete

Mesaj gönderen esistem »

Kurduğunuz döngü birer kayıt atlayarak siler kayıtları.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Döngü içinde table.delete

Mesaj gönderen Lord_Ares »

sırayla tek tek silmek ise amacınız for döngüsü kullanın. Delphi olmayan bir bilgisayardan yazdığım için kodu deneyip gerekli düzeltmeleri yaparsınız.

Kod: Tümünü seç

var
x :integer
begin
 
if AbsTable1.Recordcount >1 then begin
AbsTable1.First; 
  for x:=1 to  AbsTable1.recordcount -1 do 
  begin 
       AbsTable1.Delete;  
  end; 
AbsTable1.refresh;
end;
end;
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: Döngü içinde table.delete

Mesaj gönderen PROGRAMADOR »

1'den başlayıp Recordcount-1'e kadar gitmesi hatalı değil mi?
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: Döngü içinde table.delete

Mesaj gönderen PROGRAMADOR »

EmptyTable kullanarak aşağıdaki yolu izledim:

Kod: Tümünü seç

procedure CheckOfflines2Backup;
var
  fsrc,fdest,tmp:string;
  srclist:tstringlist;
begin
  if frmDataModule.tb2.RecordCount<1 then exit;
  try
      srclist:=tstringlist.Create;
      frmDataModule.tb2.First;
      while (not frmDataModule.tb2.Eof) do begin
            fsrc:=frmDataModule.tb2.FieldByName('pathtorecovery').AsWideString;
            fdest:=frmDataModule.tb2.FieldByName('destinationpath').AsWideString;
            tmp:=frmDataModule.tb2.FieldByName('filespath').AsWideString;

            if isFileNetworkShare(fdest) then begin //ağ bilgisiyarı online ise
                DoFolderChangedCopy(tmp,fdest);
                if srclist.IndexOf(fsrc)=-1 then DoFolderChangedCopy(fsrc,fdest);
                srclist.Add(fsrc);
                System.SysUtils.DeleteFile(tmp);
            end;
            frmDataModule.tb2.Next;
      end;
      frmDataModule.tb2.Close;
      frmDataModule.tb2.EmptyTable;
      frmDataModule.tb2.Open;
  finally
      frmDataModule.tb2.refresh;
  end;
end;
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Döngü içinde table.delete

Mesaj gönderen thelvaci »

Basitçe;

Kod: Tümünü seç

  while Table.RecordCount > 0 do
    Table.Delete;
yazabilirsiniz.
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: Döngü içinde table.delete

Mesaj gönderen PROGRAMADOR »

Yukarıda yazdığım kod da işe yaramıyor. Yapmak istediğim döngü içindeyken bir koşul gerçekleştiğinde silmek, koşul gerçekleşmediğinde silmemek. Dolayısıyla koşul gerçekleştiğinde döngü içinde bir kaydı silersem ve next dersem bir kaydı es geçmiş oluyorum. Sorunum tam anlamıyla bu.
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: Döngü içinde table.delete

Mesaj gönderen PROGRAMADOR »

Sonunda çözümü buldum. Koşul gerçekleştiğinde kaydı sildikten sonra next demememiz gerekiyor. Koşul gerçekleşmediğinde next demeliyiz. Kod şöyle:


procedure CheckOfflines2Backup;
var
fsrc,fdest,tmp:string;
srclist:tstringlist;
begin
if frmDataModule.tb2.RecordCount<1 then exit;
try
srclist:=tstringlist.Create;
frmDataModule.tb2.First;
while (not frmDataModule.tb2.Eof) do begin
fsrc:=frmDataModule.tb2.FieldByName('pathtorecovery').AsWideString;
fdest:=frmDataModule.tb2.FieldByName('destinationpath').AsWideString;
tmp:=frmDataModule.tb2.FieldByName('filespath').AsWideString;

if isFileNetworkShare(fdest) then begin //ağ bilgisiyarı online ise.. koşulumuz bu
DoFolderChangedCopy(tmp,fdest);
if srclist.IndexOf(fsrc)=-1 then DoFolderChangedCopy(fsrc,fdest);
srclist.Add(fsrc);
System.SysUtils.DeleteFile(tmp);
frmDataModule.tb2.Delete; //buraya dikkat
end else //koşul gerçekleşmiyorsa sonraki kayda gidelim
frmDataModule.tb2.Next; //buraya dikkat

end;
finally
frmDataModule.tb2.refresh;
end;
end;
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Cevapla