SQL arama kriterileri

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
jafari1983
Üye
Mesajlar: 44
Kayıt: 05 Eyl 2010 10:32

SQL arama kriterileri

Mesaj gönderen jafari1983 »

Salamun aleykum arkadaşlar. Benim problemim arama ile ilgili. MS Access 2003+ADO kullanıyorum. Mağaza programı yazmaq istiyorum. Arama formunda problem çıkıyor. Ben hem tarihe göre aramak istiyorum, hem malın koduna göre, hem de satıcıya göre. 4 tane Edit.Box yerleştirdim formuma. Problem burda, eğer editboxlardan biri boşsa ve ya ikisi boşsa ve ya üçü boşsa 4-cü ye göre ara (farkı yok, her hangi bir Edit.Box dördüncü ola bilir). Yani, 4 tane Edit.Boxların hangisi doluysa ona göre ara, ve ya 2si doluysa ikisine göre ara, ve ya üçü dolysa üçüne göre ara, ve ya hepsi doluysa hepsine göre ara. Aklım hiç almıyor bunun kodu nasıl olacak... Önceden teşekkürler!
"Əlini (ə.) şah, Muhammədi (s.) padişah bilməyən Allahı da tanımaz!"
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: SQL arama kriterileri

Mesaj gönderen unicorn64 »

editleri kontrol ederek sorguyu adım adım oluşturabilirsiniz...

Kod: Tümünü seç

var
   sql:string;
begin
  sql:='SELECT * FROM TABLO WHERE (1=1) ';

  if edit1.text<>'' then
    sql:=sql+' AND (ALAN1='+quotedstr(edit1.text)+') ';
  
  if edit2.text<>'' then
    sql:=sql+' AND (ALAN2='+quotedstr(edit2.text)+') ';
 
  //..................


  showmessage(sql);

end;


bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
jafari1983
Üye
Mesajlar: 44
Kayıt: 05 Eyl 2010 10:32

Re: SQL arama kriterileri

Mesaj gönderen jafari1983 »

Allah sizden razi olsun kardesim, ben bu kadar kod yazdim, hepsi aptalca mi ?

Kod: Tümünü seç

procedure TForm2.Button1Click(Sender: TObject);
begin
if Edit1.Text<>'' then //eger kod sifirdan ferqlidirse
	with ADOQuery1 do begin
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Kod =:kod');
	Parameters.ParamByName('kod').Value := StrToInt(Edit1.Text);
	Active := true;
	end

else if (Edit1.Text<>'') and (Edit2.Text<>'') then //eger kod ve ad sifirdan ferqlidirse
	with ADOQuery1 do begin
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Kod =:kod AND Ad=:ad');
	Parameters.ParamByName('ad').Value := Edit2.Text;
	Parameters.ParamByName('kod').Value := StrToInt(Edit1.Text);
	Active := true;
	end

else if (Edit1.Text<>'') and (Edit2.Text<>'') and (MaskEdit3.Text<>'') and (MaskEdit4.Text<>'') then
	with ADOQuery1 do begin //eger kod, ad ve tarix sifirdan ferqlidirse
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Kod = :kod AND Ad=:Ad AND (Tarix >= :tar1 and Tarix <= :tar2)');
	Parameters.ParamByName('ad').Value := Edit2.Text;
	Parameters.ParamByName('kod').Value := StrToInt(Edit1.Text);
	Parameters.ParamByName('tar1').Value := StrTodate(MaskEdit3.Text);
	Parameters.ParamByName('tar2').Value := StrTodate(MaskEdit4.Text);
	Active := true;
	end

else if (Edit1.Text<>'') and (Edit2.Text<>'') and (MaskEdit3.Text<>'') and (MaskEdit4.Text<>'') and (Edit5.Text<>'') then
	with ADOQuery1 do begin //eger kod, ad, tarix ve satici sifirdan ferqlidirse
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Kod=:kod AND Ad=:ad AND Satici=:sat AND (Tarix>=:tar1 and Tarix<=:tar2)');
	Parameters.ParamByName('ad').Value := Edit2.Text;
	Parameters.ParamByName('kod').Value := StrToInt(Edit1.Text);
	Parameters.ParamByName('tar1').Value := StrTodate(MaskEdit3.Text);
	Parameters.ParamByName('tar2').Value := StrTodate(MaskEdit4.Text);
	Parameters.ParamByName('sat').Value := Edit5.Text;
	Active := true;
	end

else if (Edit1.Text<>'') and (Edit5.Text<>'') then
	with ADOQuery1 do begin //eger kod ve satici sifirdan ferqlidirse
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Kod=:kod and Satici=:sat ');
	Parameters.ParamByName('kod').Value := StrToInt(Edit1.Text);
	Parameters.ParamByName('sat').Value := Edit5.Text;
	Active := true;
	end

else if (Edit1.Text<>'') and (MaskEdit3.Text<>'') and (MaskEdit4.Text<>'') then
	with ADOQuery1 do begin //eger kod ve tarix sifirdan ferqlidirse
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Kod=:kod AND (Tarix>=:tar1 and Tarix<=:tar2)');
	Parameters.ParamByName('kod').Value := StrToInt(Edit1.Text);
	Parameters.ParamByName('tar1').Value := StrTodate(MaskEdit3.Text);
	Parameters.ParamByName('tar2').Value := StrTodate(MaskEdit4.Text);
	Active := true;
	end

else if (Edit1.Text<>'') and (Edit2.Text<>'') and (MaskEdit3.Text<>'') and (MaskEdit4.Text<>'') then
	with ADOQuery1 do begin //eger kod, ad ve satici sifirdan ferqlidirse
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Kod=:kod and Satici=:sat AND Ad=:Ad AND ');
	Parameters.ParamByName('ad').Value := Edit2.Text;
	Parameters.ParamByName('kod').Value := StrToInt(Edit1.Text);
	Parameters.ParamByName('sat').Value := Edit5.Text;
	Active := true;
	end

else if (Edit1.Text<>'') and (MaskEdit3.Text<>'') and (MaskEdit4.Text<>'') and (Edit5.Text<>'') then
	with ADOQuery1 do begin //eger kod, tarix ve satici sifirdan ferqlidirse
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Kod=:kod and Satici=:sat AND (Tarix>=:tar1 and Tarix<=:tar2)');
	Parameters.ParamByName('kod').Value := StrToInt(Edit1.Text);
	Parameters.ParamByName('tar1').Value := StrTodate(MaskEdit3.Text);
	Parameters.ParamByName('tar2').Value := StrTodate(MaskEdit4.Text);
	Parameters.ParamByName('sat').Value := Edit5.Text;
	Active := true;
	end

else if Edit2.Text<>''then
	with ADOQuery1 do begin //eger ad sifirdan ferqlidirse
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Ad=:Ad');
	Parameters.ParamByName('ad').Value := Edit2.Text;
	Active := true;
	end

else if (Edit2.Text<>'') and (MaskEdit3.Text<>'') and (MaskEdit4.Text<>'')then
	with ADOQuery1 do begin //eger ad ve tarix sifirdan ferqlidirse
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Ad=:ad AND (Tarix>=:tar1 and Tarix<=:tar2)');
	Parameters.ParamByName('ad').Value := Edit2.Text;
	Parameters.ParamByName('tar1').Value := StrTodate(MaskEdit3.Text);
	Parameters.ParamByName('tar2').Value := StrTodate(MaskEdit4.Text);
	Active := true;
	end

else if (Edit2.Text<>'') and (Edit5.Text<>'')  then
	with ADOQuery1 do begin //eger ad ve satici sifirdan ferqlidirse
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Satici=:sat AND Ad=:ad');
	Parameters.ParamByName('ad').Value := Edit2.Text;
	Parameters.ParamByName('sat').Value := Edit5.Text;
	Active := true;
	end

else if (Edit1.Text<>'') and (Edit5.Text<>'') and (MaskEdit3.Text<>'') and (MaskEdit4.Text<>'') and (Edit5.Text<>'') then
	with ADOQuery1 do begin //eger ad, tarix ve satici sifirdan ferqlidirse
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Satici=:sat AND Ad=:Ad AND (Tarix>=:tar1 and Tarix<=:tar2)');
	Parameters.ParamByName('ad').Value := Edit2.Text;
	Parameters.ParamByName('tar1').Value := StrTodate(MaskEdit3.Text);
	Parameters.ParamByName('tar2').Value := StrTodate(MaskEdit4.Text);
	Parameters.ParamByName('sat').Value := Edit5.Text;
	Active := true;
	end

else if (MaskEdit3.Text<>'') and (MaskEdit4.Text<>'') then
	with ADOQuery1 do begin //eger tarix sifirdan ferqlidirse
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where (Tarix>=:tar1 and Tarix<=:tar2)');
	Parameters.ParamByName('tar1').Value := StrTodate(MaskEdit3.Text);
	Parameters.ParamByName('tar2').Value := StrTodate(MaskEdit4.Text);
	Active := true;
	end

else if (Edit5.Text<>'') and (MaskEdit3.Text<>'') and (MaskEdit4.Text<>'')  then
	with ADOQuery1 do begin //eger tarix ve satici sifirdan ferqlidirse
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Satici=:sat AND (Tarix>=:tar1 and Tarix<=:tar2)');
	Parameters.ParamByName('tar1').Value := StrTodate(MaskEdit3.Text);
	Parameters.ParamByName('tar2').Value := StrTodate(MaskEdit4.Text);
	Parameters.ParamByName('sat').Value := Edit5.Text;
	Active := true;
	end
else if Edit5.Text<>'' then
	with ADOQuery1 do begin //eger satici sifirdan ferqlidirse
	Active := false;
	SQL.Clear;
	SQL.Add('select * from Table1 where Satici=:sat');
	Parameters.ParamByName('sat').Value := Edit5.Text;
	Active := true;
	end
else
	ShowMessage('Axtaris ucun melumat daxil edilmedi!!!');


end;
"Əlini (ə.) şah, Muhammədi (s.) padişah bilməyən Allahı da tanımaz!"
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: SQL arama kriterileri

Mesaj gönderen unicorn64 »

yok aptalca demeyelim de gereksiz...
sizin yöntemle kriter arttıkca kontrol edilecek ihtimaller bitmek bilmez...
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
jafari1983
Üye
Mesajlar: 44
Kayıt: 05 Eyl 2010 10:32

Re: SQL arama kriterileri

Mesaj gönderen jafari1983 »

çok teşekkür ederim, işime yaradı, 200 satırlıq kodu 4 satırla hall ettin. ama bir problem daha var. Benim Edit.Boxların bazıları currency, integer ve DateTime formatinda. Onları senin verdiğin kodda nasıl yazacam ? Sonra % işaretini de ilave etmek istiyorum string olan editboxlarda, ama nereye ilave edeceğimi bilmiyom....
"Əlini (ə.) şah, Muhammədi (s.) padişah bilməyən Allahı da tanımaz!"
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: SQL arama kriterileri

Mesaj gönderen unicorn64 »

özellikle currency ve datetime alanlarında dikkatli olman, uğraşman gerekebilir. sql tarafında ondalık ayracı noktadır, delphi tarafında (kullanıcının sistem ayarlarına bağlı olarak) virgüldür...
editlerde % kullanıcam derken like la aramaktan mı bahsediyorsun?
bence en iyisi parametre kullanımı... mantığı anlaman için bir örnek daha, gerisi sana kalmış...

Kod: Tümünü seç

  sql:='SELECT * FROM TABLO WHERE (1=1) ';

  if edit1.text<>'' then
    sql:=sql+' AND (ALAN1=@ALAN1)';
 
  if edit2.text<>'' then
    sql:=sql+' AND (ALAN2 LIKE @ALAN2)';
  
   if edit3.text<>'' then
    sql:=sql+' AND (ALAN3=@ALAN3)';

  with AdoQuery,SQL do
  begin
      close;
      clear;
      add(sql);
      paramByName('ALAN1').asfloat:=strtofloat(edit1.text);
      paramByName('ALAN2').asstring:='%'+edit2.text;
      paramByName('ALAN3').asstring:=edit3.text;
      open;
  end;
  
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
jafari1983
Üye
Mesajlar: 44
Kayıt: 05 Eyl 2010 10:32

Re: SQL arama kriterileri

Mesaj gönderen jafari1983 »

Bir daha salamun aleykum. Kardeş, parametrelerle bu kodu çalıştıramadım, Edit1.Text- boş brakdığımda ("" is not a valid integer value) hatasını veriyor. Parametreler satrını sildiğimde diğer kodlar çalışıyor, 3-4 gündür dememediğim şey kalmadı, ama bir türlü çalışmadı. Sİz de kontrol edin lütfen, belki bir yerlerde hata yapmışam. Biraz detaylı yazın lütfen, ben Delphide çok yeniyim.... Baramınız Kutlu Olsun.

Kod: Tümünü seç

procedure TForm2.Button1Click(Sender: TObject);

  var
  sql:string;

    begin
      sql:='SELECT * FROM Table1 WHERE (1=1) ';

      if Edit1.Text<>'' then
        sql:=sql+' AND (Kod=:kod)';

      if Edit5.Text<>'' then
        sql:=sql+' AND (Satici='+QuotedStr(Edit5.Text)+') ';


      ADOQuery1.Active := false;
      ADOQuery1.SQL.Clear;
      ADOQuery1.Parameters.ParamByName('kod').Value:=StrToInt(Edit1.Text);
      ADOQuery1.SQL.Add(sql);
      ADOQuery1.Active := true;
      showmessage(sql);




end;
"Əlini (ə.) şah, Muhammədi (s.) padişah bilməyən Allahı da tanımaz!"
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: SQL arama kriterileri

Mesaj gönderen unicorn64 »

sqli oluştururken editler boş mu diye kontrol etmişsin çok güzel, ancak parametreye değer atarken aynı kontrolü yapmayı unutmuşsun, ayrıca string alanları da parametreli aktarmanı öneririm.
yoksa kullanım yerine göre sıkıntılar oluşabilir. mesela girilen değerde tırnak işareti varsa sql yamulur... gerçi quotedstring demişsiniz ama böylece ona da gerek kalmaz...

Kod: Tümünü seç

'deneme
İstanbul'dan
.....

Kod: Tümünü seç


var
  sql:string;

begin
      sql:='SELECT * FROM Table1 WHERE (1=1) ';

      if Edit1.Text<>'' then
        sql:=sql+' AND (Kod=:kod)';

      if Edit5.Text<>'' then
        sql:=sql+' AND (Satici=:satici) ';


      ADOQuery1.Active := false;
      ADOQuery1.SQL.Clear;
      if Edit1.Text<>'' then
          ADOQuery1.Parameters.ParamByName('kod').AsInteger:=StrToInt(Edit1.Text);
      if Edit5.Text<>'' then
         ADOQuery1.Parameters.ParamByName('satici').AsString:=Edit5.Text;
      ADOQuery1.SQL.Add(sql);
      ADOQuery1.Active := true;
      showmessage(sql);
end;

ayrıca sayısal giriş yapılacak editlere kontrol ekleyerek harf girişini engellerseniz iyi olur, kullanıcının ne yapacağı belli olmaz...
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
jafari1983
Üye
Mesajlar: 44
Kayıt: 05 Eyl 2010 10:32

Re: SQL arama kriterileri

Mesaj gönderen jafari1983 »

Allah senden razı olsun kardeş. :bravo: Herşey şimdi tamam! Çok teşekkür edirem.
"Əlini (ə.) şah, Muhammədi (s.) padişah bilməyən Allahı da tanımaz!"
Cevapla