procedure TFormRaporSrg.BitBtn1Click(Sender: TObject);
var
s1,s3:String;
S2:TDate;
b_OR,b_AND:Boolean;
begin
s1:=Edit1.Text;
s2:=DateTimePicker1.date;
S3:=Edit2.Text;
b_OR:=(s1<>'') OR (s2<>'') OR (s3<>'');
b_AND:=false;
with ibQuery1 do
begin
if Active then Close;
with SQL do
begin
Clear;
Add('Select*From RAPORLAR');
if b_OR then Add('Where');
if s1<>'' then add('(RAPORNO LIKE ''%'+s1+'%'')');
b_AND:=b_AND OR (S1<>'');
if b_AND AND(s2<>'') then Add('AND');
if s2<>'' then add('(INCTARIHI LIKE ''%'+s2+'%'')');
b_AND:=b_AND OR (S2<>'');
if b_AND AND(s3<>'') then Add('AND');
if s3<>'' then add('(MUSADSOYAD LIKE ''%'+s3+'%'')');
b_AND:=b_AND OR (S3<>'');
add('ORDER BY RAPORNO');
end;
Open;
if IsEmpty then ShowMessage('Aradığınız Kayıt Bulunamadı?');
end;
yukarıdaki kod ile üç kutucuk içinden hangisine veri girilirse ona göre sorgulama yapmak istiyorum. s2 değişkeni önceki kullanımlarımda Date bir alandı ve sorgulamada sorun yaşamıyordum ve yine kodda s1,s2,s3: string; olarak değişken tanımlıyordum ve tarihsel alanı sorgulayabiliyordum. O zamanki tablom dbaseIV ile hazırlanmıştı.
şimdiki çalışmamda firebird ve ibexpert ile tablo hazırladım ve tarihsel alanlarım date. ama sorgulamada tarihsel alanı sorgulama işlemini yapmadığı için s2 yi tdate olarak belirledim ve çalıştırdığımda OR (S2<>'') satırında beklemeye aldı buradan anlıyorum ki aşağıya doğru hatalar devam edicek, burada s2 satırlarını nasıl düzenlemem gerekir.
procedure TFormRaporSrg.BitBtn1Click(Sender: TObject);
var
s1,s2,s3:String;
b_OR,b_AND:Boolean;
begin
s1:=Edit1.Text;
s2:=Edit2.text;
s3:=edit3.Text;
b_OR:=(s1<>'') OR (s2<>'') or (s3<>'');
b_AND:=false;
with ibQuery1 do
begin
if Active then Close;
with SQL do
begin
Clear;
Add('Select*From RAPORLAR');
if b_OR then Add('Where');
if s1<>'' then add('(RAPORNO LIKE ''%'+s1+'%'')');
b_AND:=b_AND OR (S1<>'');
if b_AND AND(s2<>'') then Add('AND');
if s2<>'' then add('(MUSADSOYAD LIKE ''%'+s2+'%'')');
b_AND:=b_AND OR (S2<>'');
if b_AND AND(S3<>'') then Add('AND');
if s3<>'' then add('(INCTARIHI LIKE ''%'+s3+'%'')');
b_AND:=b_AND OR (S3<>'');
add('ORDER BY RAPORNO');
end;
Open;
if IsEmpty then ShowMessage('Aradığınız Kayıt Bulunamadı?');
end;
end;
kodun bu haliyle s1 ve s2 alanlarına girilen verileri sorgu sonuclarını alabiliyorum fakat s3 alana tarih girdiğimde aradığınız kayıt bulunamadı diyerek boş dönüyor.
procedure TFormRaporSrg.BitBtn1Click(Sender: TObject);
var
s1,,s2,s3:String;
begin
s1:=Edit1.Text;
s2:=datetostr(DateTimePicker1.date);
S3:=Edit2.Text;
ibquery1.close;//zaten kapalıysa hata vermeyecektir
with ibQuery1.sql do
begin
Clear;
Add('Select*From RAPORLAR');
Add('Where');
add('(RAPORNO LIKE ''%'+s1+'%'')');//eğer s1 boşsa zaten tum kayıtlar gelir
Add('AND');
add('(INCTARIHI = '''+s2+''')'); //tarih de like :?
Add('AND');
add('(MUSADSOYAD LIKE ''%'+s3+'%'')');//s3 boşsa zaten tüm kayıtlar gelir
add('ORDER BY RAPORNO');
end; //with
ibquery1.Open;
if IsEmpty then ShowMessage('Aradığınız Kayıt Bulunamadı?');
end; //procedure
Madem ib/fb kullanıyorsun sp kullanarak parametrelerle halletmek daha kullanışlı olur kanaatindeyim.
Kolay Gelsin..
Kolay Gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Sevgili ustam editlerden biri boş ise tüm verilerin dökülmesini istemiyorum. O yüzden bu daha önce ADO ile kullandığım kodu kullanıyorum. Bu sorgulama alanım genel sorgulama alanı olucak eldeki veriye göre sorgulama yapma üç tane kriter alanım var RAPORNO, MUSADSOYAD, INCTARIHI kişi bunlardan birini girerek sorgulama yapabilsin istiyorum. Daha önce soruyu değişik şekilde sormuştum ve ben yapamadım bu komutun adoquery1 kısmını ibquery1 olarak değiştirdim ve string alanlarda sonucu sorunsuz aldım şimdikine ise farklı olarak tarih alanı eklendi ve tarih alanına veri girince sorgulanınca aradığınız kayıt bulunamadı diyerek boş dönüyor. Kayıtlar içinde girilmiş olan bi tarih ile denedim yinede boş döndü. Burada tablo kısmında işi yapmayı bilmediğimden şimdilik böle götürüyorum. Tarih alanı date olduğu için onu ibquery de tanımlayamıyorum heral
procedure TFormRaporSrg.BitBtn1Click(Sender: TObject);
var
s1,s2,s3,ss:String;
begin
s1:=Edit1.Text;
s2:=Edit2.text;
s3:=edit3.Text;
ibquery1.close;
with SQL do
begin
Clear;
Add('Select * From RAPORLAR');
if s1<>'' then s:='(RAPORNO LIKE ''%'+s1+'%'')';
if s2<>'' then
begin
if s<>'' then s:=s+' AND ';
s:=s+'(MUSADSOYAD LIKE ''%'+s2+'%'')'
end;
if s3<>'' then
begin
if s<>'' then s:=s+' AND ';
s:=s+'(INCTARIHI = '''+s3+''')'
end;
if s<>'' then add ('WHERE '+s);
add('ORDER BY RAPORNO');
end;
ibquery1.Open;
if ibquery1.IsEmpty then ShowMessage('Aradığınız Kayıt Bulunamadı?');
end;
Kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Ustadım ellerine sağlık, kodun dilediğimiz gibi çalıştı. Buradan dbase ADO da like ile çalışan tarih alanının ib de like ile çalışmadığını öğrenmiş olduk.
ve ib de bu tür sorguyu öğrenmiş olduk. İşin mantığını tam kavrayabilmek için s genel bi değişken olarak mı kullanıldı // diye kısa açıklamasını yapabilirmisin.