Datasetlerin Kontrolü

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ertline
Üye
Mesajlar: 137
Kayıt: 23 Nis 2005 09:15
Konum: Bartın
İletişim:

Datasetlerin Kontrolü

Mesaj gönderen ertline »

S.A. Arkadaşlar,
Yaptığım programda datasetleri ve datasource leri bir datamudül(name:data) içinde tutuyorum.
Datamodülün içinde;

CARI_MASTER
CARI_DETAIL
STOK_MASTER
STOK_DETAIL
FATURA_MASTER
FATURA_DETAIL

gibi tablolarım var.Programda ana formu ve bu datamodülü AutoCreate ediyorum, diğerleri manuel create edilip kapatılıyor.
Yukarıdaki MASTER tabloları datamodülün Create olayında open yapıyorum.MASTER tabloların DETAIL lerini de MASTER tabloların After Open ınında açıp Before Close unda da Close yapıyorum.,
Ama bu durumda bütün datasetler open oluyor.

Yapmak istediğim kullanılacak datasetin sadece gerektiğinde open olması ve işlevi bittikten sonrada Close edilmesi.Bunu formun Createsine yada Active sinde yapsam sanırım formun açılışı yavaşlar(veriler fazlalaşınca).
Bu konuda sizlerin tecrübelerine ihtiyacım var.Eğer hepsi open olursa program çok yavaş işleyecek gibi geliyor bana.
"Bilginin Doruğuna Hep Birlikte..."
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Buna bir çok alternatif çözüm üretebilirsiniz.

Öncelikle ben şahsen bütün tabloların bütün verilerinin açılmasının doğru olmadığını düşünüyorum. Zira kayıt sayıları milyonlara ulaştığında artık tuşa basıp arada öğlen yemeğine gitmek veya çay molası vermek zorunda kalabilirsiniz.

Tabi burada kullandığınız component grubu da önemli. BDE, dbExpress, IBX, ADO vs. Bence bunlardan da önemlisi örneğin BDE kullanıyorsanız DataSet olarak TTable mı TQuery mi kullanıyorsunuz? Ekstra component (örneğin QuantumGrid) kullanıyor musunuz?

Bu sorulara vereceğiniz cevaplara göre alternatif çözümler önerilebilir.

Ben şahsen dbExpress, TSimpleDataSet (TQuery mantığıyla) ve QuantumGrid kullanıyorum ve DataSet'leri yeri geldiğinde (örneğin forma girişte) açıyorum. Eğer başka bir DataSet'le bir işim olursa önce o DataSet'in açık olup olmadığını kontrol ediyor ve değilse açıyorum.

Size önereceğim bir yöntem TTimer kullanmanız olacak. Burada her OnTimer'da örneğin bir DataSet'i açarsınız. Böylelikle kullanıcı normal işlerini yaparken arada DataSet'ler açılmış olur. Tabi burada kullanıcı bir forma girdiğinde eğer o formda kullandığı DataSet varsa onların açılıp açılmadığının kontrolünü yapmanız gerekecektir.

Bütün tabloların başta açılması ancak bu ve benzeri bir şekilde kullanıcıya fazla rahatsızlık vermeden sağlanabilir.

Ancak kullanacağınız component grubunu vs. başta çok iyi belirlemelisiniz.

İyi çalışmalar.
ertline
Üye
Mesajlar: 137
Kayıt: 23 Nis 2005 09:15
Konum: Bartın
İletişim:

Mesaj gönderen ertline »

Ben component olarak Db nesnelerini ve Datasetleri kullanıyorum.
Yukarıda anlattığım şekilde open ediyorum.
Benim asıl merak ettiğim formun createsi ne yada activesinde kullanılacak dataseti open etmek doğru olur mu?datada veri artınca formun createsinde open old. dan formun açılışı yavaş olabilir mi?
Genel bir kullanım şekli yazabilirseniz çok sevinirim.

Hayırlı çalışmalar...
"Bilginin Doruğuna Hep Birlikte..."
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Asıl konuyu unuttuk. Kullandığınız veritabanı. Eğer Paradox kullanıyorsanız tabloları nerede açtığınız hiç sorun değil. Tabloların büyüklüğü de hiç sorun değil (TTable için söylüyorum). İstediğiniz yerde istediğiniz kadar tabloyu açabilirsiniz.
Ama FireBird/MS SQL/Oracle vs. kullanıyorsanız o zaman tablolar büyüyünce hızla ilgili ciddi sorunlar yaşayabiliyorsunuz. O zaman nerede açtığınızdan daha ziyade daha önceki yazımda belirttiğim hususları değerlendirmelisiniz.

İyi çalışmalar.
heskin35
Üye
Mesajlar: 132
Kayıt: 30 Haz 2004 09:48

Mesaj gönderen heskin35 »

Ben genelde ya formu açan butondan tabloyu açıyorum yada formun create'inde.
Şu şekilde mesela

Kod: Tümünü seç

procedure Tfr_main.bt_acClick(Sender: TObject);
begin
      if Assigned(fr_carihrk) then fr_carihrk.Close;
      application.CreateForm(Tfr_carihrk,fr_carihrk);
      md.ds_carihrk.Close;
      md.ds_carihrk.SelectSQL.Clear;
      md.ds_carihrk.SelectSQL.Add('select * from carihrk');
      md.ds_carihrk.Open;

end;

// yada oncreate olayında

procedure Tfr_cek.FormCreate(Sender: TObject);
begin
  md.ds_cek.Close;
  md.ds_cek.SelectSQL.Clear;
  md.ds_cek.SelectSQL.Add('select * from cek');
  md.ds_cek.Open;
end;

Çok fazla bi yavaşlamaya neden olacağını sanmıyorum. Ama ciddi boyutlarda bilgi var ise o zamanda daha farklı alternatifler düşünülebilir.
Mesela ilk anda belli sayıda kayıt getirili sonra sın da diğer kayıtlar çağırılabilir. Veya arada bi dialog ekranı koyularak işlem süreci gösterilebilir.
Ama genel uygulamalar için standart kayıt sayılarının bi kaç bin olduğu zamanlar da pek bi yavaşlama olacağını sanmıyorum.
ertline
Üye
Mesajlar: 137
Kayıt: 23 Nis 2005 09:15
Konum: Bartın
İletişim:

Mesaj gönderen ertline »

Veritabanı Firebird kullanıyorum.
Kuri 4'lü Jedi Hocam Formun Createsine atmanın aynlış olacağını söylemişti.Sizinde söylediğiniz gibi bu az kayıtta yavaşlama yapmaz tabi fakat fazla kayıt girme olasılığınıda düşünerek sistemi o şekilde hazırlamak en doğrusu olacak.Bunun için fikirleriniz nedir acaba?
"Bilginin Doruğuna Hep Birlikte..."
heskin35
Üye
Mesajlar: 132
Kayıt: 30 Haz 2004 09:48

Mesaj gönderen heskin35 »

Şu mantıktan yola çıkabiliriz sanırım. Her halukarda yüklenecek olan bilginin yüklenme süresi belli.(ister oncreate, ister başka bi yolla butonclick) Diyelim 10 sn.
Bu durumda bana göre en mantıklısı bi dialog kutusu çıkartarak yapılan işlem sürecini göstermek ki uzun süreli işlem yapan programların hemen hemen hepsinde bu şekilde yapılıyor.
ertline
Üye
Mesajlar: 137
Kayıt: 23 Nis 2005 09:15
Konum: Bartın
İletişim:

Mesaj gönderen ertline »

Bu bir progressbar olabilir mi?
Birde progresbar a yada başka bir dialog penceresine bu süreyi nasıl yansıtabiliriz?
"Bilginin Doruğuna Hep Birlikte..."
Cevapla