mükemmel bir arama- like ile

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

mükemmel bir arama- like ile

Mesaj gönderen nitro »

merhaba arkadaşlarım abilerim,
programımda stok bulma kısmında şöyle bir arama kullanıyorum:
( kullandığım makinede delphi olmadığı için kodları birebir verremeyebilirim)

Kod: Tümünü seç

procedure edit1.change;
begin
sorgu.close;
sorgu.sql.clear;
sorgu.sql.add('select * from stoklar where stokad like '+quotedstr('%'+edit1.text+'%'));
sorgu.open;
end;
bu kod edit1e yazdığım içeriği stokadında taşıyan stokları veriyor.
ÖRNEK: edit1.text= 'YASTIK'

listelenen stoklar
BEYAZ YASTIK
SOLEY SİLİKON YASTIK
DAYİNCOLORS SİLİKON YASTIK
...

(not: edit1'e SOLEY YASTIK yazınca SOLEY SİLİKON YASTIK çıkmıyor)

benim yapmak istediğim şu, edit1e yazdığım ( aralarında boşluk olan) tüm kelimeleri içeren ifadeleri çıkarabilsin. yani yukarıdaki örnekteki gibi
edit1'e SOLEY YAS yazınca SOLEY SİLİKON YASTIK kaydını çıkarabilsin.

fikirlerinizi alabilirsem çok memnun olurum.
umarım anlatabilmişimdir.
şimdiden teşekkürler.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

Merhaba
Söylediğine göre, her kelime için ayrı SQL sorgulaması yapman gerekiyor.

örneğin edit1 için şöyle yapıldığını farzedelim..
SQL1_sorgusu
select * from stoklar where stokad like '%S%';
select * from stoklar where stokad like '%SO%';
select * from stoklar where stokad like '%SOL%';
select * from stoklar where stokad like '%SOLE%';
select * from stoklar where stokad like '%SOLEY%';

sonra boşluk tuşuna basılınca bu ikinci bir SQL yapılacak anlamına geliyor.. Böylelikle ilk SQL içn elde edilen Verilere ikinci bir SQL ile sorgulayacaksın..

select * from stoklar where (stokad like '%SOLEY%') AND (stokad like '%Y%');
select * from stoklar where (stokad like '%SOLEY%') AND (stokad like '%YA%');
select * from stoklar where (stokad like '%SOLEY%') AND (stokad like '%YAS%');

bu şekilde basılan her tuş için SQL çalışacak görünüm olarak tatlı bir sorgulama olacaktır. Performans için birşey diyemeyeceğim. Ama stokadı indeksli ise, performans iyi olacaktır.

Umarım işine yarayacak bir fikirdir..

Sevgiler...
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

select * from stoklar where stokad like '%SOLEY%YAS%'

Dikkat edersen % ' ı arada da kullanabiliyorsun. Tabi Edit1.Text içindeki boşlukları %' a çevirmek için StrUtils unit'ine ait AnsiReplaceStr fonksiyonunu kullanabilirsin:

Kod: Tümünü seç

sorgu.sql.add('select * from stoklar where stokad like '+quotedstr('%'+AnsiReplaceStr(edit1.text, ' ', '%')+'%'));
İyi çalışmalar.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

+1 boşlukları % çevirmen lazım veya boşluktan sonra and like ile ikinci kelimeyi sql ine eklemen gerek.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

fikirler için teşekkürler arkadaşlar ama #Hakan_can ve #conari arkadaşlarım olayı eksik anlamışlar.
araya % koyarsam (örneklerdekine bakınız) Soley kelimesi sonda olursa sorgu çalışmayacaktır.
yani sorgu BEYAZ YASTIK ( SOLEY ) yaydını bulmaz.
Murat Dicle abinin dediği gibi yaptım.
edit1 in change olayına aralarında boşluk karakteri ile ayrılmış kelimeleri bir listboxa dolduruyorum ve listboxtaki kelimeleri and ile Murat Dicle abini dediği gibi birleştiriyorum.
çok güzel oldu. :)
teşekkürler.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

nitrokonat yazdı:fikirler için teşekkürler arkadaşlar ama #Hakan_can ve #conari arkadaşlarım olayı eksik anlamışlar.
araya % koyarsam (örneklerdekine bakınız) Soley kelimesi sonda olursa sorgu çalışmayacaktır.
Aslında fazlasını verdim (un, şeker, su, ateş vs.) Artık geriye helvayı yapmak kalmış. Helvayı da sen yaparsın artık. Burada en can alıcı nokta AnsiReplaceStr. Aslında direk kodu yazacaktım ama sen yaparsın artık diye düşünmüştüm.

İyi çalışmalar.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

tekrar teşekkür ediyorum, sayın #Hakan Can. fikirlerinizin yardımı olmadığını söylemedim zaten, kelime sıralamasını da önemsiz yapan bir kod gerektiğini söyledim.

eğer edit1de SOLEY YASTIK yazıyorsa
AnsiReplaceStr ile aralara % işareti koyarsak şöyle bir sorgu oluşur.

Kod: Tümünü seç

select * from stoklar where stokad like %SOLEY%YASTIK%
Bu sorgu aşağıdaki sonuçları getirir.
  • SOLEY BEYAZ YASTIK
    MAVİ SOLEY YASTIK
    SİLİKONLU SOLEY MAVİ YASTIK
yani SOLEY ibaresi YASTIK ibaresinden önce gelen tüm kayıtlar çıkar.
ama bu sorgu aşağıdaki kayıtları getirmiyor
  • BEYAZ YASTIK SİLİKONLU (SOLEY)
    KIRMIZI SİLİKONLU YASTIK (SOLEY)
    YASTIK 10. SOLEY TURUNCU
o nedenle and ibaresi ile birleştirilmiş sorgu daha uygun oldu.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Kastım yani yazmayı düşündüğüm kod şu idi (bilhassa AnsiReplaceStr'ye dikkat demiştim):

Kod: Tümünü seç

procedure TAnaForm.Button1Click(Sender: TObject);
var
  aSQLText: string;
begin
  aSQLText := 'select * from stoklar WHERE stokad LIKE %' + AnsiReplaceStr(Edit1.Text, Chr(32), '% AND stokad LIKE %') + '%';
  ShowMessage(aSQLText);
end;
İyi çalışmalar.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

işte bu süper bi fikir oldu.
4 dörtlük kod derler ya işte bu odur.
çok teşekkürler.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

edit1de 2 adet boşluk yanyana olunca kod hata veriyor.
hata vermesi de normal.
daha sonra başkalarının işine yarar dite yazıyorum.

bu kodu kullanmadan önce edite öyle bir işlem uygulayın ki 2 adet boşkul yan yana olmasın ..!
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

nitrokonat yazdı: 4 dörtlük kod derler ya işte bu odur.
Bence abartıyorsun..Ek olarak kullanılan yöntem de sistematik kodlamaya ters!Böyle bir yapının böyle bir senaryoda kullanılmaması gerekir vs.

Kolay gele..
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

programın tasarımında önceden yapılmış bir hata varsa onu bilemem ama muvcut senaryoda bu en kısa ve ideal kod bence.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

aLonE CoDeR yazdı:Bence abartıyorsun..Ek olarak kullanılan yöntem de sistematik kodlamaya ters!Böyle bir yapının böyle bir senaryoda kullanılmaması gerekir vs.

Kolay gele..
Yoğurt-Yiğit meselesi. Özellikle ButtonClick eventinde yazdım ki bir örnek ve farklı bir bakış açısı olsun diye.

Elbette yüzlerce farklı yöntem uygulanabilir. Ama tabi senin de sistematik kodlamaya uygun çözümünü ve böyle bir senaryoda kullanılması gereken şeyini (kodunu) ben şahsen görmek isterim. Tabi ki varsa. Yoksa sallamak bedava derim yani.

İyi çalışmalar.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Polemiğe girmeyi sevmem, kimseye birşey ispatlamak zorunda hissetmiyorum kendimi.Sallıyor, atıyor, tutuyor vs.dilediğin gibi yorumlayabilirsin.Ben kişisel fikrimi söyledim, isteyen istediği gibi alır kodlar..Bu topice daha birşey yazmayacağım..

Kolay gele..
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Tam siyasiler gibi olmuş (çamur-duvar hikayesi) ama neyse.

İyi çalışmalar.
Cevapla