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;
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.
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?
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;
@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.
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.
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.
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;
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..
...
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.
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.
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....