cxGRID te performans sorunu :(
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
cxGRID te performans sorunu :(
iyi calismalar,
cxdbgrid5 de performans bende cok dusuk. sadece 200-300 kayit olan gridde bile kayit ekler veya cikartirken oldukca beklemeler yasamaktayim.
Smartrefresh'i acarak biraz olsun hizlandim ama hala oldukca yavas. ayarlamam gereken buna benzer baska settingler varmi? yada direkt database uzerinde calismaktansa tum islemlerin sonundami dosyaya yazmam gerek.
Yardimlariniz icin simdiden cok tesekkur ederim
cxdbgrid5 de performans bende cok dusuk. sadece 200-300 kayit olan gridde bile kayit ekler veya cikartirken oldukca beklemeler yasamaktayim.
Smartrefresh'i acarak biraz olsun hizlandim ama hala oldukca yavas. ayarlamam gereken buna benzer baska settingler varmi? yada direkt database uzerinde calismaktansa tum islemlerin sonundami dosyaya yazmam gerek.
Yardimlariniz icin simdiden cok tesekkur ederim
Eğer tabloya toplu kayıt girişi/değiştirme işlemi yapıyorsan şuna benzer kodlar kullanman gerekir:
Aksi taktirde her kayıt işleminden sonra Grid update edilecektir.
Eğer problem tek kayıt girişinde de oluyorsa problemi Grid dışında (örneğin DataSet'in Eventlerinde) aramalısın.
İyi çalışmalar.
Kod: Tümünü seç
cxGrid1DBBandedTableView1.DataController.BeginUpdate;
try
DataSource1.DataSet.DisableControls;
//Toplu işlem kodları...
finally
DataSource1.DataSet.EnableControls;
cxGrid1DBBandedTableView1.DataController.EndUpdate;
end;
Eğer problem tek kayıt girişinde de oluyorsa problemi Grid dışında (örneğin DataSet'in Eventlerinde) aramalısın.
İyi çalışmalar.
Bu event'ta StokID isimli integer fieldi stok dosyasinda adi ve turu ile bulup yazdiriyorum. Button Edit ilede cxGrid icinden sectiriyorum.
Ilginize Cok Tesekkur Ederim
Ilginize Cok Tesekkur Ederim

Kod: Tümünü seç
procedure TMenuz.SectirGetText_StokID(Sender: TField;var Text: String; DisplayText: Boolean);
Var
Oku:TADOQuery;
begin
Sender.Alignment:=taLeftJustify;
Oku:=TADOQuery.Create(Self);
Oku.Connection:=osMainADOConn;
Oku.SQL.Add('SELECT dbo.Stok_Karti.StokAdi, dbo.Stok_Turleri.StokTur, dbo.Stok_Karti.AnaBirim as Paket');
Oku.SQL.Add('FROM dbo.Stok_Karti LEFT OUTER JOIN');
Oku.SQL.Add('dbo.Stok_Turleri ON dbo.Stok_Karti.Kod = dbo.Stok_Turleri.StokID');
Oku.SQL.Add('Where (dbo.Stok_Karti.Kod='+IntToStr(Sender.AsInteger)+') and (isnull(dbo.Stok_Turleri.Kod,0)='+IntToStr(Sender.DataSet.FieldByName('TurID').AsInteger)+')');
Oku.Open;
Text:=Oku.FieldByName('StokAdi').AsString+' - '+Oku.FieldByName('StokTur').AsString+' - '+Oku.FieldByName('Paket').AsString;
Oku.Close;
End;
Problem burada.
OnGetText eventi ekranda görünen satır sayısı kadar çalışıyor.
Eğer bu query 1 saniyede çalışıyorsa. Ekranda 30 satır demek 30 saniye demek.
Ki bir kayıt girme işleminde en az 3 defa çalışması demek. Bu da 90 saniye demek.
Sonuçta OnGetText eventinde böyle bir kullanım doğru değil gibi.
Çözüm olarak cxGrid'in LookupCombobox' larını kullanabilirsin.
İyi çalışmalar.
OnGetText eventi ekranda görünen satır sayısı kadar çalışıyor.
Eğer bu query 1 saniyede çalışıyorsa. Ekranda 30 satır demek 30 saniye demek.
Ki bir kayıt girme işleminde en az 3 defa çalışması demek. Bu da 90 saniye demek.
Sonuçta OnGetText eventinde böyle bir kullanım doğru değil gibi.
Çözüm olarak cxGrid'in LookupCombobox' larını kullanabilirsin.
İyi çalışmalar.
a.s.
Musterimin stok veya musteri database'i bayagi bi buyuk. 10bin uzerinde cari ve bin uzerinde stok kaydi. lookup o yuzden kullanamiyorum. sadece kayitlarin cok olmasi degil diger clientlardan girilen urun veya carilerin aninda gozukmesi icinde adi gecen dosyalari surekli acip kapatmak istemiyorum.
sizler urun veya cari hareket dosyalarinda adlarini sakliyormusunuz? izlediginiz yontem hakkinda bilgi verirseniz cok sevinirim.
Musterimin stok veya musteri database'i bayagi bi buyuk. 10bin uzerinde cari ve bin uzerinde stok kaydi. lookup o yuzden kullanamiyorum. sadece kayitlarin cok olmasi degil diger clientlardan girilen urun veya carilerin aninda gozukmesi icinde adi gecen dosyalari surekli acip kapatmak istemiyorum.
sizler urun veya cari hareket dosyalarinda adlarini sakliyormusunuz? izlediginiz yontem hakkinda bilgi verirseniz cok sevinirim.
Hocam soruna cevap mesaji degil bu ama ben tam senin suan yaptigin olayda takildim. Yanlis anlamadiysam vertabanina StokID'sini kaydettiriyorsun ancak Grid üzerinde ID si degil Kodu ve Türü gözüküyor, Kodunu kullanici degistirmeye kalktiginda o koda ait bir stok kodu olup olmadigini kontrol ettiriyorsun eger varsa StokID isimli alandaki deger yeni koda ait ID yi aliyor ve akabinde Türü de degisiyor. İşte ben bu anlattiklarimi yapamadim da o bakimdan soruyorumspiderman yazdı:Bu event'ta StokID isimli integer fieldi stok dosyasinda adi ve turu ile bulup yazdiriyorum. Button Edit ilede cxGrid icinden sectiriyorum.
Ilginize Cok Tesekkur Ederim![]()
Kod: Tümünü seç
procedure TMenuz.SectirGetText_StokID(Sender: TField;var Text: String; DisplayText: Boolean); Var Oku:TADOQuery; begin Sender.Alignment:=taLeftJustify; Oku:=TADOQuery.Create(Self); Oku.Connection:=osMainADOConn; Oku.SQL.Add('SELECT dbo.Stok_Karti.StokAdi, dbo.Stok_Turleri.StokTur, dbo.Stok_Karti.AnaBirim as Paket'); Oku.SQL.Add('FROM dbo.Stok_Karti LEFT OUTER JOIN'); Oku.SQL.Add('dbo.Stok_Turleri ON dbo.Stok_Karti.Kod = dbo.Stok_Turleri.StokID'); Oku.SQL.Add('Where (dbo.Stok_Karti.Kod='+IntToStr(Sender.AsInteger)+') and (isnull(dbo.Stok_Turleri.Kod,0)='+IntToStr(Sender.DataSet.FieldByName('TurID').AsInteger)+')'); Oku.Open; Text:=Oku.FieldByName('StokAdi').AsString+' - '+Oku.FieldByName('StokTur').AsString+' - '+Oku.FieldByName('Paket').AsString; Oku.Close; End
