Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Locate neden kaçırıyor
#1
var i:integer;
begin
Dm_kayit.FDBaglanKAYIT.StartTransaction;
Form_AnaSayfa.ImageEnMView1.UncheckAll;

 try
 Dm_Foto.FD_FotoView.DisableControls;
 Dm_Foto.FD_Foto.DisableControls;

   for I := 0 to ImageEnMView1.ImageCount-1 do
   begin
     Dm_Foto.FD_FotoView.Locate('FULLYOL',ImageEnMView1.ImageFileName[i],[locaseInsensitive]);
     Dm_Foto.FD_Foto.Locate('FOTOGRAF;UZANTI',VarArrayOf([Dm_Foto.FD_FotoView.FieldByName('FOTOGRAF').AsString,Dm_Foto.FD_FotoView.FieldByName('UZANTI').AsString]),[]);

     if ImageEnMView1.Checked[i]=true then
     begin
     Dm_Foto.FD_foto.Edit;
     Dm_Foto.FD_foto.FieldByName('CHECK1').AsInteger   :=1;
     Dm_Foto.FD_foto.Post;
     end else
     begin
     Dm_Foto.FD_foto.Edit;
     Dm_Foto.FD_foto.FieldByName('CHECK1').AsInteger   :=0;
     Dm_Foto.FD_foto.Post;
     end;
   end;

   Dm_kayit.FDBaglanKAYIT.Commit;
   Dm_Foto.FD_FotoView.Refresh;

   Dm_Foto.FD_FotoView.EnableControls;
   Dm_Foto.FD_Foto.EnableControls;

   HangiIslem:='FotoShow';
   Dm.Timer_FotoSecilenler.Enabled:=true;
 except
   Dm_kayit.FDBaglanKAYIT.Rollback;
   HangiIslem:='FotoShow';
   Dm.Timer_FotoSecilenler.Enabled:=true;
 end;
Close;
end;

locate arasıra odaklamıyor .. benmi yanlış bişeyler yapıyorum acaba
Cevapla
#2
For döngüsü öncesi
Tablo adı.first yazarak döngü öncesi tabloyu ilk kayda konunlandırarak dener misiniz
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
Cevapla
#3
 for I := 0 to ImageEnMView1.ImageCount-1 do
    begin
     Sonuc     := AnsiPos('.' , ImageEnMView1.ImageFileName[i]); // “.” Kaçıncı karakter.
     Fotograf  := AnsiRightStr(AnsiLeftStr(ImageEnMView1.ImageFileName[i] , Sonuc-1),4); // Noktadan öncesi

     if ImageEnMView1.Checked[i]=true then
     begin
     Dm_Foto.FD_FotoSorgu.Active:=false;
     Dm_Foto.FD_FotoSorgu.SQL.Clear;
     Dm_Foto.FD_FotoSorgu.SQL.Add('UPDATE FOTO set CHECK1=1 WHERE ARSIVNO=:tar1 AND FOTOGRAF=:tar2');
     Dm_Foto.FD_FotoSorgu.ParamByName('tar1').Value:=Dm_Kayit.FD_Musteriler.FieldByName('ARSIVNO').AsString;
     Dm_Foto.FD_FotoSorgu.ParamByName('tar2').Value:=Fotograf;
     Dm_Foto.FD_FotoSorgu.ExecSQL;
     end else
     begin
     Dm_Foto.FD_FotoSorgu.Active:=false;
     Dm_Foto.FD_FotoSorgu.SQL.Clear;
     Dm_Foto.FD_FotoSorgu.SQL.Add('UPDATE FOTO set CHECK1=0 WHERE ARSIVNO=:tar1 AND FOTOGRAF=:tar2');
     Dm_Foto.FD_FotoSorgu.ParamByName('tar1').Value:=Dm_Kayit.FD_Musteriler.FieldByName('ARSIVNO').AsString;
     Dm_Foto.FD_FotoSorgu.ParamByName('tar2').Value:= Fotograf;
     Dm_Foto.FD_FotoSorgu.ExecSQL;
     end;
   end;

işlemi yukardaki gibi değiştirdim .. çalışıyor sorun yok yalnız for döngü max 9999 kayıt olduğu zaman yavaşları acaba her defasında ExecSQL çalıştıryruz
Cevapla
#4
Merhaba

Firebird gibi akıllı bir veritabanı için bu şekilde katiyen yavaşlık görmezsiniz. İlk kayıtta ne ise son 9999 nolu kayıtta da aynı hızda update görürsünüz. (aynı hız derken gözle fark etmezsiniz)

Yeter ki index ve key bu update satırına hizmet eder nitelikte olsun.

Locate ile devam etseydiniz cevabım evet yavaşlar olurdu.


Performans artışı için şöyle bir önerim olacak, 

Her fotoğraf için bunu yapmak yerine 
1. Önce müşteriye ait tüm checkleri döngüden önce bir Update SQL ile false yapıp
2. Sadece kullanıcının seçtikletini döngü içinde check etmek. Böylece dadece işaretli sayısı kadar bekleme olur. 9999 değil

Kümülatif olarak update etmek daha hızlı sonuç verir.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#5
(28-06-2020, Saat: 10:18)mrmarman Adlı Kullanıcıdan Alıntı: Merhaba

Firebird gibi akıllı bir veritabanı için bu şekilde katiyen yavaşlık görmezsiniz. İlk kayıtta ne ise son 9999 nolu kayıtta da aynı hızda update görürsünüz. (aynı hız derken gözle fark etmezsiniz)

Yeter ki index ve key bu update satırına hizmet eder nitelikte olsun.

Locate ile devam etseydiniz cevabım evet yavaşlar olurdu.

Teşekkürler cevabınız için diğer diğer döngüsüz locate satırlarınıda değiştircem sanırım bu şekilde daha garanti oldu
Cevapla
#6
Bir ekleme yaptım onu görmemişsiniz. Performans artışı için onu da değerlendirmek isteyebilirsiniz.

Başarılar
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#7
(28-06-2020, Saat: 10:28)mrmarman Adlı Kullanıcıdan Alıntı: Bir ekleme yaptım onu görmemişsiniz. Performans artışı için onu da değerlendirmek isteyebilirsiniz.

Başarılar

evt INDEX VE KEY  demişsiniz bu konuda fazla bilgim yok... index veritabanında otomatik oluşan indexler haricinde örneğin CHECK1 alanınıda İNDEX yapmam gerekrmi

for I := 0 to ImageEnMView1.ImageCount-1 do

ImageEnMView1 componetin sadece chec olanları göster gibi bir komutunu görmedim 
sadece check olanları kaydet gibi bir komutu var
yada manuel olarak check olanları silecem ki o da zaten performansa değişen bişey olmayacak
Cevapla
#8
Üstadım kasıt sadece check edilenleri gösterden değil

IF sorgusunun sadece checked kısmını kullanmak, hedef döngüdeki  SQL işlem sayısını minimize etmek.

özetle 1 SQL ile tüm müşteri kayıtlarını FALSE etmek, checked=true olan sayısı kadar SQL ile sadece bunları TRUE yapmak. Topkam 1 + seçili image kadar SQL cümlesi çalışır. 

Sizin döngü istisnasız her kayıt için dönüyor.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#9
(28-06-2020, Saat: 10:59)mrmarman Adlı Kullanıcıdan Alıntı: Üstadım kasıt sadece check edilenleri gösterden değil

IF sorgusunun sadece checked kısmını kullanmak, hedef döngüdeki  SQL işlem sayısını minimize etmek.

özetle 1 SQL ile tüm müşteri kayıtlarını FALSE etmek, checked=true olan sayısı kadar SQL ile sadece bunları TRUE yapmak. Topkam 1 + seçili image kadar SQL cümlesi çalışır. 

Sizin döngü istisnasız her kayıt için dönüyor.

çok pardon olayı ben kafamda nereye götürdüm Smile


  try
  Dm_Foto.FD_FotoSorgu.Active:=false;
 Dm_Foto.FD_FotoSorgu.SQL.Clear;
 Dm_Foto.FD_FotoSorgu.SQL.Add('UPDATE FOTO set CHECK1=0 WHERE ARSIVNO=:tar1');
 Dm_Foto.FD_FotoSorgu.ParamByName('tar1').Value:=Dm_Kayit.FD_Musteriler.FieldByName('ARSIVNO').AsString;
 Dm_Foto.FD_FotoSorgu.ExecSQL;

   for I := 0 to ImageEnMView1.ImageCount-1 do
   begin
     if ImageEnMView1.Checked[i] then
     begin
       Sonuc     := AnsiPos('.' , ImageEnMView1.ImageFileName[i]); // “.” Kaçıncı karakter.
       Fotograf  := AnsiRightStr(AnsiLeftStr(ImageEnMView1.ImageFileName[i] , Sonuc-1),4); // Noktadan öncesi

       Dm_Foto.FD_FotoSorgu.Active:=false;
       Dm_Foto.FD_FotoSorgu.SQL.Clear;
       Dm_Foto.FD_FotoSorgu.SQL.Add('UPDATE FOTO set CHECK1=1 WHERE ARSIVNO=:tar1 AND FOTOGRAF=:tar2');
       Dm_Foto.FD_FotoSorgu.ParamByName('tar1').Value:=Dm_Kayit.FD_Musteriler.FieldByName('ARSIVNO').AsString;
       Dm_Foto.FD_FotoSorgu.ParamByName('tar2').Value:=Fotograf;
       Dm_Foto.FD_FotoSorgu.ExecSQL;
     end;
   end;
Cevapla
#10
Süpersiniz, bahsettiğim işte buydu.   Idea
Toplam 1 tane kümülatif SQL +  seçili Image adet SQL = az sayıda SQL erişimi yapıldı => maksimum performans Smile

Hatta bunu 2 SQL'e kadar kısaltma imkanı var ya, buradaki örnekte gerek yok Smile  

Kasıt: WHERE FOTOGRAF IN ( tar1, tar2 tar3.... ) gibisinden. Döngüde bu true olanların FOTOGRAF field ile ilgili olanları bir String içerisinde yan yana virgüller koyarak döngünün sonunda SQL yazarak şeklinde...  Tongue




var
  Fotos : String;
begin
  Fotos := '';
  for I := 0 to ImageEnMView1.ImageCount-1 do
  begin
    if ImageEnMView1.Checked[i] then
    begin
      Sonuc     := AnsiPos('.' , ImageEnMView1.ImageFileName[i]); // “.” Kaçıncı karakter.
      Fotograf  := AnsiRightStr(AnsiLeftStr(ImageEnMView1.ImageFileName[i] , Sonuc-1),4); // Noktadan öncesi
      if Fotos = '' then Fotos := QuotedStr( Fotograf )
                    else Fotos := Fotos + ', ' + QuotedStr( Fotograf );
    end;
  end;

// Elimizde Fotos değişkeni altında FOTOGRAF field için virgülle ayrılmış liste var...
// ve henüz hiç SQL erişimi yapmadık

  try
    Dm_Foto.FD_FotoSorgu.Active:=false;
// 1. SQL
    Dm_Foto.FD_FotoSorgu.SQL.Clear;
    Dm_Foto.FD_FotoSorgu.SQL.Add('UPDATE FOTO set CHECK1=0 WHERE ARSIVNO=:tar1');
    Dm_Foto.FD_FotoSorgu.ParamByName('tar1').Value:=Dm_Kayit.FD_Musteriler.FieldByName('ARSIVNO').AsString;
    Dm_Foto.FD_FotoSorgu.ExecSQL;

 // 2.SQL
    Dm_Foto.FD_FotoSorgu.SQL.Clear;
    Dm_Foto.FD_FotoSorgu.SQL.Add('UPDATE FOTO set CHECK1=1 WHERE ARSIVNO=:tar1 AND FOTOGRAF IN ( ' + Fotos + ') ');
    Dm_Foto.FD_FotoSorgu.ParamByName('tar1').Value:=Dm_Kayit.FD_Musteriler.FieldByName('ARSIVNO').AsString;
    Dm_Foto.FD_FotoSorgu.ExecSQL;
  finally

  end;
end;


Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Web Server Application yerine Remobjects neden tercih edilir pro_imaj 1 179 17-06-2020, Saat: 09:16
Son Yorum: Fesih ARSLAN
  Locate ve Lookup TR Karakter sorunu narkotik 3 1.337 15-06-2020, Saat: 16:49
Son Yorum: samsaros@gmail.com
  Nesne Neden Free Olmuyor? Halil Han Badem 3 981 31-07-2019, Saat: 14:28
Son Yorum: sddk
  TCustomControl neden TRANSPARENT olmuyor? uparlayan 7 2.499 03-04-2018, Saat: 15:06
Son Yorum: uparlayan
  Rad Studio Neden Bu Kadar Hızlı? savasabd 14 4.684 27-09-2017, Saat: 19:21
Son Yorum: ismailkocacan



Konuyu Okuyanlar: 1 Ziyaretçi