Select ile ilgili tuhaf bir sorun...

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Select ile ilgili tuhaf bir sorun...

Mesaj gönderen comlekciler »

Selam arkadaşlar,

Bir programda select ile bir arama yapmak istedim. Notları tutan tek tablolu bir veri tabanından arama yapmak istiyorum. Arama kriterlerinide iki tane RadioGrup bileşenlerinden belirleyerek yapıyorum.

Yazdığım kod aşağıdaki şekilde;

Kod: Tümünü seç

 dm.dstNotlar.Close;
 dm.dstNotlar.SelectSQL.Strings[1]:='';
 dm.dstNotlar.SelectSQL.Strings[2]:='';
 dm.dstNotlar.SelectSQL.Strings[3]:='';
 dm.dstNotlar.SelectSQL.Strings[4]:='';


//Arama Kriterini belirleyen RadioGrup1 Bileşeni

 if RadioGroup1.ItemIndex=0 then
 begin
  dm.dstNotlar.SelectSQL.Strings[1]:='and NOT_UYARI_GIRIS_TARIHI=:giristarihi';
  dm.dstNotlar.ParamByName('giristarihi').AsDate:= StrToDate(Edit1.Text);
 end
 else
 begin
  if RadioGroup1.ItemIndex=1 then
  begin
   dm.dstNotlar.SelectSQL.Strings[1]:='and NOT_UYARI_TARIHI=  :uyaritarihi';
   dm.dstNotlar.ParamByName('uyaritarihi').AsDate:= StrToDate(Edit1.Text);
  end
  else
  begin
   dm.dstNotlar.SelectSQL.Strings[1]:='and NOT_ACIKLAMA like :acklm';
   dm.dstNotlar.ParamByName('acklm').AsString:=Edit1.Text+'%';
  end;
 end;

//Sıralama Kriterini belirleyen RadioGrup2 bileşeni

 if RadioGroup2.ItemIndex=0 then
 begin
  dm.dstNotlar.SelectSQL.Strings[3]:='order by NOT_UYARI_TARIHI';
  dm.dstNotlar.SelectSQL.Strings[4]:='desc';
 end
 else
 begin
  dm.dstNotlar.SelectSQL.Strings[3]:='order by NOT_ACIKLAMA';
  dm.dstNotlar.SelectSQL.Strings[4]:='desc';
 end;

 dm.dstNotlar.Open;
Burada FireBird kullanıyorum ve IBDataset Bileşenin EditSQL özelliği içerisinde 5 satırlık boşluklar mevcut.

Sorunum eğer Sıralamayı belirleyen RadioGrup2 bileşenin olduğu IF li kısmı çıkartırsam arama yapıyor. Eğer bu satırı devreye alırsam hiç sonuç gelmiyor. Bu tuhaf sorun ne olduğunu bir türlü anlamadım. Komutları adım adım inceledim her yer çalışıyor ama sıralama rutini devrede olursa sonuç gelmiyor.

Yardımlarınızı bekliyorum teşekkürler.
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
bir memoya oluşan sql i atıp, tam oluşan sql görürseniz. sanırım sorunu da görebilirsiniz.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Mesaj gönderen comlekciler »

a.s.

Dediğiniz gibi yaptım ama herşey istediğimi gibi oluşuyor. Memo da oluşan SQL

Kod: Tümünü seç

select * from TBL_NOTLAR where 1=1
and NOT_ACIKLAMA like :acklm

order by NOT_UYARI_TARIHI
desc
şeklinde oluşuyor. Arada ki boşluğu ben oluşmasını istiyorum. Yani IBDataset in EditSQL içerisinde ben 5 satır oluşturdum ve her bir kodun bu satırlara uygun şekilde gelmesini sağlıyorum ve programda istediğim gibi bu satırlara SQL kodunu getiriyor. Acaba bu şekilde oluşturulan SQL cümlesinde bir sorun çıkar mı? Dediğim gibi "order by" ifadesini sağlayan IF bloğunu çıkartırsam program çalışıyor.

Ayrıca IF bloğunu çıkarttım ve IBDataset in içine program aşamasında iken EditSQL içerisine "order by NOT_UYARI_TARIHI desc" eklediğim zaman program yine çalışıyor. Ama IF bloğu ile order by eklersem çalışmıyor. Kesin bir yerde mantık hatası yapıyorum ama nerde bilmiyorum.
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Mesaj gönderen comlekciler »

Ben IBDataSet kullanıyordum. Daha sonra aynı kodları IBQuery ile denedim IBQuery ile çalışıyor. Acaba IBDataSet te bilmediğim bir ayar falan mı gerekiyor...?
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Birincisi

Kod: Tümünü seç

...
dm.dstNotlar.SelectSQL.Strings[1]:=''; 
...
yerine

Kod: Tümünü seç

...
dm.dstNotlar.SelectSQL.Clear; 
...
kullanın.
İkincisi en sonunda açmadan (dm.dstNotlar.Open;) önce

Kod: Tümünü seç

showmessage(dm.dstNotlar.SelectSQL.Text);
ile son durumu inceleyin :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Mesaj gönderen comlekciler »

Merhaba,

Dediğiniz gibi dm.dstNotlar.SelectSQL.Clear yaparsam daha sonra

Kod: Tümünü seç

dm.dstNotlar.SelectSQL.Strings[1]:='and NOT_ACIKLAMA like :acklm';
gibi bir satır eklediğim zaman IBDataset içersinde öyle bir satır yok diye hata veriyor. Yani benim programlama sırasında IBDataSetin SelectSQL içerisine ENTER ile oluşturduğum satırları Clear komutu yok ediyor o yüzden ben de dm.dstNotlar.SelectSQL.Strings[1]:=''; şeklinde yapmak zorunda kaldım.

Ayrıca dediğiniz gibi Select içerisindeki son durumu yukarıda da anlattığım gibi gördüm herşey düzgün olarak oluşuyor. Dediğim gibi IBQuery ile yaparsam çalışıyor ama IBDataset ile olmuyor bilmediğim bir şey mi var acaba...
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

sorun parametre gönderiminden kaynaklı olabilir. daha önce aynı hatayla ben de karşılaşmıştım. IBQuery de hata almaz iken IBDataset te parametre hatası almıştım. sorun IBDataset in parametre olayından kaynaklı olduğu kanaatindeyim.
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.

Mevlana

OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Mesaj gönderen comlekciler »

kadirkurtoglu yazdı:sorun parametre gönderiminden kaynaklı olabilir. daha önce aynı hatayla ben de karşılaşmıştım. IBQuery de hata almaz iken IBDataset te parametre hatası almıştım. sorun IBDataset in parametre olayından kaynaklı olduğu kanaatindeyim.
iyi ama "order by" ile ne alakası olabilir ki? order by ile ilgili kısmı çıkarınca buluyor sanırım parametre ile ilgili değil çünkü o zaman hep bulamaması gerekirdi. Ayrıca VT nındaki alanların karakter yapılarının aynı şeklinde parametreleri gönderiyorum aksi takdirde zaten hata veriyor.
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

comlekciler yazdı:Merhaba,

Dediğiniz gibi dm.dstNotlar.SelectSQL.Clear yaparsam daha sonra

Kod: Tümünü seç

dm.dstNotlar.SelectSQL.Strings[1]:='and NOT_ACIKLAMA like :acklm';
gibi bir satır eklediğim zaman IBDataset içersinde öyle bir satır yok diye hata veriyor. Yani benim programlama sırasında IBDataSetin SelectSQL içerisine ENTER ile oluşturduğum satırları Clear komutu yok ediyor o yüzden ben de dm.dstNotlar.SelectSQL.Strings[1]:=''; şeklinde yapmak zorunda kaldım.sam çalışıyor ama IBDataset ile olmuyor bilmediğim bir şey mi var acaba...

Kod: Tümünü seç

dm.dstNotlar.SelectSQL.Add('select ....');
şeklinde daha uygun :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Mesaj gönderen comlekciler »

rsimsek yazdı:

Kod: Tümünü seç

dm.dstNotlar.SelectSQL.Add('select ....');
dediğiniz şekilde de yaptım ama malesef olmadı. Tekrar sıralama satırlarını çıkarttım çalıştı.

Ayrıca direk programlama sırasında SelectSQL in içerisine,

Kod: Tümünü seç

select * from TBL_NOTLAR where 1=1 
and NOT_ACIKLAMA like :acklm 

order by NOT_UYARI_TARIHI 
desc 
yazdım ve programdan da BUL butonunun içerisine

Kod: Tümünü seç

dm.dstNotlar.Close;
dm.dstNotlar.ParamByName('acklm').AsString:=Edit1.Text+'%';
dm.dstNotlar.Open;
şeklinde yazdım ve buldu. Ve sıralama işleminide yapıyor. Ama program içerisinden tek tek komutları select içerisine yazarsam bulmuyor sıralamayı çıkartırsam buluyor. Veya sıralama ile igili IF bloğu dururda diğer arama kriterlerini gösteren IF bloğunu kaldırırsamda işlem yapıyor yani bulma değil sıralama işlemini yapıyor. İkisi birlikte neden çalışmıyor anlamadım. Kafayı yemek üzereyim. :cry:
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Kullanıcı avatarı
MakPRO
Üye
Mesajlar: 251
Kayıt: 31 Eki 2003 05:21
Konum: Antalya
İletişim:

Mesaj gönderen MakPRO »

rmsisek hocam gerekli açıklamayı yapmış aslında dediği gibi yaparsanız sorun olmaz
dm.dstNotlar.Close;
dm.dstNotlar.ParamByName('acklm').AsString:=Edit1.Text+'%';
dm.dstNotlar.Open;
burada ParamByName SQL cümlesi içindeki parametreler için kullanılır örneğin

Kod: Tümünü seç

    
       AdresTable.SQL.Clear;
       AdresTable.SQL.Add('select * from Address Where UserName =:UserName');
       AdresTable.ParamByName('UserName').AsString := 'MakPRO';
       AdresTable.Open;
      
bu şekilde kullanman gerekli Kolay gelsin
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Halen sorun varsa kodun son şeklini gönderirsen tekrar inceleyelim.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Mesaj gönderen comlekciler »

Selam @rsimsek hocam;

Malesef sorun devam ediyor ama ilginiz için çok teşekkürler. Ben de IBQuery'e geçtim sorun düzeldi. Kodlarda hiçbir değişiklik yok ama IBDataSet'te çalışmıyor. Kodları tekrar veriyorum;

Kod: Tümünü seç

dm.dstNotlar.Close;
 dm.dstNotlar.SelectSQL.Strings[1]:='';
 dm.dstNotlar.SelectSQL.Strings[2]:='';
 dm.dstNotlar.SelectSQL.Strings[3]:='';
 dm.dstNotlar.SelectSQL.Strings[4]:='';


 if RadioGroup1.ItemIndex=0 then
 begin
  dm.dstNotlar.SelectSQL.Strings[1]:='and NOT_UYARI_GIRIS_TARIHI=:giristarihi';
  dm.dstNotlar.ParamByName('giristarihi').AsDate:= StrToDate(Edit1.Text);
 end
 else
 begin
  if RadioGroup1.ItemIndex=1 then
  begin
   dm.dstNotlar.SelectSQL.Strings[1]:='and NOT_UYARI_TARIHI containing :uyaritarihi';
   dm.dstNotlar.ParamByName('uyaritarihi').AsDate:= StrToDate(Edit1.Text);
  end
  else
  begin
   dm.dstNotlar.SelectSQL.Strings[1]:='and NOT_ACIKLAMA like :acklm';
   dm.dstNotlar.ParamByName('acklm').AsString:=Edit1.Text+'%';
  end;
 end;

 if RadioGroup2.ItemIndex=0 then
 begin
  dm.dstNotlar.SelectSQL.Strings[3]:='order by NOT_UYARI_TARIHI';
  dm.dstNotlar.SelectSQL.Strings[4]:='desc';
 end
 else
 begin
  dm.dstNotlar.SelectSQL.Strings[3]:='order by NOT_ACIKLAMA';
  dm.dstNotlar.SelectSQL.Strings[4]:='asc';
 end;

 showmessage(dm.dstNotlar.SelectSQL.Text);

 dm.dstNotlar.Open;
Bu kodlar dediğim gibi IBQuery'de çalışıyor ama

aşağıdaki kodları;

Kod: Tümünü seç

 if RadioGroup2.ItemIndex=0 then
 begin
  dm.dstNotlar.SelectSQL.Strings[3]:='order by NOT_UYARI_TARIHI';
  dm.dstNotlar.SelectSQL.Strings[4]:='desc';
 end
 else
 begin
  dm.dstNotlar.SelectSQL.Strings[3]:='order by NOT_ACIKLAMA';
  dm.dstNotlar.SelectSQL.Strings[4]:='asc';
 end;
iptal edersem IBDataset'te çalışıyor. Hala anlamadım.

Eğer bu kodları program içerisne değil direk IBDataSet içerisine programa sırasında

Kod: Tümünü seç

select * from TBL_NOTLAR where 1=1 
and NOT_ACIKLAMA like :acklm 

order by NOT_UYARI_TARIHI 
desc


şeklinde yazarsam yine çalışıyor ve

Kod: Tümünü seç

Showmessage(dm.dstNotlar.SelectSQL.Text); 
şeklinde baktığımda da herşey gayet normal görünüyor.

Aklıma bir şey daha geliyor acaba IBX bileşenlerini güncellemem mi gerekir diye düşünüyorum. :roll:
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Kesinlikle güncellemek gerekir fakat yine de order by ve desc ibarelerini büyük harflerle ve atamalarda tırnak öncesi ve son tırnaktan sonra boşluk vererek denemeni tavsiye ederim :wink:

Kod: Tümünü seç

...
if RadioGroup2.ItemIndex=0 then
 begin
  dm.dstNotlar.SelectSQL.Strings[3]:=' ORDER BY NOT_UYARI_TARIHI ';
  dm.dstNotlar.SelectSQL.Strings[4]:=' DESC ';
 end 
 else
... 
Hatta DESC kısmını ORDER BY ... satırının sonuna alabilirsin :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Mesaj gönderen comlekciler »

selam @rsimsek hocam,

İlgin için gerçekten teşekkürler ama maalesef bunlarda olmadı. Bİr ihtimalde IBX bileşenlerini güncellemek kaldı. Ama nasıl güncelleyeceğimi bilmiyorum. Bu konuda da yardım edebilirseniz sevinirim.
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Cevapla