İyi Çalışmalar.
Arkadaşlar datamodule içinde querylerim var. şimdiye kadar toplu olarak açıyordum bunları form açılışında ancak queryler arttıkça yavaşlama olmaya başladı ki kaç tane var yavaşlamaz denilemeyecek kadar fazla var
Şimdi bunları zamanı gelince açıp kapamak istiyorum şöyle bir sorunum var ilgili noktalara geldiğinde "cannot perform this operation on a closed dataset" hatasını alıyorum ama hangi query e bu hatayı veriyor. Bunu tespit etmenin bir yolu varmı acaba.
procedure DatasetKontrol ( pDM : TDataModule );
var
i:integer;
begin
for i:=0 to pDM.ComponentCount -1 do
begin
if (pDM.Components[i] is TQuery) and (not TQuery(pDM.Components[i]).Active) then ShowMessage( pDM.Components[i].Name );
end;
end;
Yukarıdaki kodu editör olmadan yazdım syntax hataları için şimdiden özür dilerim , metoda datamodul parametre geçerek üzerindeki TQuery lerin açık olmayanlarının adlarını ekrana mesaj olarak yazmasını sağlayabilirisiniz, isteğinize göre TQuery den başka sınıflara görede düzenleyebilirsiniz.
bende uygulama ilk yazıldığında senin gibi yaparım ama sona geldiğinde form form gezer hangi formda hangileri kullanmışım not alırım ve sonra her bir form için açılacak tableları açan kodları yazar gerektiiğinde procedure olarak çağırırırım. senin dediğin işlemede gerek kalmaz.
Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
Bu hatayı alıyorsan muhtemel sebepleri (ilk aklıma gelenler) ya RecNo soruyorsundur ya da RecordCount içeren bir satırın vardır. Bu sorguların başına if AdoQuery1.Active gibi bir ön kontrol eklersen hata kontrolüne gerek kalmaz. AdoQuery açıksa devam edersin değilse kontrol sendedir.
@csunguray doğru söylemiş. Bu şekilde bir beta test süresi sonunda olası hataları yakalayıp ilgili yerlerde çözüm üretirsin. Ancak bu hatayı yakalamanın yolu Try Except blokları olduğundan RunTime'da sana yardımcı olamıyacağına göre ve ayrıca projenin büyüklüğü söz konusu ise, ne kadar yakından dönersen kardır demenin vakti gelmiş de geçiyor bile.
Veri okuma aktarma kısımlarını bağımsız modüllere ayırıp programda kullandığın tüm AdoQuery'leri tek bir ana formda toplamayı dene. Yani tüm AdoQuery'ler Form1'de olsun mesela. Sonra da kullanılması gereken yerlerde Form1.AdoQuery1 şeklide kullanılmasını sağlamayı başarırsan işin ilerleyen zamanlarda daha da zorlaşmaz bilakis kolaylaşır.