dxmemtable Locate sorunu hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

dxmemtable Locate sorunu hakkında

Mesaj gönderen adelphiforumz »

Selamlar

dxmemtable ile locate komutunu kullanıyorum
tablo içerisindeki kayıt sayısı 15-20 bin civarına ulaştığında locate komutu hatalı kayıtlar üzerine konumlanıyor yada hiç yokmuş gibi davranıyor

Kod: Tümünü seç

if memOnceki.Locate('IdUrun', memAktif.FieldByName('IdUrun').AsInteger, []) = True then
...
else
....

if memOnceki.Locate('IdUrun', memAktif.FieldByName('IdUrun').AsInteger, [loPartialKey]) = True then
...
else
....

if memOnceki.Locate('IdUrun', memAktif.FieldByName('IdUrun').AsInteger, [loCaseInsensitive]) = True then
...
else
....
bunun nedeni ne olabilir fikri olan varmıdır

teşekkürler
En son adelphiforumz tarafından 04 May 2017 10:27 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: dxmemtable Locate sorunu hakkında

Mesaj gönderen freeman35 »

20.000 kayıt için neden memtable kullanıyorsun? kullandığın veri tabanında tmp table yada embeded firebird sqlite bile daha mantıklı.
AsInteger yerine asvariant kullan, locate e gönderdiğin parametre variant.
filtre koyup denedin mi? aradığın kayıdın olduğuna emin misin? bir dbgrid koyup test et yada veriyi textfile olarak kaydedip bir incele, bazen gözden kaçan oluyor. mesela locate e memAktif.FieldByName('IdUrun').AsInteger bu aradığın değerimi veriyor?
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: dxmemtable Locate sorunu hakkında

Mesaj gönderen ertank »

TDataSet.Locate() parametrelerinden en sonuncusu aramanın nasıl yapılacağını belirler. Bu parametrenin aşağıdaki şekilde boş olması

Kod: Tümünü seç

memOnceki.Locate('IdUrun', memAktif.FieldByName('IdUrun').AsInteger, []);
aramanın tam eşleşme şeklinde gerçekleşmesi anlamına gelir. Dataset imleci eşleşme bulunur ise aranan kayıt üzerine gider. Eşleşme yok ise dataset imleci olduğu yerde kalır. Aşağıdaki şekilde loPartialKey şeklinde çalıştırılması

Kod: Tümünü seç

memOnceki.Locate('IdUrun', memAktif.FieldByName('IdUrun').AsInteger, [loPartialKey])
arama yapılır iken tam eşleşen kayıt yok ise en yakın kaydın bulunması anlamına gelir. Dataset imleci ya tam eşleşen kayıt üzerine ya da en yakın bulunan kayıt üzerine gider.

Kullanım amacınıza göre kod düzenlemesi yaparsanız sorunun çözüleceğini düşünüyorum.
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: dxmemtable Locate sorunu hakkında

Mesaj gönderen adelphiforumz »

"freeman35" dışarıdan excel üstünden veri alınıp karşılaştırmalar yapılıyor bu karşılaştırmalar herhangi bir yerde saklanıp sonrasında işlem yapılmıyor
bu nedenle veritabanına yönelmedin. Filtre ile denediğimde doğru sonuç geliyor. Kayıt memtable içerisinde var ve türüde "TIntegerField"

"ertank" sorumun örneklemesinde belirttiğim gibi locate fonksiyonunu 3 farklı option özelliği ilede denedim.
Fakat locate işlemi else düşüyor

Kod hatası olup olmadığını anlamak için aradığım kayıt 10.sıradaki kayıt olarak belirledim
eğer memtable içine 10 bin civarı kayıt yüklersem locate doğru çalışıyor
aynı dosyanın devamı olarak 15-20 bin civarı yükleme yapınca bulmuyor
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: dxmemtable Locate sorunu hakkında

Mesaj gönderen ertank »

- TdxMemTable içinde indeks oluşturdunuz mu?
- Alternatif olarak ücretsiz TkbmMemTable bileşenini denemenizi tavsiye ederim. Bağlantıdaki küçük örnek üzerinde test ettiğim kadarıyla indeks tanımlanmadan dahi sorun çıkmadan kayıtları bulabiliyor.
memtable_locate_sorunu.rar
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: dxmemtable Locate sorunu hakkında

Mesaj gönderen freeman35 »

veritabanını saklamak zorunda değilsin. Enson mikro ya eklenti yapmıştım, eski versiyonda ağır çalışıyor diye optimize istediler, memtable yerine sqlite kullandım, şimdi neden memtable kullanıyorum demeye başladım. program her çalıştırıldığında db yi siliyor, table ları tekrar oluşturuyor. yani veri sakklamak yok. sql olduğu için her türlü şey yapmak mümkün. memtable dediğiniz, adı üzerinde mem katili, pc lerde ramde ucuz olsun diye 8gb dır, işletim sistemi vs lere yer kalmıyor, disk sürekli devrede.
ertank ın dediği gibi index oluşturmak işe yarayabilir.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Cevapla