Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Query Limit
#1
Bir formun içinde Data Grid bileşenim var. Data modül dosyasında ise query ve data source var. 
Formun hızlı açılması için kullanabileceğim en mantıklı yöntem nedir? Query sorgusuna limit koyarsam sonraki kayıtları göremiyor olacağım. Aşağıdaki gibi yazdığımda ise tüm kayıtları getirmeye çalıştığı için bağlantı zaman aşımına uğruyor:

dm.qStok.Close;
  dm.qStok.SQL.Text := 'SELECT * FROM stok';
 dm.qStok.Open;
Cevapla
#2
Data module de bulunan QGrAdBul (Query nin) SQL içeriği :

"
SELECT
GRUP_ISMI
FROM STOKGR

WHERE
GRUP_KOD = :GRUP_KOD
"

Function TDataModule1.StokGrupAdBul(GrKod:String):String;
Begin
QGrAdBul.Close;
QGrAdBul.Params[0].AsString := GrKod;
QGrAdBul.Open;
Result:= QGrAdBul.FieldByName('GRUP_ADI').AsString ;
end;

*****************************************

procedure TFAnaForm.Button1Click(Sender: TObject);
var
GrKod:String;
begin
GrKod:= edit1.text;

CAPTion:=DataModule1.StokGrupAdBul(GrKod);
end;
********************************************************

Ana form da uses kısmında datamodule yı tanımlaman gerekiyor (Bu kısımları bıldıgını dusunuyorum)..
Burda Data module de grup kodu verilen stok grubunun adını geri donduren bir fonksıyon yazdık...
ana formda da grup kodu girilerek grup ismini programa (ekrana ) aktarmış olduk...

burda datamodul de kullanılan SQL filtrelemelerı sen geliştirebilirsınn..

Bu arada Ana form dan Datamodule de bulunan SQL sorgulamalarını çekiyoruz...(procedure veya function larla )
Cevapla
#3
Firebird için

employee adlı bir tablodan ilk 10 satırı döndürme
SELECT
first 10 *
FROM
employee;


employee adlı bir tablodan 20. satırdan başlayarak ilk 10 satırı döndürme
SELECT
first 10 skip 20 *
FROM
employee;


İkinci örnekte 20 yazan yere sayısal bir değişken tanımlayıp, bu değişkenin değerini de form üzerine koyacağınız ileri geri tuşları ile onar onar artırıp azaltarak kodu tekrar çalıştırırsanız istediğiniz olur gibi.
Cevapla
#4
Aslında yapmaya çalıştığım şey şu:
Form içinde CxGrid nesnem var. Bunun otomatik sayfalama özelliği (fetch) var. Ancak tablo ve kayıt sayısı çok olduğu için data modül içindeki query lerin hepsi başlangıçta Close durumda. İlgili query yi formun Create eventinde aktifleştiriyorum. Gerekli SQL kodlarını yazıyorum. Sonrasında form açıldığında CxGrid ile sayfalandırılmış şekilde kayıtları göstermek istiyorum.
Formun ilk açılışında, CxGrid in de sayfalama yapabileceği, ama belirli sayıda kaydın getirilebileceği bir yöntem arıyorum. LIMIT kullandığımda CxGrid bu limite göre işlem yapıyor ve sonraki kayıtları göstermiyor.
Cevapla
#5
(02-12-2024, Saat: 11:53)nehirnnn Adlı Kullanıcıdan Alıntı: Aslında yapmaya çalıştığım şey şu:
Form içinde CxGrid nesnem var. Bunun otomatik sayfalama özelliği (fetch) var. Ancak tablo ve kayıt sayısı çok olduğu için data modül içindeki query lerin hepsi başlangıçta Close durumda. İlgili query yi formun Create eventinde aktifleştiriyorum. Gerekli SQL kodlarını yazıyorum. Sonrasında form açıldığında CxGrid ile sayfalandırılmış şekilde kayıtları göstermek istiyorum.
Formun ilk açılışında, CxGrid in de sayfalama yapabileceği, ama belirli sayıda kaydın getirilebileceği bir yöntem arıyorum. LIMIT kullandığımda CxGrid bu limite göre işlem yapıyor ve sonraki kayıtları göstermiyor.

Merhaba, öncelikle sorgularınızı stored procedure'ler içinde barındırmalısınız. Bunun bir çok faydasından istifade edebilirsiniz. Ardından veri getiren stored procedure'niz içinde sayfalama işlemi yaptırabileceğiniz bir mekanizma kurmalısınız. Her veritabanı dilinde bu tarz işler için bir kısım fonksiyonlar mevcuttur. Örneğin; SQL Server'da:

OFFSET 100 ROWS
FETCH NEXT 50 ROWS ONLY;

gibi. Ya da basitçe kendi mekanizmanızı da yazabilirsiniz. Örneğin 100 kayıt çektiniz, en son çektiğiniz kaydın ID'si 137 olsun. Sizin SELECT cümlenizin WHERE kısmında ID > @SonGondereceginizID gibi bir parametre kullanabilir ve @SonGondereceginizID parametrenizin değeri olarak da 137 geçebilirsiniz. Böylece uygulama tarafında her zaman istediğiniz sayıda kaydınız elinizde olur.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#6
(02-12-2024, Saat: 11:53)nehirnnn Adlı Kullanıcıdan Alıntı: Aslında yapmaya çalıştığım şey şu:
Form içinde CxGrid nesnem var. Bunun otomatik sayfalama özelliği (fetch) var. Ancak tablo ve kayıt sayısı çok olduğu için data modül içindeki query lerin hepsi başlangıçta Close durumda. İlgili query yi formun Create eventinde aktifleştiriyorum. Gerekli SQL kodlarını yazıyorum. Sonrasında form açıldığında CxGrid ile sayfalandırılmış şekilde kayıtları göstermek istiyorum.
Formun ilk açılışında, CxGrid in de sayfalama yapabileceği, ama belirli sayıda kaydın getirilebileceği bir yöntem arıyorum. LIMIT kullandığımda CxGrid bu limite göre işlem yapıyor ve sonraki kayıtları göstermiyor.

cxGrid içindeki DataTableView nesnesi kullanan bir grid 'in varsa. TableView'in DataModeController özelliğinde GridMode 'u true yaparak deneyebilirsin.
Bu özellik tüm veriyi veritabanından alıyor fakat hepsini belleğe yüklemiyor. Bu nedenle performans sağlıyor. Geçmişte sayfalama için bu özelliği kullanarak bahsettiğiniz şekilde birşeyler yaptık diye hatırlıyorum.

cx-Grid-Grid-Mode.png
Cevapla
#7
(03-12-2024, Saat: 16:01)ss1907 Adlı Kullanıcıdan Alıntı:
(02-12-2024, Saat: 11:53)nehirnnn Adlı Kullanıcıdan Alıntı: Aslında yapmaya çalıştığım şey şu:
Form içinde CxGrid nesnem var. Bunun otomatik sayfalama özelliği (fetch) var. Ancak tablo ve kayıt sayısı çok olduğu için data modül içindeki query lerin hepsi başlangıçta Close durumda. İlgili query yi formun Create eventinde aktifleştiriyorum. Gerekli SQL kodlarını yazıyorum. Sonrasında form açıldığında CxGrid ile sayfalandırılmış şekilde kayıtları göstermek istiyorum.
Formun ilk açılışında, CxGrid in de sayfalama yapabileceği, ama belirli sayıda kaydın getirilebileceği bir yöntem arıyorum. LIMIT kullandığımda CxGrid bu limite göre işlem yapıyor ve sonraki kayıtları göstermiyor.

cxGrid içindeki DataTableView nesnesi kullanan bir grid 'in varsa. TableView'in DataModeController özelliğinde GridMode 'u true yaparak deneyebilirsin.
Bu özellik tüm veriyi veritabanından alıyor fakat hepsini belleğe yüklemiyor. Bu nedenle performans sağlıyor. Geçmişte sayfalama için bu özelliği kullanarak bahsettiğiniz şekilde birşeyler yaptık diye hatırlıyorum.

cx-Grid-Grid-Mode.png

Aslında tıkandığım nokta tam da burası. Bahsettiğiniz özelliği biliyorum. Gerekli ayarları yapıyorum. Ancak DataModule içinde ilgili Query nin program başlamadan önce Active=True olması gerekiyor. Bunu aktif yaptığımda ise tüm kayıtları getirmeye çalışıyor. Ben formun hızlı açılması için query leri formun create eventinde aktifleştiriyorum. Bu sefer de yine tüm kayıtları yüklüyor. Bu özelliğin nasıl doğru bir şekilde kullanılabileceğini bulamadım.
Cevapla
#8
(03-12-2024, Saat: 16:13)nehirnnn Adlı Kullanıcıdan Alıntı:
(03-12-2024, Saat: 16:01)ss1907 Adlı Kullanıcıdan Alıntı: cxGrid içindeki DataTableView nesnesi kullanan bir grid 'in varsa. TableView'in DataModeController özelliğinde GridMode 'u true yaparak deneyebilirsin.
Bu özellik tüm veriyi veritabanından alıyor fakat hepsini belleğe yüklemiyor. Bu nedenle performans sağlıyor. Geçmişte sayfalama için bu özelliği kullanarak bahsettiğiniz şekilde birşeyler yaptık diye hatırlıyorum.

cx-Grid-Grid-Mode.png

Aslında tıkandığım nokta tam da burası. Bahsettiğiniz özelliği biliyorum. Gerekli ayarları yapıyorum. Ancak DataModule içinde ilgili Query nin program başlamadan önce Active=True olması gerekiyor. Bunu aktif yaptığımda ise tüm kayıtları getirmeye çalışıyor. Ben formun hızlı açılması için query leri formun create eventinde aktifleştiriyorum. Bu sefer de yine tüm kayıtları yüklüyor. Bu özelliğin nasıl doğru bir şekilde kullanılabileceğini bulamadım.

Yazdığın query'i hangi veritabanında ? ve kullanmış olduğun sql editöründe (mssql managment studio, my sql front gibi ...) ne kadar sürede sorgunun tamamını listeleniyor? 
Datamodule içerisinde kullandığın query component'i 3.parti bir component mi?
Cevapla
#9
uzun lafın kısası, mesajınızda belirttiğiniz SELECT cümlesi tüm kayıtları getir diyor.

Yapmanız gereken kod yazarak hazırladığınız yazılımın ilk önce ekran çözünürlüğü içerisinde ve grid font tipi büyüklüğüne göre kaç kayıt görüntülenebiliyorsa onun iki katı vb. adet kayıtla limitleri daha SELECT cümlesi aşamasında belirlemeniz ve öyle açmanız.


Kullanıcı eğer son kayıtlara veya ilerleme yönünde daha önceki kayıtlara yaklaşırsa -ki bunu veritabanı aktif kayıt  numarası takibi ile gride bakmadan yapabilirsiniz - bu durumda..

1. Kullanıcının üzerinde bulunduğu son kayıt anahtarı bir değişkene alıp

2. Sonraki veya duruma göre önceki sayfayı içeren yeni bir SELECT cümlesi kurulmalı

3. Gelen kayıtlar içerisinde değişkende tutulan anahtarlı kayda konumlanmalı.

İşte bu arka plan işlemleri ile kullanıcı sanki tüm kayıtlar içerisinde dolaşıyor hissi alır.

Bu şekilde Dbgrid bile kullanmayıp herhangi bir listview ile dahi bu gösterim işlemleri yapılabilir.

İllüzyon burada.

Fetch count vb ile gelen veri sayısı limitleri belirlenebilir ancak kontrol sizde olmalı.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Firedac Query-Dataset Kaydırma DataChange Olayı YILDIRIMBEY 9 1.572 31-08-2025, Saat: 04:56
Son Yorum: emailx45
  Cxgrid runtime oluşan sütünların format ve toplam alma ve query currensy true yapm hk diseqc 3 2.100 10-04-2023, Saat: 12:53
Son Yorum: diseqc
  Parametre bulunan Query yapısı… kanjey 2 1.617 13-05-2021, Saat: 09:43
Son Yorum: kanjey
  manuel sıralama query info@guzelceker.com 3 2.636 20-06-2020, Saat: 19:55
Son Yorum: mrmarman
  Bir query'i birden fazla yerde nasıl kullanırım ? boreas 4 3.727 24-04-2019, Saat: 12:27
Son Yorum: Abdullah ILGAZ



Konuyu Okuyanlar: 1 Ziyaretçi