SQL Sorgulama !

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

SQL Sorgulama !

Mesaj gönderen ozcank »

Arkadaşlar şu koda bakarmısınız neden sorgulama yapmıyor bryerde hata mı yağıyorum DBGrid1 i boş gösteriyor.

Kod: Tümünü seç

procedure TForm33.Button1Click(Sender: TObject);
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM SISTEMFOR WHERE');
If (Edit1.Text<>'') or (Edit2.Text<>'') Then
Query1.SQL.Add('STOPREF=:STOPREF And');
Query1.SQL.Add('SISILCE=:SISILCE And');
Query1.SQL.Add('SISTAR>=:ITAR1 And');
Query1.SQL.Add('SISTAR<=:STAR1');
If (Edit1.Text<>'') or (Edit2.Text<>'') Then
Query1.ParamByName('STOPREF').AsFloat:=StrToFloat(Edit1.Text);
Query1.ParamByName('SISILCE').AsString:=Edit2.Text;
Query1.ParamByName('ITAR1').AsDateTime:=DateTimePicker1.DateTime;
Query1.ParamByName('STAR1').AsDateTime:=DateTimePicker2.DateTime;
Query1.Prepare;
Query1.Open;

end;

Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

merhaba,

ustam aradaki if leri anlayamadım acemiliğime verin öğrenme niyetiyle soruyorum. ayrıca insan yoğunlaşınca bazı küçük ayrıntıları kaçırıyor ve aklına gelmiyor. grid ilgili datasource ye bağlımı acaba,

kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

bağlı ve o ifleri de kaldırdım yine yok .
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

BU şekilde değiştirdim fakat tarihi mesela 01.11.2005 , 01.11.2005 tarihlerini almak istiyorum listelemiyor ama 01.01.2005 , 01.12.2005 yaptığım zaman istediğim tarihi alabiliyorum yardım edermisiniz?

Kod: Tümünü seç

procedure TForm33.Button1Click(Sender: TObject);
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM SISTEMFOR where ');
If (Edit1.Text<>'') or (Edit2.Text<>'') Then
Query1.SQL.Add('STOPREF=:STOPREF And');
Query1.SQL.Add('SISILCE=:SISILCE And');
Query1.SQL.Add('SISTAR BETWEEN :ITAR1 And :STAR1');
If (Edit1.Text<>'') or (Edit2.Text<>'') Then
Query1.ParamByName('STOPREF').AsFloat:=StrToFloat(Edit1.Text);
Query1.ParamByName('SISILCE').AsString:=Edit2.Text;
Query1.ParamByName('ITAR1').AsDateTime:=DateTimePicker1.DateTime;
Query1.ParamByName('STAR1').AsDateTime:=DateTimePicker2.DateTime;
Query1.Prepare;
Query1.Open;
end;
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Merhaba,

@ozcank ustam sizin yazdığınızdan şunu anlıyorum. İki tarih arasında editlere girilecek iki ayrı kriterlerin sorgulama sonucunu almak istiyorsunuz. sizdeki float alanı içeren elimde çalışma yok. elimde olan ile yaptığım aşağıda vereceğim sorgulama ile ister bir ister üç ister senelik tarih aralığı girsende sonuç alabiliyorum.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  ITAR1, STAR1:TDATE;
  begin
    ibQuery1.Close;
    ibQuery1.SQL.Clear;
    ibQuery1.SQL.Add('SELECT * FROM RAPORLAR');
    ibQuery1.SQL.Add('Where INCTARIHI BETWEEN :ITAR1 And :STAR1 and ISTOLYTURU=:ISTOLYTURU AND IZ_DURUMU=:IZ_DURUMU');
    ibQuery1.ParamByName('ISTOLYTURU').AsString:=Edit1.Text;
    ibQuery1.ParamByName('IZ_DURUMU').AsString:=Edit2.Text;
    ibQuery1.ParamByName('ITAR1').AsDate:=DateTimePicker1.Date;
    ibQuery1.ParamByName('STAR1').AsDate:=DateTimePicker2.Date;
    ibQuery1.Prepare;
    ibQuery1.Open;
end;
eğer sizi doğru anladım ise birde böyle deneyin. editlerin boş geçilmesini istemiyorsanız sql komutları başlangıcına if ile kontrol koyabilirsiniz. ama yanlış anladım ise özür.

kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

Bu şekilde uyarladım ama yine tarihi 01.11.2005 ile 01.11.2005 arası alamıyorum 01.01.2005 ile 01.12.2005 tarihi aralığında istediğim kayıtları alabiliyorum bir de edit alanlarının boş geçilmemesi için nasıl yapabilirim?
yardımlarından ötürü teşekkür ederim.

Kod: Tümünü seç

procedure TForm33.Button1Click(Sender: TObject);
var
  ITAR1, STAR1:TDATE;
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM SISTEMFOR');
Query1.SQL.Add('Where SISTAR BETWEEN :ITAR1 And :STAR1 and STOPREF=:STOPREF AND SISILCE=:SISILCE');
Query1.ParamByName('STOPREF').AsFloat:=StrToFloat(Edit1.Text);
Query1.ParamByName('SISILCE').AsString:=Edit2.Text;
Query1.ParamByName('ITAR1').AsDateTime:=DateTimePicker1.DateTime;
Query1.ParamByName('STAR1').AsDateTime:=DateTimePicker2.DateTime;
Query1.Prepare;
Query1.Open;
end;

Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Gelinen son durumda veritabanında 01.11.2005 tarihine ait kayıt oldugu halde 01.11.2005 ile 01.11.2005 aralığı için veri gorunmuyorsa muhtemelen veritabanınızda ilgili alanlarin tipi timestamp tir. Mesela veritabanınızdaki verilerden biri '01.11.2005 10:39:00' şeklinde bir veri olabilir... Bizim kriter olarak gonderdiğimiz 01.11.2005 tarihinin timestamp karşılığı '01.11.2005 00:00:00' şeklindedir. Hal boyle olunca da sizin SQL in where kısmı şu hale geliyor..

Kod: Tümünü seç

...
Where SISTAR between '01.11.2005 00:00:00' and '01.11.2005 00:00:00'
....
Sistemdeki örnek SISTAR değerimizin ('01.11.2005 10:39:00') bu aralığa girmediği ve doğal olarak sonuç alamadığımızı kolayca anlıyoruz.

Peki çözüm nedir?
1. Parametrelerinizi timestamp verebilirsiniz arka planda başlangıç tarihinin sonuna saat olarak 00:00:00.000 ve bitiş tarihnin sonuna da 23:59:59.999 ekleyebilirsiniz.
2. Ya da uygulaması daha pratik olan yontemle SQL cumlenizde bir değişiklim yapıp SISTAR alanınızı date tipine cevirerek sorgulama yaparsınız.

Kod: Tümünü seç

...
Where cast(SISTAR as date) BETWEEN :ITAR1 And :STAR1
...
Kolay gelsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

Değişen birşey olmadı eklentileri yaptım ama.
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

merhaba,

editlerin boş geçmeme olayı daha önce defalarca konuşulduğunu hatırlıyorum bu konuyu forumda aratarak ulaşabilirsiniz veya ilk mesajınızda kullandığınız if satırının sonunda mesaj verdirebilir ve işlemi durudurabilirsiniz.

buruda vt nizi açıklığa kavuşturmak gerekiyor sanırım. vt olarak ne kullanıyorsunuz ve bu sorgu çektiğiniz alanlarınızın değeri ne. @Fahrettin ustam konuya değinmiş. büyük ihtimalle gözden kaçan küçük bir ayrıntı var.

kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Ozcan Bey,
yardimci olabilmemiz icin daha fazla detay vermeniz lazim....
ozcank yazdı:Değişen birşey olmadı eklentileri yaptım ama.
Bu cümle üzerine akla yeni hiç bir ihtimal gelmiyor...
Tam olarak ne yaptınız?
Ayrica siz etavsiyem oncelikle SQL cümlelerinizi veritabanı tarafında çalıştırmanız ve orada verilerin düzgün şekilde geldiğini gördükten sonra ilgili sql cümlesini Delphi içine taşımanızdır. Bu şekilde hem problemin Delphi veya DB tarafındna kaynaklanma durumları için kontrollü deney yapmış olursunuz. Hem de problemleri çok daha kolay bir şekilde lokalize etme şansınız olur... Aksi takdirde nereden kaynaklandığını bilemediğimiz bir problemi çözmek samanlıkta iğne aramak gibi bir şey.. Başarı şansınız çok düşer malesef....

Kolay gelsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

İşlemi değiştirdim SQL de TString de şunu yazdım;

Kod: Tümünü seç

SELECT * FROM SISTEMFOR
WHERE SISTAR BETWEEN :ITAR1 AND :STAR1 AND STOPREF=:STREF AND SISILCE=:SILCE
daha sonra Button1 de ;

Kod: Tümünü seç

procedure TForm33.Button1Click(Sender: TObject);
begin
Query1.Close;
Query1.SQL.Clear;
Query1.ParamByName('STREF').AsFloat:=StrToFloat(Edit1.Text);
Query1.ParamByName('SILCE').AsString:=Edit2.Text;
Query1.ParamByName('ITAR1').AsDate:=DateTimePicker1.Date;
Query1.ParamByName('STAR1').AsDate:=DateTimePicker2.Date;
Query1.Prepare;
Query1.Open;
end;
bu sefer burayı geçmiyor not found diyor bulunamadı ama anlamadım?
Params da Float olarak tanımlı.

Kod: Tümünü seç

Query1.ParamByName('STREF').AsFloat:=StrToFloat(Edit1.Text);
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

Arkadaşlar sorunu cözdüm;

Böyleydi;

Kod: Tümünü seç

Query1.ParamByName('STREF').AsFloat:=StrToFloat(Edit1.Text);
Böyle yaptım oldu;

Kod: Tümünü seç

Query1.ParamByName('STREFE').AsFloat:=StrToFloat(Edit1.Text);
yardım eden arkadaşlarıma teşekkür ederim.
Cevapla