Aynı anda birden çok alanda arama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
hbulus
Üye
Mesajlar: 163
Kayıt: 14 Tem 2003 11:30
İletişim:

Aynı anda birden çok alanda arama

Mesaj gönderen hbulus »

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?
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....
tayipk
Üye
Mesajlar: 284
Kayıt: 27 Kas 2013 11:32

Re: sql Server cümleyi parçalayarak arama

Mesaj gönderen tayipk »

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?
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.
Soru Sorarken yazmaya Üşenmeyen Parmaklar Sorunun Çözüldükten Sonra Teşekkür etmeye de Üşenmesin.
hbulus
Üye
Mesajlar: 163
Kayıt: 14 Tem 2003 11:30
İletişim:

Re: sql Server cümleyi parçalayarak arama

Mesaj gönderen hbulus »

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.
Erbab-ı kemâli çekemez nakıs olan, rencide olur Dide-i Huffaş ziyadan....
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: sql Server cümleyi parçalayarak arama

Mesaj gönderen cengaver »

Eğer SQL Server kullanıyorsan aşağıdaki kalıba benzer bir şey yapabilirsin;

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
Bunu eğer Delphi içinden üreterek parametrik olarak kullanmak istiyorsan da aşağıdaki gibi bir şey kullanabilirsin;

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;
Şu şekilde de SQL cümlesini inceleyebilirsin;

Kod: Tümünü seç

  ShowMessage( GenerateSearchSQLScript('murtaza', 'dbo.Cariler', 'CariKart', '[Hesap No]', 'Adres', 'Telefon', 'OzelKod1') );
fonksiyonun alanlarla ilgili kısmını (yani aAlan1..aAlan5'i) dinamik dizi şeklinde parametrik de yapabilirsin (o kısmını da sen keşfet :)
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: sql Server cümleyi parçalayarak arama

Mesaj gönderen cengaver »

:) Ya aslında bana iyi bir fikir vermiş oldun, gece üşenmedim erinmedim bu fonksiyonu biraz geliştireyim dedim;

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;
Şu şekilde kullandığımızda aşağıdaki SQL cümlesini elde etmiş oluyoruz.

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%') 
hbulus
Üye
Mesajlar: 163
Kayıt: 14 Tem 2003 11:30
İletişim:

Re: sql Server cümleyi parçalayarak arama

Mesaj gönderen hbulus »

İlginize teşkkür ederim. Sizin örneği denedim. Sadece bir değeri alanlarda arıyor.
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.
demiştim.
Ö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 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....
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: sql Server cümleyi parçalayarak arama

Mesaj gönderen cengaver »

SQL cümlesinin WHERE kısmına kendinize özgü eklemeler yaparsanız probleminiz çözülür.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: sql Server cümleyi parçalayarak arama

Mesaj gönderen thelvaci »

Elinizde SQL Server gibi bir araç varken stored procedure kullanmamak, kendinize eziyet etmek anlamına gelir. Aşağıdaki gibi bir yapı kullanabilirsiniz;

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')) + '%'
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.
Kullanıcı avatarı
ender_arslanturk
Kıdemli Üye
Mesajlar: 709
Kayıt: 18 Şub 2005 03:38
Konum: İstanbul

Re: sql Server cümleyi parçalayarak arama

Mesaj gönderen ender_arslanturk »

Selâmlar,

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+'*')
contains komutu sizin yerinize kelimeleri parçalar. ve arama kriterini "kelimelerden biri" olarak hazırlar.

İyi çalışmalar,
hbulus
Üye
Mesajlar: 163
Kayıt: 14 Tem 2003 11:30
İletişim:

Re: Aynı anda birden çok alanda arama

Mesaj gönderen hbulus »

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.
Erbab-ı kemâli çekemez nakıs olan, rencide olur Dide-i Huffaş ziyadan....
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Re: Aynı anda birden çok alanda arama

Mesaj gönderen yusuf simsek »

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
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Aynı anda birden çok alanda arama

Mesaj gönderen thelvaci »

Benim yazdığımı denemediniz sanırım, deneseydiniz sorununuzun çözülmüş olduğunu görecektiniz.
hbulus
Üye
Mesajlar: 163
Kayıt: 14 Tem 2003 11:30
İletişim:

Re: Aynı anda birden çok alanda arama

Mesaj gönderen hbulus »

thelvaci yazdı:Benim yazdığımı denemediniz sanırım, deneseydiniz sorununuzun çözülmüş olduğunu görecektiniz.
Aslında sql tarafında denedim. Ama Delphi tarafında beceremedim açıkcası. delphi tarafı için biraz açıklama mümkün mü?
Erbab-ı kemâli çekemez nakıs olan, rencide olur Dide-i Huffaş ziyadan....
Cevapla