Aynı anda birden çok alanda arama
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Aynı anda birden çok alanda arama
S.a.
Tablomuz da 6 alan var Normalde Her bir alan için bir editbox ile arama
yapıyoruz. Benim yapmak istediğim Tek bir edit içine yazılan
cümleyi kelimelere ayırarak bu kelimeleri her alana göre arama
yapmak. Kelimelere ayırma işlemini yapıp her bir kelimeyi elde ettim.
Buradan sonra nasıl bir SQL cümlesi yazmalıyız? Cümleniz örneğin;
6 alandan ve karışık veri olacak.
Tablomuz:
stok_kodu,stok_cinsi,malgrubu,marka,altgrup,ozelkod
şeklinde
Biz arama cümlemize yukarıdaki alanlara ait kelimeleri
karışık da yazsak arama yapmak için SQL cümlemizi nasıl oluşturmalıyız?
Tablomuz da 6 alan var Normalde Her bir alan için bir editbox ile arama
yapıyoruz. Benim yapmak istediğim Tek bir edit içine yazılan
cümleyi kelimelere ayırarak bu kelimeleri her alana göre arama
yapmak. Kelimelere ayırma işlemini yapıp her bir kelimeyi elde ettim.
Buradan sonra nasıl bir SQL cümlesi yazmalıyız? Cümleniz örneğin;
6 alandan ve karışık veri olacak.
Tablomuz:
stok_kodu,stok_cinsi,malgrubu,marka,altgrup,ozelkod
şeklinde
Biz arama cümlemize yukarıdaki alanlara ait kelimeleri
karışık da yazsak arama yapmak için SQL cümlemizi nasıl oluşturmalıyız?
En son hbulus tarafından 07 Tem 2014 05:59 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Erbab-ı kemâli çekemez nakıs olan, rencide olur Dide-i Huffaş ziyadan....
Re: sql Server cümleyi parçalayarak arama
merhaba karışıkta yazsak derken oraya tam olarak anlamadım örnek bie foto koymanız mümkünse daha açıklayıcı olur diye düşünüyorum.Biz arama cümlemize yukarıdaki alanlara ait kelimeleri
karışık da yazsak arama yapmak için SQL cümlemizi nasıl oluşturmalıyız?
Soru Sorarken yazmaya Üşenmeyen Parmaklar Sorunun Çözüldükten Sonra Teşekkür etmeye de Üşenmesin.
Re: sql Server cümleyi parçalayarak arama
alanların sırasına göre yani; stok_kodu,stok_cinsi,malgrubu,marka,altgrup,ozelkod
alanlarına göre altı adet kelimeyi girdiğimde ilgili kayıtları getiriyor. Aramada meselâ
stok-kodunu 3. sırada Ozelkodu birinci sırada girdiğimde de kayıtlar listelemesini istiyorum.
Ve ayrıca illa da 6 kelime değil 3 kelimede girsem İlgili kayıtların Listelenmesini istiyorum.
Kısaca böyle ama anlatabildim mi? bilmiyorum.
alanlarına göre altı adet kelimeyi girdiğimde ilgili kayıtları getiriyor. Aramada meselâ
stok-kodunu 3. sırada Ozelkodu birinci sırada girdiğimde de kayıtlar listelemesini istiyorum.
Ve ayrıca illa da 6 kelime değil 3 kelimede girsem İlgili kayıtların Listelenmesini istiyorum.
Kısaca böyle ama anlatabildim mi? bilmiyorum.
Erbab-ı kemâli çekemez nakıs olan, rencide olur Dide-i Huffaş ziyadan....
Re: sql Server cümleyi parçalayarak arama
Eğer SQL Server kullanıyorsan aşağıdaki kalıba benzer bir şey yapabilirsin;
Bunu eğer Delphi içinden üreterek parametrik olarak kullanmak istiyorsan da aşağıdaki gibi bir şey kullanabilirsin;
Şu şekilde de SQL cümlesini inceleyebilirsin;
fonksiyonun alanlarla ilgili kısmını (yani aAlan1..aAlan5'i) dinamik dizi şeklinde parametrik de yapabilirsin (o kısmını da sen keşfet
Kod: Tümünü seç
DECLARE @ARANAN VARCHAR(500);
SET @ARANAN = '%Murtaza%'
SELECT TOP 100 *
FROM dbo.[Arastirilacak_Tablo]
WHERE (0 = 0) /* 0=0 ifadesi aşağıdaki "OR" ifadelerini yazmayı kolaylaştırmak içindir. 0=0 her zaman true verir */
OR [Alan_1] LIKE @ARANAN
OR [Alan_2] LIKE @ARANAN
OR [Alan_3] LIKE @ARANAN
OR [Alan_4] LIKE @ARANAN
Kod: Tümünü seç
function GenerateSearchSQLScript(aAranan: String; aTabloAdi: String; aAlan1, aAlan2, aAlan3, aAlan4, aAlan5: String): String;
var
aTmp : String;
aSQL : String;
begin
Result := '';
if Trim(aAranan) <> '' then
begin
aTmp := QuotedStr('%' + Trim(aAranan) + '%');
aSQL := format( ' SELECT TOP %0:d * '
+ ' FROM %2:s '
+ ' WHERE (0=0) '
+ ' OR %3:s LIKE %1:s '
+ ' OR %4:s LIKE %1:s '
+ ' OR %5:s LIKE %1:s '
+ ' OR %6:s LIKE %1:s '
// + ' OR %7:s LIKE %1:s '
,
[ 100 { %0:d (sıfırdan büyük olmalı) }
, aTmp { %1:s }
, Trim(aTabloAdi) { %2:s }
, aAlan1 { %3:s }
, aAlan2 { %4:s }
, aAlan3 { %5:s }
, aAlan4 { %6:s }
// , aAlan5 { %7:s }
]);
Result := aSQL;
end;
end;
Kod: Tümünü seç
ShowMessage( GenerateSearchSQLScript('murtaza', 'dbo.Cariler', 'CariKart', '[Hesap No]', 'Adres', 'Telefon', 'OzelKod1') );
Re: sql Server cümleyi parçalayarak arama
Ya aslında bana iyi bir fikir vermiş oldun, gece üşenmedim erinmedim bu fonksiyonu biraz geliştireyim dedim;
Şu şekilde kullandığımızda aşağıdaki SQL cümlesini elde etmiş oluyoruz.
Kod: Tümünü seç
function GenerateSearchSQLScript(aAranan: String; aTabloAdi: String; aMiktar: Integer; const WhereAlanlari: Array of String): String;
var
aTmp : String;
aSQL : String;
I : Integer;
function eger(aKosul: Boolean; Dogruysa, Yanlissa: String): String; overload;
begin
if aKosul then Result := Dogruysa else Result := Yanlissa;
end;
function eger(aKosul: Boolean; Dogruysa, Yanlissa: Integer): Integer; overload;
begin
if aKosul then Result := Dogruysa else Result := Yanlissa;
end;
begin
Result := '';
if Trim(aAranan) <> '' then
begin
// format fonksiyonunda % işareti kullanılan bir karakterdir, dolayısıyla en son aşamada % işaretini basmamız gerekiyor.
aTmp := QuotedStr('<#>' + Trim(aAranan) + '<#>');
// SQL cümlemizin ana gövdesini üretiyoruz
aSQL := format( ' SELECT TOP %0:d * '#13#10
+ ' FROM %1:s '#13#10
+ ' WHERE (0 = 0) '#13#10
,
[ aMiktar
, Trim(aTabloAdi)
]);
// Araştırma yapılacak alanları tek tek sorguya ekliyoruz
for I := Low(WhereAlanlari) to High(WhereAlanlari)
do aSQL := format ( '%s %s (%s LIKE %s) '#13#10
,
[ aSQL
, eger(I = Low(WhereAlanlari), 'AND', 'OR')
, WhereAlanlari[I], aTmp
]);
// <#> işaretlerini % işaretine geri çevirerek SQL'deki LIKE komutuna uygun hale getiriyoruz
aSQL := StringReplace(aSQL, '<#>','%',[rfReplaceAll]);
// Bitti
Result := aSQL;
end;
end;
Kod: Tümünü seç
Show_Message(
GenerateSearchSQLScript('murtaza', 'dbo.Kisiler', 50, ['Hesap', '[Bağlı Olduğu Şirket]', 'Hakkında'])
);
Kod: Tümünü seç
SELECT TOP 50 *
FROM dbo.Kisiler
WHERE (0 = 0)
AND (Hesap LIKE '%murtaza%')
OR ([Bağlı Olduğu Şirket] LIKE '%murtaza%')
OR (Hakkında LIKE '%murtaza%')
Re: sql Server cümleyi parçalayarak arama
İlginize teşkkür ederim. Sizin örneği denedim. Sadece bir değeri alanlarda arıyor.
Örnek olarak alan bilgilerimiz
şöyle olsun :
stok_kodu :7700500155
stok_cinsi :BUJİ
malgrubu : ATEŞLEME
marka : MAİS
altgrup : BUJİ
ozelkod : DENEME1
Ben edit1'e şöyle yazdığımda :'7700 BU TEŞLE MA Jİ DEN' hatasız listeliyorum. Yani altı alana ait altı kelime.
İstediğim ise şu şekilde:
1. edit1'e şöyle yazdığımda da arama yapabilmek :'DEN 7700 TEŞLE BU MA Jİ ' (karışık sırada)
2. Altı alan değilde, üç alan girdiğimde de arasın : 'TEŞLE BU DEN' gibi
Vay be, soru sormak da ne zor bir sanatmış, amma karıştırdım.
demiştim.hbulus yazdı:Aramada meselâ
stok-kodunu 3. sırada Ozelkodu birinci sırada girdiğimde de kayıtlar listelemesini istiyorum.
Ve ayrıca illa da 6 kelime değil 3 kelimede girsem İlgili kayıtların Listelenmesini istiyorum.
Kısaca böyle ama anlatabildim mi? bilmiyorum.
Örnek olarak alan bilgilerimiz
şöyle olsun :
stok_kodu :7700500155
stok_cinsi :BUJİ
malgrubu : ATEŞLEME
marka : MAİS
altgrup : BUJİ
ozelkod : DENEME1
Ben edit1'e şöyle yazdığımda :'7700 BU TEŞLE MA Jİ DEN' hatasız listeliyorum. Yani altı alana ait altı kelime.
İstediğim ise şu şekilde:
1. edit1'e şöyle yazdığımda da arama yapabilmek :'DEN 7700 TEŞLE BU MA Jİ ' (karışık sırada)
2. Altı alan değilde, üç alan girdiğimde de arasın : 'TEŞLE BU DEN' gibi
Vay be, soru sormak da ne zor bir sanatmış, amma karıştırdım.
Erbab-ı kemâli çekemez nakıs olan, rencide olur Dide-i Huffaş ziyadan....
Re: sql Server cümleyi parçalayarak arama
SQL cümlesinin WHERE kısmına kendinize özgü eklemeler yaparsanız probleminiz çözülür.
Re: sql Server cümleyi parçalayarak arama
Elinizde SQL Server gibi bir araç varken stored procedure kullanmamak, kendinize eziyet etmek anlamına gelir. Aşağıdaki gibi bir yapı kullanabilirsiniz;
Yukarıdaki stored procedure'ü isterseniz parametresiz, isterseniz herhangi bir parametresi dolu olarak yada tümü dolu olarak gönderebilirsiniz. İşin kayda değer yanı where kısmındaki ISNULL kullanımındadır.
Kod: Tümünü seç
CREATE PROCEDURE sp_Search
@StokKodu VARCHAR(50) = NULL,
@StokCinsi VARCHAR(50) = NULL,
@MalGrubu VARCHAR(50) = NULL,
@Marka VARCHAR(50) = NULL
AS
SELECT <İstediğiniz alanlar buraya>
FROM Tablonuz T
WHERE
ISNULL(T.StokKodu, 'X') LIKE '%' + ISNULL(@StokKodu, ISNULL(T.StokKodu, 'X')) + '%' AND
ISNULL(T.StokCinsi, 'X') LIKE '%' + ISNULL(@StokCinsi, ISNULL(T.StokCinsi, 'X')) + '%' AND
ISNULL(T.MalGrubu, 'X') LIKE '%' + ISNULL(@MalGrubu, ISNULL(T.MalGrubu, 'X')) + '%' AND
ISNULL(T.Marka, 'X') LIKE '%' + ISNULL(@Marka, ISNULL(T.Marka, 'X')) + '%'
- ender_arslanturk
- Kıdemli Üye
- Mesajlar: 709
- Kayıt: 18 Şub 2005 03:38
- Konum: İstanbul
Re: sql Server cümleyi parçalayarak arama
Selâmlar,
contains komutu sizin yerinize kelimeleri parçalar. ve arama kriterini "kelimelerden biri" olarak hazırlar.
İyi çalışmalar,
Kod: Tümünü seç
Select* From StokTablom
Where
Contains(stok_kodu , '*'+Edit1.Text+'*') or
Contains(stok_cinsi , '*'+Edit1.Text+'*') or
Contains(malgrubu , '*'+Edit1.Text+'*') or
Contains(marka , '*'+Edit1.Text+'*') or
Contains(altgrup , '*'+Edit1.Text+'*') or
Contains(ozelkod , '*'+Edit1.Text+'*') or
Contains(stok_kodu , '*'+Edit1.Text+'*')
İyi çalışmalar,
Re: Aynı anda birden çok alanda arama
Contains bizim işi çözüyor gibi, ama benim anlama şansım olmayacak herhalde. Çünkü sql server kurulurken fulltextsearch
özelliği ile kurulmamış o yüzden yeniden kurmak gerekliymiş. (contains ve freetext komutları, fulltextsearch özelliği gerektiriyormuş) Şu aşamada yüklemeyi yenilemem mümkün değil. (Ya da mümkün mü acaba??)
Başka türlü tavsiyesi olan yok mu üstadlardan?
Hayırlı iftarlar....
S.a.
özelliği ile kurulmamış o yüzden yeniden kurmak gerekliymiş. (contains ve freetext komutları, fulltextsearch özelliği gerektiriyormuş) Şu aşamada yüklemeyi yenilemem mümkün değil. (Ya da mümkün mü acaba??)
Başka türlü tavsiyesi olan yok mu üstadlardan?
Hayırlı iftarlar....
S.a.
Erbab-ı kemâli çekemez nakıs olan, rencide olur Dide-i Huffaş ziyadan....
-
- Üye
- Mesajlar: 330
- Kayıt: 09 Mar 2004 11:18
- Konum: Konya
- İletişim:
Re: Aynı anda birden çok alanda arama
edite girilen cümleyi ('7700 BU TEŞLE MA Jİ DEN' )
Kelime Kelime parçalayarak
her alan için Üst konularda ki GenerateSearchSQLScript yardımıyla, sorgunu oluşturabilirsin...
Sorgunun hızlı çalışması için tüm alanları indexlemende fayda olacaktır...
Ayrıca kendine bir algoritma kurup edite yazılırken kelimeleri tamamlayabilirsen ( google gibi ) hem sorgunu hem de kullanıcını hızlandırabilirsin diye düşünüyorum
Kelime Kelime parçalayarak
her alan için Üst konularda ki GenerateSearchSQLScript yardımıyla, sorgunu oluşturabilirsin...
Sorgunun hızlı çalışması için tüm alanları indexlemende fayda olacaktır...
Ayrıca kendine bir algoritma kurup edite yazılırken kelimeleri tamamlayabilirsen ( google gibi ) hem sorgunu hem de kullanıcını hızlandırabilirsin diye düşünüyorum
Re: Aynı anda birden çok alanda arama
Benim yazdığımı denemediniz sanırım, deneseydiniz sorununuzun çözülmüş olduğunu görecektiniz.
Re: Aynı anda birden çok alanda arama
Aslında sql tarafında denedim. Ama Delphi tarafında beceremedim açıkcası. delphi tarafı için biraz açıklama mümkün mü?thelvaci yazdı:Benim yazdığımı denemediniz sanırım, deneseydiniz sorununuzun çözülmüş olduğunu görecektiniz.
Erbab-ı kemâli çekemez nakıs olan, rencide olur Dide-i Huffaş ziyadan....