Dinamik bir Sql-dbgrid ilişkisi nasıl olur?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Dinamik bir Sql-dbgrid ilişkisi nasıl olur?

Mesaj gönderen nitro »

merhaba
geçen gün bir programdan gördüm, büyük bir rapor hazırlanırken, saniyeler geçtikçe kayıtlar dbgride yazılıyordu. Ama benim kullandığım dbgrid ve ibqueryde sorgu tamamen bitince sorgu sonucu kayıtların hepsi bir anda dbgridde görünüyor.
Hem de büyük sorgularda bilgisayar kasılıyor. yukarıda söylediğim gibi bir şey yapılabiliyorsa çok iyi olur. Sorgu çalıştıkça kayıtlar dbgride doluşsunlar.
Nedir? Nasıl olur? Anlatabildim mi acaba olayı?
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

Standar DBGrid ile mümkün değil ama biraz beyin cimnastiği yapılabilir.

Sorguyu çalıştırdıktan sonra (Query1 kullanmış olalım). Bir thread imiz olsa ve Query1 içinde baştan sona gezerek bunu DBGrid görünümlü bir bileşene satır satır yazsa. Bahsettiğine yakın bir sonuç elde edilebilir sanıyorum.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

ben de benzer bir şey düşündüm ama sorgunun işlemcideki işi bitmemiş olacağı için bana mantıklı gelmedi. sorgu çalışırken bu işi yaptırabilmek önemli.
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

Böyle bişeyin olacağını zannetmiyorum.

Sizinde dile geirdiğiniz üzere. Sorgu sonuçlanmamış ? yani ilgili işlem bitmemişki ?

Bunu sadece sorgu sonucu bittiğinde illegaş olrak bişeyler yaparak çözebilrsinin sanırım.

Saygılarımla
Kolay gelsin.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

yorumlarınız için teşekkürler sayın @pro_imaj.
ama ben bu olayı gördüm. query'de her seferinde 10 kayıt almak gibi bir düşünce oluştu bende.
peki böyle birşey mümkün mü?
yani query'ye "kardeşim bu sorgudan kaç sonuç çıkarsa çıksın sen bana ilk 10 tanesini ver, sonra da 11-20 arasındakileri ver, sonra 21-30 arasındakileri ver" gibi bir işlem yaptırabilirmiyim?
ikut

Mesaj gönderen ikut »

nitrokonat yazdı:yorumlarınız için teşekkürler sayın @pro_imaj.
ama ben bu olayı gördüm. query'de her seferinde 10 kayıt almak gibi bir düşünce oluştu bende.
peki böyle birşey mümkün mü?
yani query'ye "kardeşim bu sorgudan kaç sonuç çıkarsa çıksın sen bana ilk 10 tanesini ver, sonra da 11-20 arasındakileri ver, sonra 21-30 arasındakileri ver" gibi bir işlem yaptırabilirmiyim?
merhaba gecen bir arkadas bundan bahsediyordu. bende detay istemiştim gelince buluruz...
Kullanıcı avatarı
SeRoKi
Üye
Mesajlar: 72
Kayıt: 09 Kas 2005 02:59
Konum: İstanbul

Mesaj gönderen SeRoKi »

sql de limit diye bir konut vardı

Kod: Tümünü seç

select * from x limit 0,30
gibi kullanılıyordu.
mceL
Üye
Mesajlar: 56
Kayıt: 28 Eyl 2003 01:19
Konum: Bursa
İletişim:

Mesaj gönderen mceL »

yani query'ye "kardeşim bu sorgudan kaç sonuç çıkarsa çıksın sen bana ilk 10 tanesini ver, sonra da 11-20 arasındakileri ver, sonra 21-30 arasındakileri ver" gibi bir işlem yaptırabilirmiyim?
Kullandığınız veritabanının desteklemesi lazım.
Olabilenler için;
Genel SQL cümlesinin sonuna LIMIT konuluyor.

Örnek bir Postgresql komutu:

Kod: Tümünü seç

SELECT * FROM tablo LIMIT 10 OFFSET 1
ilk 10 kaydı alır. OFFSET 2, ilk 10 dan itibaren 10 kayıtı alır gibi.
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

Merhaba @Nikrokonat;

Böyle bişeyide yine mantık çerçevesinde yapabilrsiniz. dediğiniz işlem şöyle olabilir;_

integer bir değişken tanımlarsınız. Gridide örn 20 satıra denk gelecek şekilde ayarlayıp

Kod: Tümünü seç

SELECT TOP 20 * FROM TABLE
Where MalKodu between 'ilk10malkodu' and 'sonraki10malkodu'
Bu sql kodu ile ilk 20 kaydın gelmesini sağlıyacaksınız sonra dbgridin olaylarını kullanark ilgili Top 20 yi kendinize göre uyarlıyacaksınız page up page down tuşlarıyna basıldığından diğer 20 yi gösterecek şekilde. yani mantık olarak ekranda 20 kaydın görünmesini sağlicak bir algoritme uygulayabilrsiniz.

Piyasadaki tişcari prg bazıları (Link) buna benzer yöntemlerle listeleme işlemlerini yapıyorlar.

Saygılarımla
Kolay gelsin.
En son pro_imaj tarafından 10 Tem 2006 01:48 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Aslında sorgu hızı kısmı biraz karanlık. Gerçekten de sorgu hızı mu düşük, yoksa bunu görsel bir arabirimde gösterme hızı mı düşük?

Basit bir örnek vereyim.

SELECT * FROM Tablo1 gibi basit bir sorgu yazdınız ve bu sorgu sonucu 1000 kayıt döndü. Bunu eğer cxGrid gibi bir tabloda gösterecekseniz, sorgu anında dönmesine rağmen, bileşenin veriyi kendi istediği şekilde kullanabilmesi için transform etmesinden dolayı bir hayli beklersiniz. Tahminimce sizin gördüğünüz de bu soruna bir çözüm oluşturuyor.

Temel mantık basit, ama kodlaması bir hayli zahmetli. Bir thread hazırlayın ve threade hem sorgu cümlenizi, hem de hedef olarak kullanacağını memory table'i gönderin. Daha sonra thread içinde Memory table'in bir kopyasını çıkarın, sorgu cümlenizi ADO gibi bir arabirim ile açın ve bütün kayıtları sıra ile mem table'in kopyasına kaydedin. Belli aralıklarla memtable ve memtable kopyasını senkronize edin. Böylece program çalışırken veriler sizin gördüğünüz gibi gelecektir.

Kolay gelsin,
Bahadır Alkaç
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

@nitrokanat sen sonucu görüyorsun belki arka planda çalışan senaryo senin düşündüğün gibi olmayabilir. Belki sorgu tümden bitiriliyor gösterme işlemi adımlara bölünüyordur. Çünkü gösterme (ekrana çizme) çok zaman alan bir iş.

Diğer taraftan bir sorgu sonucunu bölmek mümkün. Tek sorgu yerine bölerek parça parça sonuç alınabilir. Örneği tablomda 100 kayıt var. 10 kayıt alırım

Kod: Tümünü seç

 select first(10) * from tablom
sonra 10 tanedaha alırım

Kod: Tümünü seç

 select first(10) skip(10) * from tablom
bu işlemi storedprocedure de bir döngüyle yapabilirim.


Yalnız bir hatırlatma MS Sql serverda TOP (first yerine) FB deki gibi hızlı sonuç vermiyormuş. Daha önce deneyen ve yazan arkadaşlarımız olmuştu. @terminator ün yorumu enteresandı; "TOP tüm kayıtları işleyip içlerinden en seçkinlerini getiriyor" demişti.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

olayın gösterim kısmında olduğunu sanmıyorum çünkü bilgisayarın yoğun şekilde işlem yaptığı ve yaptıkça gride attığı belli.
parça parça data çekmek konusunda güzel fikirler çıktı.
peki querynin sql kodu değişince dbgriddeki mesela ilk 10 data kaybolacak,
dataların dbgridden kaybolmamasını nasıl sağlarız?
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

nitrokonat yazdı:olayın gösterim kısmında olduğunu sanmıyorum
Direkt onunla alakalı.InfoPower paketinin DBGridini master detail (ExpandButton bileşeniyle birbirine bağlamak suretiyle..) şekilde bağlayıp çok fazla değil 3000 kayıtla filtre edip bir dene bakalım ekrana geliş süresi ne oluyor.Hemen akabinden de normal bi gridde select çek ve seyret filmi.Olay perde arkasında o şekilde gösterilecek şekilde ayarlanmıştır vs.

Kolay gele..
mceL
Üye
Mesajlar: 56
Kayıt: 28 Eyl 2003 01:19
Konum: Bursa
İletişim:

Mesaj gönderen mceL »

Veriler dbGrid üzerinde değil, stringGrid üzerinde tutulmalı eğer LIMIT uygulanacaksa, sütun ayarları da programcı tarafından yapılmalıdır.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

aLonE CoDeR yazdı:
nitrokonat yazdı:olayın gösterim kısmında olduğunu sanmıyorum
Direkt onunla alakalı.InfoPower paketinin DBGridini master detail (ExpandButton bileşeniyle birbirine bağlamak suretiyle..) şekilde bağlayıp çok fazla değil 3000 kayıtla filtre edip bir dene bakalım ekrana geliş süresi ne oluyor.Hemen akabinden de normal bi gridde select çek ve seyret filmi.Olay perde arkasında o şekilde gösterilecek şekilde ayarlanmıştır vs.

Kolay gele..
peki gösterim olayını kademe kademe yapmak mümkün mü? yani kayıtların hepsi birden gözükmesede 10-10 gözükse.
Cevapla