Çoklu Sorgulama (Profesyonel)
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Çoklu Sorgulama (Profesyonel)
Merhaba Arkadaşlar
Bu Soruyu Sql Formunamı yoksa burayamı yazacağımı epey düşündüm.
Sorum şöyle olacaktı.
Ben normal arama yarken (iki tarih arası vey herhangi bir arama metodu) basit bir kullanım ile yapıyorum.
Büyük çaptaki programların sorgulamaları beni çok etkilede kısacası.
örneğin 20 tane koşul bir arada nasılk sorgulatabilirim (Kolay bir yolu varmı anlamında)
Örn;
iki tarih - fatura nosu şu ile başlayıp bu ile biten - fiyatı şu olan ....... gibi
Yani kullanıcın girdiği alanlara uygun kriterlere göre arama yapmak yani bu biraz komplike bir durum olduğu için Sizlerin yardımlarını almak çok daha faydalı olur görüşündeyim.
Yardımlarınız için şimdiden çok teşekkür ederim.
Saygılarımla.
Çalışmalarınızda başarılar kolay gelsin.
Çok Paylaşmak, Çok Bilmekten Daha Erdemdir...
Delphi TÜRKİYE olarak bu hedefte gidilmesine vesile olan site yöneticilerine ve kullanıcılara en içten teşekkürlerimi sunuyorum.
Bu Soruyu Sql Formunamı yoksa burayamı yazacağımı epey düşündüm.
Sorum şöyle olacaktı.
Ben normal arama yarken (iki tarih arası vey herhangi bir arama metodu) basit bir kullanım ile yapıyorum.
Büyük çaptaki programların sorgulamaları beni çok etkilede kısacası.
örneğin 20 tane koşul bir arada nasılk sorgulatabilirim (Kolay bir yolu varmı anlamında)
Örn;
iki tarih - fatura nosu şu ile başlayıp bu ile biten - fiyatı şu olan ....... gibi
Yani kullanıcın girdiği alanlara uygun kriterlere göre arama yapmak yani bu biraz komplike bir durum olduğu için Sizlerin yardımlarını almak çok daha faydalı olur görüşündeyim.
Yardımlarınız için şimdiden çok teşekkür ederim.
Saygılarımla.
Çalışmalarınızda başarılar kolay gelsin.
Çok Paylaşmak, Çok Bilmekten Daha Erdemdir...
Delphi TÜRKİYE olarak bu hedefte gidilmesine vesile olan site yöneticilerine ve kullanıcılara en içten teşekkürlerimi sunuyorum.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
_________________
Tuannadan sevgiler kardeşim....
öncelikle soruna cevap verirken soruna sunu söylemek istiyorum....
içerisinde bir çok soru var....
anladığım kadarı ile yapman gereken su ....
bir forum oluşturur....
formun üzerine koyacağın kontrolle operatörden sartları iste ...
ve her sarta bir procedure tanımla sonra
seçilen procedurleri sıra ile uygulat....işte bu kadar kod yazmaya başla burada profesyonel abiler kardeşler sana yardımcı olacak....
ikinci önce aramayı kullan bunların hepsi küçük görünen forumda aslında kendileri çok seyi içerir...
öncelikle soruna cevap verirken soruna sunu söylemek istiyorum....
içerisinde bir çok soru var....
anladığım kadarı ile yapman gereken su ....
bir forum oluşturur....
formun üzerine koyacağın kontrolle operatörden sartları iste ...
ve her sarta bir procedure tanımla sonra
seçilen procedurleri sıra ile uygulat....işte bu kadar kod yazmaya başla burada profesyonel abiler kardeşler sana yardımcı olacak....
ikinci önce aramayı kullan bunların hepsi küçük görünen forumda aslında kendileri çok seyi içerir...
Siz hayal edin...Biz yapalım TuannaSoft...
Merhaba aşağıdaki gibi bir kodu çoğaltarak istediğin kadar şartı sorgulayabilirsin.
Umarım işini görür Kolay gelsin
Kod: Tümünü seç
........
ibsql.SelectSQL.Add('SELECT * FROM CARI WHERE (ADI BETWEEN :ILK and :SON) and (tarih between :ilktar and :sontar) and (fatno between :ilkno and :sonno) and (fiyat =:fiyat) and (.....)');
ibsql.ParamByName('ILK').AsString := edit1.Text + '%';
ibsql.ParamByName('SON').AsString := edit2.Text + '%';
ibsql.ParamByName('ilktar').AsString := edit3.Text + '%';
ibsql.ParamByName('sontar').AsString := edit4.Text + '%';
ibsql.ParamByName('ilkno').AsString := edit5.Text + '%';
ibsql.ParamByName('sonno').AsString := edit6.Text + '%';
ibsql.ParamByName('fiyat').AsString := edit7.Text + '%';
ibsql.ParamByName('...').AsString := edit8.Text + '%';
..........
Bilginin sınırı öğrenmenin yaşı yoktur.
ben daha geniş bir örnek yazayım. bekimkinde comboxdan şartlar seçiliyor. tüm comboxlar içinde Tümü, Eşit, Büyük ve Küçük, İçeren değerleri yer alıyor.
biraz uğraştırıyor tabi
devexpress'in filter özellik penceriside çağrılabilir. ama onu kullanmakta zorlanıyorlar. kolay gelsin.
Kod: Tümünü seç
var
wheredurum,sql :string;
i:integer;
begin
wheredurum := ' where ';
tablo_paraakisi.Close;
tablo_paraakisi.SQL.Clear;
sql:= 'SELECT * from paraakisi';
if cm_ilg_kis.Text <> 'Tümü' then
begin
if cm_ilg_kis.Text = 'Eşit' then
sql := sql + wheredurum + 'ilgili_no = '+ tx_ilg_bas.text
else if cm_ilg_kis.Text = 'Büyük' then
sql := sql + wheredurum + 'ilgili_no > '+ tx_ilg_bas.text
else if cm_ilg_kis.Text = 'Küçük' then
sql := sql + wheredurum + 'ilgili_no < '+ tx_ilg_bas.text
else if cm_ilg_kis.Text = 'Arasında' then
sql := sql + wheredurum + 'ilgili_no between '+ tx_ilg_bas.text+' and '+tx_ilg_bit.text;
wheredurum := ' and ';
end;
if (cmk_don_kis.GetItemState(0)<> cbsChecked) and (cmk_don_kis.Text <> 'Seçiniz ...') then
begin
sql := sql + wheredurum + 'donemi in (''';
for i := cmk_don_kis.Properties.Items.Count-1 downto 0 do
if cmk_don_kis.GetItemState(i)= cbsChecked then
sql := sql+cmk_don_kis.Properties.Items.Items[i].Description+''',''';
sql := copy(sql,1,length(sql)-2)+')';
wheredurum := ' and ';
end;
if cm_isl_kis.Text <> 'Tümü' then
begin
if cm_isl_kis.Text = 'Eşit' then
sql := sql + wheredurum + 'islem_no = '+ tx_isl_bas.text
else if cm_isl_kis.Text = 'Büyük' then
sql := sql + wheredurum + 'islem_no > '+ tx_isl_bas.text
else if cm_isl_kis.Text = 'Küçük' then
sql := sql + wheredurum + 'islem_no < '+ tx_isl_bas.text
else if cm_isl_kis.Text = 'Arasında' then
sql := sql + wheredurum + 'islem_no between '+ tx_isl_bas.text+' and '+tx_isl_bit.text;
wheredurum := ' and ';
end;
if cm_tar_kis.Text <> 'Tümü' then
begin
if cm_tar_kis.Text = 'Eşit' then
sql := sql + wheredurum + 'tarih = '+ mtarih(tx_tar_bas.date)
else if cm_tar_kis.Text = 'Büyük' then
sql := sql + wheredurum + 'tarih > '+ mtarih(tx_tar_bas.date)
else if cm_tar_kis.Text = 'Küçük' then
sql := sql + wheredurum + 'tarih < '+ mtarih(tx_tar_bas.date)
else if cm_tar_kis.Text = 'Arasında' then
sql := sql + wheredurum + 'tarih between '+ mtarih(tx_tar_bas.date)+' and '+mtarih(tx_tar_bit.date);
wheredurum := ' and ';
end;
if cm_hes_kis.Text <> 'Tümü' then
begin
sql := sql + wheredurum + 'ilgilihesap = "'+ cm_hes_kis.Text+'"';
wheredurum := ' and ';
end;
if cm_aci_kis.Text <> 'Tümü' then
begin
if cm_aci_kis.Text = 'Eşit' then
sql := sql + wheredurum + 'aciklama = '+ '"'+tx_aci_bas.text+'"'
else if cm_aci_kis.Text = 'İçeren' then
sql := sql + wheredurum + 'aciklama like '+'"%'+ tx_aci_bas.text+'%"';
if yetki > 50 then
sql := sql + ' and aciklama not like ''MAAŞ%''';
wheredurum := ' and ';
end
else
if yetki > 50 then
begin
sql := sql + wheredurum + 'aciklama not like ''MAAŞ%''';
wheredurum := ' and ';
end;
if cm_ist_kis.Text <> 'Tümü' then
begin
if cm_ist_kis.Text = 'Eşit' then
sql := sql + wheredurum + 'date_format(islem_tarihi,''%Y-%m-%d'') ='+ mtarih(tx_ist_bas.date)
else if cm_ist_kis.Text = 'Büyük' then
sql := sql + wheredurum + 'islem_tarihi > '+ mtarih(tx_ist_bas.date)
else if cm_ist_kis.Text = 'Küçük' then
sql := sql + wheredurum + 'islem_tarihi < '+ mtarih(tx_ist_bas.date)
else if cm_ist_kis.Text = 'Arasında' then
sql := sql + wheredurum + 'islem_tarihi between '+ mtarih(tx_ist_bas.date)+' and '+mtarih(tx_ist_bit.date);
wheredurum := ' and ';
end;
tablo_paraakisi.SQL.Add(sql);

Merhaba dostum ,
Basit bir örnek vermek gerekirse, sana tavsiyem CheckBox lar kullan kritere dahil edilmek istenen ChekcBox seçilsin bunun kontrolünü yaparak SQL Cümleni oluştur.
kolay gelsin.
Basit bir örnek vermek gerekirse, sana tavsiyem CheckBox lar kullan kritere dahil edilmek istenen ChekcBox seçilsin bunun kontrolünü yaparak SQL Cümleni oluştur.
Kod: Tümünü seç
var
SQLCumlesi:AnsiString;
begin
SQLCumlesi:='select *from tablo where id_alan is not null';
if checkBox1.checked then SQlCumlesi:=SqlCumlesi+' and sorulanacak_alan1=:param1';
if checkBox2.checked then SQlCumlesi:=SqlCumlesi+' and sorulanacak_alan2=:param2';
with Query do
begin
close;
sql.clear;
sql.add(SQLCumlesi);
if checkBox1.checked then ParamByName('param1').value := deger1;
if checkBox2.checked then ParamByName('param2').value := deger2;
active:=true;
end;
end;
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
Çok Teşekkür ederim Arkadaşlar Oldu
Arkadaşlar hepinize çok teşekkür ederim.
Şu an biraz uzun kodlarlada olsa yapabildim.
(Halen Geliştirmeye ÇAlışıyorum)
Saygılarımla
Çlışmalarınızda başarılar.
Kodlar Aşağıdadır Bilginize Arkadaşlar
{******* TÜM PARAMETRELERE GÖRE ARAMA BAŞLANGICI ************}
if (tar=1) and (tut=1) and (cekno=1) and (cektur=1) then
begin
//////////İki Tarih Arası Arama
sayi3:=StrToCurr (Edit3.text);
sayi4:=StrToCurr (Edit4.text);
sayi3:=sayi3-1; // Yazılanıda Araması için
sayi4:=sayi4+1; // Yazılanıda Araması İçin
sayi5:=StrToInt (Edit5.text);
sayi6:=StrToInt (Edit6.text);
sayi5:=sayi5-1; // Yazılanıda Araması için
sayi6:=sayi6+1; // Yazılanıda Araması İçin
if ComboBox1.Text='Portfoye Giriş' then tip:=0;
//if ComboBox1.Text='Portfoye Giriş' then tip:=1;
if ComboBox1.Text='Ödeme' then tip:=2;
//if ComboBox1.Text='Portfoye Giriş' then tip:=3;
if ComboBox1.Text='Tahsilata Çıkış' then tip:=4;
if ComboBox1.Text='İade Edildi' then tip:=5;
//if ComboBox1.Text='Portfoye Giriş' then tip:=6;
//if ComboBox1.Text='Portfoye Giriş' then tip:=7;
if ComboBox1.Text='Karşılıksız' then tip:=8;
//if ComboBox1.Text='Portfoye Giriş' then tip:=9;
//if ComboBox1.Text='Portfoye Giriş' then tip:=10;
//if ComboBox1.Text='Portfoye Giriş' then tip:=11;
//if ComboBox1.Text='Portfoye Giriş' then tip:=12;
if ComboBox1.Text='Kasadan Tahsil Edildi' then tip:=13;
sayi1:=StrToint (Edit1.text);
sayi2:=StrToint (Edit2.text);
sayi1:=sayi1-1;
sayi2:=sayi2+1;
sistem.AckQuery.Close;
sistem.AckQuery.Sql.Clear;
sistem.AckQuery.sql.text:='Select * From FINSAT4'+Giris.SdkQueryKod.Text+'.ACK Where VadeTarih >'''+inttostr(sayi1)+''' and VadeTarih <'''+inttostr(sayi2)+''' and CekNo>'''+IntToStr (sayi5)+''' and CekNo <''' + IntToStr (sayi6)+''' and SonIslemTip ='''+inttostr(tip)+''' and Tutar>'''+currtostr (sayi3)+''' and Tutar <''' +currtostr (sayi4)+'''';
sistem.AckQuery.Open;
////////////////
end;
{******* TÜM PARAMETRELERE GÖRE ARAMA BİTİŞİ****************}
Şu an biraz uzun kodlarlada olsa yapabildim.
(Halen Geliştirmeye ÇAlışıyorum)
Saygılarımla
Çlışmalarınızda başarılar.
Kodlar Aşağıdadır Bilginize Arkadaşlar
{******* TÜM PARAMETRELERE GÖRE ARAMA BAŞLANGICI ************}
if (tar=1) and (tut=1) and (cekno=1) and (cektur=1) then
begin
//////////İki Tarih Arası Arama
sayi3:=StrToCurr (Edit3.text);
sayi4:=StrToCurr (Edit4.text);
sayi3:=sayi3-1; // Yazılanıda Araması için
sayi4:=sayi4+1; // Yazılanıda Araması İçin
sayi5:=StrToInt (Edit5.text);
sayi6:=StrToInt (Edit6.text);
sayi5:=sayi5-1; // Yazılanıda Araması için
sayi6:=sayi6+1; // Yazılanıda Araması İçin
if ComboBox1.Text='Portfoye Giriş' then tip:=0;
//if ComboBox1.Text='Portfoye Giriş' then tip:=1;
if ComboBox1.Text='Ödeme' then tip:=2;
//if ComboBox1.Text='Portfoye Giriş' then tip:=3;
if ComboBox1.Text='Tahsilata Çıkış' then tip:=4;
if ComboBox1.Text='İade Edildi' then tip:=5;
//if ComboBox1.Text='Portfoye Giriş' then tip:=6;
//if ComboBox1.Text='Portfoye Giriş' then tip:=7;
if ComboBox1.Text='Karşılıksız' then tip:=8;
//if ComboBox1.Text='Portfoye Giriş' then tip:=9;
//if ComboBox1.Text='Portfoye Giriş' then tip:=10;
//if ComboBox1.Text='Portfoye Giriş' then tip:=11;
//if ComboBox1.Text='Portfoye Giriş' then tip:=12;
if ComboBox1.Text='Kasadan Tahsil Edildi' then tip:=13;
sayi1:=StrToint (Edit1.text);
sayi2:=StrToint (Edit2.text);
sayi1:=sayi1-1;
sayi2:=sayi2+1;
sistem.AckQuery.Close;
sistem.AckQuery.Sql.Clear;
sistem.AckQuery.sql.text:='Select * From FINSAT4'+Giris.SdkQueryKod.Text+'.ACK Where VadeTarih >'''+inttostr(sayi1)+''' and VadeTarih <'''+inttostr(sayi2)+''' and CekNo>'''+IntToStr (sayi5)+''' and CekNo <''' + IntToStr (sayi6)+''' and SonIslemTip ='''+inttostr(tip)+''' and Tutar>'''+currtostr (sayi3)+''' and Tutar <''' +currtostr (sayi4)+'''';
sistem.AckQuery.Open;
////////////////
end;
{******* TÜM PARAMETRELERE GÖRE ARAMA BİTİŞİ****************}
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
_________________
Kodunuzu incelemedim ama hiç de uzun sayılmaz.... Zira zaten bu tür çok kritere gore aramalarda her kriter icin bir sekilde kontrol koymalısınız. Eger secimlediyse hic devreye alınmasın. Secildiyse devreye alınsın...
Temel mantık belli sonucta... her yeni kriter ilavesinde Select cümlenizin where bolumu biraz daha uzayacak. Bunu uzatmak için de gerekli kontroller derken delphi kodunuz da biraz uzayacak....
Temel mantık belli sonucta... her yeni kriter ilavesinde Select cümlenizin where bolumu biraz daha uzayacak. Bunu uzatmak için de gerekli kontroller derken delphi kodunuz da biraz uzayacak....
* http://www.fahrettin.org Manzara Fotoğraflarım... 
* http://delphiturkiye.gunduz.info Seminerler...
* http://www.hakmar.com.tr Kalite bir haktır...

* http://delphiturkiye.gunduz.info Seminerler...

* http://www.hakmar.com.tr Kalite bir haktır...

- ender_arslanturk
- Kıdemli Üye
- Mesajlar: 709
- Kayıt: 18 Şub 2005 03:38
- Konum: İstanbul
Benden De Bir Örnek ....
Mesela Benim sistemim ....
Query1.Close;
Query1.Sql.Clear;
Query1.Sql.Add('Select* From Tablo Where Alan>0');
if edit1.text<>'' then Query1.Sql.Add('and alan2'+=QuoTedStr(edit1.Text)+'');
if edit2.text<>'' then Query1.Sql.Add('and alan3'+=QuoTedStr(edit2.Text)+'');
if edit3.text<>'' then Query1.Sql.Add('and alan4'+=QuoTedStr(edit3.Text)+'');
.
.
.
.
Query1.Prepare;
Query1.Open;
Saygılar,

Mesela Benim sistemim ....
Query1.Close;
Query1.Sql.Clear;
Query1.Sql.Add('Select* From Tablo Where Alan>0');
if edit1.text<>'' then Query1.Sql.Add('and alan2'+=QuoTedStr(edit1.Text)+'');
if edit2.text<>'' then Query1.Sql.Add('and alan3'+=QuoTedStr(edit2.Text)+'');
if edit3.text<>'' then Query1.Sql.Add('and alan4'+=QuoTedStr(edit3.Text)+'');
.
.
.
.
Query1.Prepare;
Query1.Open;
Saygılar,