SQL

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

SQL

Mesaj gönderen loxka »

Kod: Tümünü seç

--------------------------- 
procedure TForm3.Edit1Change(Sender: TObject); 
begin 
SorguYap('Edit', 1, 4); 
end; 
------------------ 

Procedure TForm3.SorguYap(EditPrefix: String; EditBas, EditSon : Integer); 
Var 
  Sayac       : Integer; 
  Yazi        : String; 
  WhereSatiri : Integer; 
begin 
  // Dinamiktir Edit sayısı artsa da fonksiyon sabittir. Parametre girişi değişecektir. 
  Query1.Active := False; 
  Query1.SQL.Clear; 
  Query1.SQL.Add('Select * from giris'); 

  For Sayac := EditBas to EditSon do 
  begin 
    Yazi := Trim( TEdit( FindComponent( Format('%s%d', [EditPrefix, Sayac]) ) ).Text ); 
    If Yazi <> '' then 
    begin 
       If Pos('Where', Query1.SQL.Text) <= 0 then 
       begin // Sadece bir kere bu şarta düşecektir. Çünkü şimdi Where koyucaz. 
         Query1.SQL.Add('Where'); 
         WhereSatiri := Query1.SQL.Count; 
       end; 

       If Query1.SQL.Count > WhereSatiri // OR Koyalım mı Koymayalım mı ? 
       then Query1.SQL.Add(' OR  (LOWER(Oda) Like LOWER("%'+Yazi+'%" ))') 
       else Query1.SQL.Add('   (LOWER(Oda) Like LOWER("%'+Yazi+'%" ))'); 

       If Query1.SQL.Count > WhereSatiri // OR Koyalım mı Koymayalım mı ? 
       then Query1.SQL.Add(' or (LOWER(AdiSoyadi) Like LOWER("%'+Yazi+'%" ))') 
       else Query1.SQL.Add('    (LOWER(AdiSoyadi) Like LOWER("%'+Yazi+'%" ))'); 

       If Query1.SQL.Count > WhereSatiri // OR Koyalım mı Koymayalım mı ? 
       then Query1.SQL.Add(' or (LOWER(Bölüm) Like LOWER("%'+Yazi+'%" ))') 
       else Query1.SQL.Add('    (LOWER(Bölüm) Like LOWER("%'+Yazi+'%" ))'); 

       If Query1.SQL.Count > WhereSatiri // OR Koyalım mı Koymayalım mı ? 
       then Query1.SQL.Add(' or (LOWER(AmeliyatAdi) Like LOWER("%'+Yazi+'%" ))') 
       else Query1.SQL.Add('    (LOWER(AmeliyatAdi) Like LOWER("%'+Yazi+'%" ))'); 

    end; 
  end; 
  Query1.Active := True; 


end; 
Kod çalışıyor. Bununla ilgili bir sorun yok, fakat istediğim bu değildi..
Ben azalan ve birbirini eleyen bir arama tekniği düşünüyordum. Yani Oda no 3 olan Altı kişi arasından Bölümü ortopedi olan (kalan 3 kayıt) ve AdiSoyadı Mehmet ... olan (kalan 2 kayıt) ve AmeliyatAdi Skolyoz olanları bulsun (kalan1 kayıt). Yani azalan bir arama,
Bu döngüde ise hangi edite farklı bir alan yazsasında buluyor. Benim isteğim adı soyadı editinde (EDit2) arama yapılsın . oraya odaYı da yazınca getiriyor haliyle Sürekli artan bir arama geliyor karşımıza...
Yardımınızı bekliyorum. Teşekkürler
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

aralarda or degil AND olmasi gerekiyor. Kodda baska bir problem var mi bilemiyorum o kadar detayli incelemedim ama OR kullanımı bahsettiginiz istenmeyen sonucu dogal olarak olusturur....
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

Mesaj gönderen loxka »

hocam AND de de aynı sorunu yaşamaktayım. Daha doğrusu AND de arama yapamıyor.
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

Mesaj gönderen loxka »

Kod: Tümünü seç

--------------------------- 
procedure TForm3.Edit1Change(Sender: TObject); 
begin 
SorguYap('Edit', 1, 4); 
end; 
------------------ 

Procedure TForm3.SorguYap(EditPrefix: String; EditBas, EditSon : Integer); 
Var 
  Sayac       : Integer; 
  Yazi        : String; 
  WhereSatiri : Integer; 
begin 
  // Dinamiktir Edit sayısı artsa da fonksiyon sabittir. Parametre girişi değişecektir. 
  Query1.Active := False; 
  Query1.SQL.Clear; 
  Query1.SQL.Add('Select * from giris'); 

  For Sayac := EditBas to EditSon do 
  begin 
    Yazi := Trim( TEdit( FindComponent( Format('%s%d', [EditPrefix, Sayac]) ) ).Text ); 
    If Yazi <> '' then 
    begin 
       If Pos('Where', Query1.SQL.Text) <= 0 then 
       begin // Sadece bir kere bu şarta düşecektir. Çünkü şimdi Where koyucaz. 
         Query1.SQL.Add('Where'); 
         WhereSatiri := Query1.SQL.Count; 
       end; 

       If Query1.SQL.Count > WhereSatiri //        
then Query1.SQL.Add(' AND (LOWER(Oda) Like LOWER("%'+Yazi+'%" ))') 
       else Query1.SQL.Add('   (LOWER(Oda) Like LOWER("%'+Yazi+'%" ))'); 

       If Query1.SQL.Count > WhereSatiri // 
       then Query1.SQL.Add(' AND (LOWER(AdiSoyadi) Like LOWER("%'+Yazi+'%" ))') 
       else Query1.SQL.Add('    (LOWER(AdiSoyadi) Like LOWER("%'+Yazi+'%" ))'); 

       If Query1.SQL.Count > WhereSatiri //
       then Query1.SQL.Add(' AND (LOWER(Bölüm) Like LOWER("%'+Yazi+'%" ))') 
       else Query1.SQL.Add('    (LOWER(Bölüm) Like LOWER("%'+Yazi+'%" ))'); 

       If Query1.SQL.Count > WhereSatiri // 
      then Query1.SQL.Add(' AND (LOWER(AmeliyatAdi) Like LOWER("%'+Yazi+'%" ))') 
       else Query1.SQL.Add('    (LOWER(AmeliyatAdi) Like LOWER("%'+Yazi+'%" ))'); 

    end; 
  end; 
  Query1.Active := True; 


end; 
Or yerine AND koydum bu seferde editlere kriter yazdığımda grid alanı birden bomboş oluyor ve aramıyor.
Birde SQL cümlesi nasıl olmalıdır ben normal bir SQL cümles yazdım select * from giris gibi [/quote]
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

oncelikle sunu tavsiye ederim... Henuz SQL cumlesi tam net degilken bunu Delphi lie runtime da olusturmaya calismak en uzman delphi programcısı icin bile potansiyel bir riskdir. Yuksek ihtimaldir ki hata yapar. En azindan ben yapiyorum. Ve cozmek daha zor oluyor cunku hata runtime da oluyor ya da hata olmuyor sonuc vermiyor sorunu bulma kve alternatifleri denemek zor oluyor....

Bu yuzden SQL cumlenizi oncelikle SQL explorer, IBConsole veya kullandiginiz database in ilgili SQL kod calistiran arabirimi uzerinde denemelisiniz. Orada sonuc gelmediginde hemen aninda farkli denemeler yaparak where icindeki kriterlerin gerekirse tamamini cikartip teker teker ekleyerek neden veri gelmiyor buna ney sebep oluyor kolayca gorebilirsiniz. Belki girdiginiz veriler ile aradiginiz veriler birbirini tutmadigi icin dogal olarak veri gelmiyordur. Yani AND kullanmak sizin ihtiyaciniz icin gerekli yontemdir ama belki siz ALİ aratiyorsunuz oysa veritabanında Ali vardir gibi bir takim sorunlar olabilir. Butun bunları en kolay tespit etmenin tek yolu bu tur bir arayuzden SQL cumlesini test etmek ve cumle uzerinde calismak. SQL cumlesi calisir pozisyona geldiginde artik olayi delphi tarafian tasiyabilirsiniz ve sundan artik emin olursunuz ki oalsi problemler delphi kodlarindan kaynaklanmakta sql cumlesinde sorun yok. Boylece sorunu LOKALIZE etmis olursunuz ki bu problem cozmede cok onemli bir teknik ve hatta zaruriyettir...

Kolay gelsin....
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

Mesaj gönderen loxka »

Düşüncede bu iş kolayda neden uygulamada zor anlamıyorum..
sql de birden fazla alanda birbirini eleyerek arama yapmak bukadar zor olmasa gerek. 3 e kadar iyide bu alan sayısı 6 ya 7 e çıkınca neden problem çıkıyor. deli olmamak içten değil..
İnanırmısınız sabahtan beri sadece bu iş üzerinde uğraşıyorum ve bunu anlamıyorum of off
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam.
- Biraz vaktim var, ilk yazdığın koda detaylıca bir baktım ve gördüklerimi bildireyim.

- Bu kod önce yönelttiğiniz sorudan farklı şekilde kurgulanarak hatalı hale dönüşmüş. Daha önce sorulan soruya yönelik, edit sayısı kadar Tek Bir Alan sorgusu yapılıyordu ve OR kullanılması gerekliydi ve kullanılarak sorgu genelleştirldi. Şimdiki sorunuzda AND kullanılacak ve sorgu özelleşecek.

- Yani önceki fonksiyon çerçevesinde yazdığınız Oda, AdiSoyadi, Bölüm, AmeliyatAdi alanlarından sadece bir tekini sorgulama hakkınız vardı. ( Oda = 203 veya Oda = 206 veya Oda = 303 gibi olacaktı.) Çünkü daha önce yazdığınız örnek hep bir oda değişkeni üzerindendi ve ona göre değerlendirilip kod yazıldı.

- Delphi kurulu bir bilgisayar yakınımda olmadığından deneme şansım yok. Özel mesaj atmıştınız bunu da foruma yönlendirme gereği duydum.

- Buradaki yeni durum göz önüne alındığında şöyle bir yapı olmalı.
Ben azalan ve birbirini eleyen bir arama tekniği düşünüyordum.
-Yani Oda no 3 olan Altı kişi arasından
-Bölümü ortopedi olan (kalan 3 kayıt) ve
-AdiSoyadı Mehmet ... olan (kalan 2 kayıt) ve
-AmeliyatAdi Skolyoz olanları bulsun (kalan1 kayıt).
Yani azalan bir arama,
demişsiniz.

- Boş olanlar sorgulanmasın, dolu olanlar sorgulansın şeklinde tasarlıyorum.

- Burada Editler ve Veritabanı Alan adları şöyle olsun.
Edit1 = Oda
Edit2 = Bolum
Edit3 = AdiSoyadi
Edit4 = AmeliyatAdi

- Procedure tanımında şöyle kullanıcam.
Oda = Oda,
Bolum = Bolum
AdSoyad = AdiSoyadi
Ameliyat = AmeliyatAdi

Kod: Tümünü seç

Procedure SorguHazirla( Oda, Bolum, AdSoyad, Ameliyat : String);
Var 
  Sayac       : Integer; 
  Yazi        : String; 
begin
  Oda      := Trim(Oda); // Kendimizi garantilemek için sağdaki ve
  Bolum    := Trim(Bolum); // soladaki boşlukları veya
  AdSoyad  := Trim(AdSoyad); // sadece boşluk girilmiş olanları
  Ameliyat := Trim(Ameliyat); // boşalttık.
  Query1.Active := False; 
  Query1.SQL.Clear; 
  Query1.SQL.Add('Select * from giris');
  Query1.SQL.Add('Where');       // buraya kadar standart

  If Oda <> '' then 
  begin // İlk değişken olduğundan boş değilse korkmadan koyuyoruz.
    Query1.SQL.Add( '   (LOWER(Oda) Like LOWER("%'+Oda+'%" ))' );
  end;

  If Bolum <> '' then 
  begin // Daha önce Oda boş değilse AND, yoksa AND'siz koyucaz.
    If Oda <> '' then Query1.SQL.Add( 'AND (LOWER(Bolum) Like LOWER("%'+Bolum+'%" ))' )
                 else Query1.SQL.Add( '    (LOWER(Bolum) Like LOWER("%'+Bolum+'%" ))' );
  end;

  If AdSoyad <> '' then 
  begin // Daha önce Oda ve Bolum boş değilse AND, yoksa AND'siz koyucaz.
    If (Oda <> '') AND (Bolum <> '') 
                 then Query1.SQL.Add( 'AND (LOWER(AdiSoyadi) Like LOWER("%'+AdSoyad+'%" ))' )
                 else Query1.SQL.Add( '    (LOWER(AdiSoyadi) Like LOWER("%'+AdSoyad+'%" ))' );
  end;

  If Ameliyat <> '' then 
  begin // Daha önce Oda, Bolum ve AdSoyad boş değilse AND, yoksa AND'siz koyucaz.
    If (Oda <> '') AND (Bolum <> '') AND (AdSoyad <> '')
                 then Query1.SQL.Add( 'AND (LOWER(AmeliyatAdi) Like LOWER("%'+Ameliyat +'%" ))' )
                 else Query1.SQL.Add( '    (LOWER(AmeliyatAdi) Like LOWER("%'+Ameliyat +'%" ))' );
  end;

  Query1.Active := True; 
end;
- Daha fazla alanın varsa bu şekilde uzar gider. Dikkat edilecek tek şey daha önce Where kelimesi konup konmadığının tespitidir. Gerisinde AND koyuyorsun zaten.

- Procedure'ü kullanımın ise gördüğün gibi basit. Programın herhangi bir yerinde;

Kod: Tümünü seç

  SorguHazirla(Edit1.Text, Edit2.Text, Edit3.Text, Edit4.Text);/code]
veya
[code]  SorguHazirla('3', 'ortopedi', 'Mehmet', 'Skolyoz');/code]
şeklinde ...

- Çok dikkatli yazmaya çalıştım, umarım noktalama işareti veya başka hata falan yapmamışımdır. Lütfen delphi'si olan birisi deneyip kontrol etsin.
Resim
Resim ....Resim
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

yeri gelmisken ben butur sorgularda kullandıgım bir yoldan bahsedeyim
muharrem beyin anlattıgı sekilde bir onceki editi kontrol ederek sql cumlesi olusturmak parametre sayısı arttıkca zorlasacaktır
bir alternatif yol ise sorgulamada where kısmında kullanılmayan bir alan ele alınarak yapılır.
mesela id isimli integer bir alanınız var
sql cumle olusturma mantıgı:

Kod: Tümünü seç

sql:='select * from where (id=id) and ';

if edit1.text<>'' then 
  sql:=sql+'(field1='+edit1.text+') and ';
if edit2.text<>'' then 
  sql:=sql+'(field2='+edit2.text+') and ';
if edit3.text<>'' then 
  sql:=sql+'(field3='+edit3.text+') and ';
seklinde devam eder.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7588
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

ben de Where ifadesini mutlaka eklemek için ufak bir ipucu ekleyim.

....
WHERE (1=1)
....// burdan itibaren AND,OR ile yeni satırları ekleyin.

Kolay gelsin.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

ewt hocam bu sekilde olur bir alan olması sart degil yani:)
ayrıca ozel mesaj ile istekte bulunmayalım lutfen :evil:
ÜŞENME,ERTELEME,VAZGEÇME
Cevapla