arkadaşlar tablodan bazı kayıtları silmem gerekti....
silme yaptıktan sonra tablo içeriğini aşağıdaki kodla çekemiyorum çünkü 10'ucu sıraya gelince
tabloda kayıt olmadığı silinmiş olduğu için hata veriyor...
id kullanmadan tablodaki bir sütunu bir dizi içine nasıl atabiliriz..
procedure TfrmAnaliz.Button1Click(Sender: TObject);
var
ilanNu:string;
i:integer;
say:integer;
begin
_yolExe:=ExtractFilePath(Application.Exename);
IBDatabase1.DatabaseName:=_yolExe+'DB\VT.FDB';
IBDatabase1.Connected:=true;
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select count(*) from GECICI');
IBQuery1.Open;
top := IBQuery1.Fields[0].AsInteger;
ShowMessage(IntToStr(top));
for i:=1 to top-2 do
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select * from GECICI where ID='+IntToStr(i) );
IBQuery1.Open;
ilanNu:=IBQuery1.fieldbyname('ILANNU').value;
ListBox2.Items.Add(ilanNu) ;
end;
peki sondan 3 önceki satır silinmiş ise gene hata vermez mi ?
tabloda 120 kayıt var diyelim değişik yerlerde 40 tanesi silinmiş ID 120 olmasına rağmen tabloda 80 kayıt var dolayısıyla
ID kullanarak veriyi çekemeyiz diye düşünüyorum...
Sıralı gidiyorsun diye değerlendirdim. Index 0 .. 20 gidiyorken sen 10 noluyu silersen 19 ITEM kalır... Ancak 20'den geriye gidersen sildiğin item ne olursa olsun yukarıda hepsi kalıyor haldedir.
procedure TfrmAnaliz.Button1Click(Sender: TObject);
var
ilanNu:string;
i:integer;
say:integer;
begin
_yolExe:=ExtractFilePath(Application.Exename);
IBDatabase1.DatabaseName:=_yolExe+'DB\VT.FDB';
IBDatabase1.Connected:=true;
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select count(*) from GECICI');
IBQuery1.Open;
top := IBQuery1.Fields[0].AsInteger;
ShowMessage(IntToStr(top));
for i := top downto 0 do
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select * from GECICI where ID='+IntToStr(i) );
IBQuery1.Open;
ilanNu:=IBQuery1.fieldbyname('ILANNU').value;
ListBox2.Items.Add(ilanNu) ;
end;
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('DELETE FROM GECICI WHERE ID BETWEEN 1 AND 10 );
veya
IBQuery1.SQL.Add('DELETE FROM GECICI WHERE ID in ( 1,2,3,4,5,6,7,8,9,10 )' );
veya
IBQuery1.SQL.Add('DELETE FROM GECICI WHERE ILANNO in ( ''aaa'', ''bbb'', ''ccc'' )' );
veya
IBQuery1.SQL.Add('DELETE FROM GECICI WHERE ILANNO in ( '+QuotedStr(ListBox1.Items[0])+', '+QuotedStr(ListBox1.Items[1])+', '+QuotedStr(ListBox1.Items[2])+' )' );
IBQuery1.ExecSQL;
end;
şeklinde bir defada yapabilirsin. SQL'in gücünü kullanmanı tavsiye ederim.
Tamam işte,
(1) görüntülediğin tablodan seçimlerini yaparsın,
(2) seçim yapılanların bir listesini alır,
(3) verdiğim örnekteki gibi tek satırda hepsini silersin.
Sistemi biraz daha tarif edersen yardımcı olabiliriz.
while ve repeat until döngülerini neden kullanmıyorsun? for belirli sayıda ise kullanılır. sen 50 en fazla sayı içinden bazıları silinmiş olabilir diyorsun, ya silindimi önce karşı tarafa bak (locate gibi) sonra işlem yap, yada sayısal bir takip olmayan şart(lar)a bağlı olacaksa while yada repeat until en iyi çözüm.
dip not daha. While sadece koşul sağlandığı sürece çalışır, koşul sağlanmazsa hiç çalışmaz. Repeat until ise enaz bir kez mutlaka çalışır.
Query.First;// Ben bunu garanti olsun diye mutlaka yazarım, cursor başa gider.
While not Query.EOF do begin// eğer dosya boşsa döngüye girmez
Query.Next
Query.First;
repeat
// Buradaki işlem mutlaka çalışır. dosya boş bile olsa
until Query.EOF// dosya sonuna kadar
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak... Zoru başarırım, İmkansız zaman alır FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
procedure TfrmAnaliz.Button3Click(Sender: TObject);
var
ilanNu:string;
begin
_yolExe:=ExtractFilePath(Application.Exename);
IBDatabase1.DatabaseName:=_yolExe+'DB\VT.FDB';
IBDatabase1.Connected:=true;
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select * from GECICI ');
IBQuery1.Open;
while (not IBQuery1.Eof) do
begin
say:=say+1;
ilanNu:=IBQuery1.fieldbyname('ILANNU').value;
ListBox2.Items.Add(ilanNu) ;
IBQuery1.Next;
end;
ShowMessage(IntToStr(say));
end;
freeman35 hocam teşekkür ederim benim bir türlü anlatmayı beceremediğimi anladınız internetten araştırıp hemen buldum istediğim gibi çalıştı size ve cevap veren tüm hocalarıma sonsuz saygılar