Çoklu Sorgulama (Profesyonel)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Çoklu Sorgulama (Profesyonel)

Mesaj gönderen pro_imaj »

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.
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]
_________________
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

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...
Siz hayal edin...Biz yapalım TuannaSoft...
ercere
Üye
Mesajlar: 48
Kayıt: 23 Kas 2004 02:38
Konum: Ulus-BARTIN

Mesaj gönderen ercere »

Merhaba aşağıdaki gibi bir kodu çoğaltarak istediğin kadar şartı sorgulayabilirsin.

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 + '%';
..........
Umarım işini görür Kolay gelsin
Bilginin sınırı öğrenmenin yaşı yoktur.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

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.

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);
biraz uğraştırıyor tabi :) devexpress'in filter özellik penceriside çağrılabilir. ama onu kullanmakta zorlanıyorlar. kolay gelsin.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

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.

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;
kolay gelsin.
Volkan KAMADAN
www.polisoft.com.tr
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

bkz. kendi yazdığım bir sınıf. işinizi görebilir.

viewtopic.php?p=48739#48739
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Çok Teşekkür ederim Arkadaşlar Oldu

Mesaj gönderen pro_imaj »

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İŞİ****************}
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]
_________________
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

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....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
ender_arslanturk
Kıdemli Üye
Mesajlar: 709
Kayıt: 18 Şub 2005 03:38
Konum: İstanbul

Mesaj gönderen ender_arslanturk »

Benden De Bir Örnek .... :D

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,
Cevapla