DBGrid de kayıtları sayfa sayfa gösterme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

DBGrid de kayıtları sayfa sayfa gösterme

Mesaj gönderen mmg »

Merhaba,

Delphi 10.2.3, Sql Express ve Adoquery kullanıyorum. 20000 Ad stok kartı bulunan bir tablo ile sipariş veya fatura madde kaydı açarken stok seçmek için stok penceresini çağırdığımda yaklaşık 40 sn bekletiyor. Bunun sebebininde kayıtları tek seferde okutup ekrana getirmeye çalışmamdan kaynaklandığını biliyorum. Stok kartlarını çağırdığımda ekrana sayfa sayfa ve filtre ederek getirirsem eğer sorunun çözülebileceğini düşündüm. Fakat düşündüğümü bir türlü uygulayamadım. Adoquery ile ekrandan girilen fitrelere uygun olan kayıtları örneğin ilk 1 ile 1000 arası olanları daha sonra sayfa geçişi butonuna basınca 1001 ile 2000 arası olanları nasıl getirebileceğimi bir türlü bulamadım. Bunun için LIMIT, FIRST - SKIP vb bazı komutlardan bahsedilmiş ama hiçbirini çalıştıramadım.

Hedefim filtrelere uygun olan kayıtları dbgridde sayfa sayfa göstrebilmek, bunu nasıl yapabilirim ? Bu konuda çaresiz kalmış olabileceğimi düşünmüyorum mutlaka bir yolu yöntemi vardır fakat ne yaptıysam çözemedim. Yardımlarınızı rica ediyorum. Teşekkürler.

Bu arada araştırmalarım devam ediyor, Adoquery üzerinde MaxRecords özelliği varmış. Buraya 20 yazınca dbgridde sadece 20 kayıt getiriyor. Bu özelliği kullanabilir miyim ?
ihalilcoban
Üye
Mesajlar: 121
Kayıt: 10 Ara 2015 10:39

Re: DBGrid de kayıtları sayfa sayfa gösterme

Mesaj gönderen ihalilcoban »

Merhaba.

Yanılmıyorsam SQL Server için TOP komutuyla dediğiniz işlem yapılabilir.

Örneğin;

Kod: Tümünü seç

SELECT TOP 100 * FROM STOK
Bu şekilde Stok tablosunun ilk 100 kaydını getirmiş olursunuz.
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: DBGrid de kayıtları sayfa sayfa gösterme

Mesaj gönderen mmg »

Merhaba,

Evet ama ben sayfa sayfa getirmek istiyorum, kullanıcı "010" ile başlayan stokları getir diye filtre ettiğinde zaten 10000 adet stok "010" ile başlıyor. Sonuç olarak benim kayıtları sayfa sayfa getirmekten başka çarem yok.
En son mmg tarafından 12 Oca 2019 09:07 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
me_turan@mynet.com
Üye
Mesajlar: 29
Kayıt: 09 Eyl 2017 02:53

Re: DBGrid de kayıtları sayfa sayfa gösterme

Mesaj gönderen me_turan@mynet.com »

Veri tabaninda mutlaka otomatik artan index id vardir. Sql serverda tam bilmiyrum ama mysl de ornek bir kod yazabilirim.
Sorgula butonuna asagidaki sql yazilacak.

Select * from stok where kullanici like '020%' limit 25 order by stokid
me_turan@mynet.com
Üye
Mesajlar: 29
Kayıt: 09 Eyl 2017 02:53

Re: DBGrid de kayıtları sayfa sayfa gösterme

Mesaj gönderen me_turan@mynet.com »

Veri tabaninda mutlaka otomatik artan index id vardir. Sql serverda tam bilmiyrum ama mysl de ornek bir kod yazabilirim.
Sorgula butonuna asagidaki sql yazilacak.

Kod: Tümünü seç

sql:='Select * from stok where kullanici like '020%' limit 25 order by stokid';
Adoquery.sql.add(sql);
Adoquery.open;
Adoquery.last; 
i:=adoquerystokid.asinteger;//listelenmis son kaydin indexi
Sonraki sayfa butonunun altina yazacagin sql ise

Kod: Tümünü seç

sql:='select * from stok where kullanici like '020%' and stokid > ' + inttostr(i) + ' order by stokid';
Adoquery.sql.add(sql);
Adoquery.open;
Adoquery.last;
i:=adoquerystokid.asinteger;// i yi tekrar guncelleyelim. 
Ne oldugunu anlamissindir sanirim. Her seferinde en fazla 25 kayit liseteliyrsun ve id si her seferinde bir onceki en buyuk id den daha buyuk ilk 25 tanesini listeliyrsun. Ilk 25 tanesini ise order by stokid hallediyor. Listenin id ye gore kucukten buyuge dogru olmasini sagliyor.
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: DBGrid de kayıtları sayfa sayfa gösterme

Mesaj gönderen mmg »

Merhaba,

Öncelikle ilginiz için teşekkür ederim fakat limit komutunu ben çalıştıramıyorum hata alıyorum. Aşağıda hatayı paylaşıyorum. Limit komutunu ben bir türlü çalıştıramıyorum.

First chance exception at $74031812. Exception class EOleException with message '[Microsoft][SQL Server Native Client 11.0][SQL Server]Executing SQL directly; no cursor'. Process sayfalama.exe (9556)
me_turan@mynet.com
Üye
Mesajlar: 29
Kayıt: 09 Eyl 2017 02:53

Re: DBGrid de kayıtları sayfa sayfa gösterme

Mesaj gönderen me_turan@mynet.com »

simdi kontrol ettim. Mssql de limit yok sanırım. onun yerine 2005 ve önceki versiyonlarında top var. MSSQL 2012 kullaniyorsan OFFSET ROWS FETCH kullanman gerekiyor. mssql biraz karışık geldi mysql e göre..
sorgula butonuna

Kod: Tümünü seç

sql:='Select * from stok where kullanici like '020%'  order by stokid OFFSET 25 ROWS
    FETCH NEXT 25 ROWS ONLY';
Adoquery.sql.add(sql);
Adoquery.open;
Adoquery.last; 
i:=adoquerystokid.asinteger;
sonraki sayfa butonuna

Kod: Tümünü seç

sql:='select * from stok where kullanici like '020%' and stokid > ' + inttostr(i) + ' order by stokid OFFSET 25 ROWS
    FETCH NEXT 25 ROWS ONLY ';
Adoquery.sql.add(sql);
Adoquery.open;
Adoquery.last;
i:=adoquerystokid.asinteger;// 
bende mssql server olmadığı icin deneyemiyorum. bu yüzden biraz atmasyon oldu. deneyebilirmisin bu şekilde..
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: DBGrid de kayıtları sayfa sayfa gösterme

Mesaj gönderen mmg »

Merhaba Me_turan,

Göstermiş olduğun yöntemi biraz daha araştırıp geliştirerek sanırım DBGrid'de sayfalama yapmayı başardık. Büyük bir azim ve sabırla yardımcı olduğun için çok teşekkür ediyorum gerçekten. Şu an dikkatimi çeken tek problem sadece ekranda görülen kayıt grubuna dahil olmayan örneğin ekranda 2. sayfa kayıtları var iken ve diyelim ki bu kayıtlar "010" ile başlıyorlar ve ben eğer yeni stok kartı girip kodunu "020" verirsem kaydedip DbGrid'e geri döndüğümde yeni eklenen kaydın üzerine konumlanmıyor.2. sayfada bekliyor. Bu problemide çözersem eğer mükemmel bir sayfalama olmuş olacak diye düşünüyorum. Aşağıda ihtiyacı olan arkadaşlar için kodu paylaşıyorum.

1. Forma SayfaNo ve SatirSayisi değişkenleri ekliyoruz.

Kod: Tümünü seç

  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  
  SayfaNo:Integer= 1;
  SatirSayisi:Integer= 25;

implementation

uses U_ANAMENU,  U_DM1, U_DM2;


2. Bir adet "Listeleme" butonu koyuyoruz. Form Show'da bu buton otomatik çalıştırılıyor.

Kod: Tümünü seç

procedure TFORM1.BtListeleClick(Sender: TObject);
begin
  Stoklar.Sql.Add('Select * From Stoklar');
  Stoklar.Sql.Add('Where Stok_No Like Upper(:vStok_No) Order By Stok_No');
  Stoklar.Sql.Add('Offset :vAtla rows fetch first :vSatirAtla rows only');
  Stoklar.Parameters.ParamByName('vStok_No').Value := ARA.Text+'%';
  Stoklar.Parameters.ParamByName('vAtla').Value:= ((SayfaNo -1) * SatirSayisi);
  Stoklar.Parameters.ParamByName('vSatirAtla').Value:= SatirSayisi;
  Stoklar.open;
end;  
3. Forma bir adet "Önceki Sayfa" butonu koyuyoruz.

Kod: Tümünü seç

procedure TFORM1.OncekiSayfaClick(Sender: TObject);
begin
  SayfaNo:= SayfaNo -1;
  if SayfaNo <= 0 then
     SayfaNo:= 1;
  BtListele.Click;
end;
4. Forma bir adet "Sonraki Sayfa" butonu koyuyoruz.

Kod: Tümünü seç

procedure TFORM1.SonrakiSayfaClick(Sender: TObject);
begin
  SayfaNo:= SayfaNo + 1;
  BtListele.Click;
end;
Cevapla