Kayıtları en uygun filtreleme yöntemi nedir

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
EeCOMP
Üye
Mesajlar: 119
Kayıt: 13 Tem 2003 10:38
Konum: istanbul
İletişim:

Kayıtları en uygun filtreleme yöntemi nedir

Mesaj gönderen EeCOMP »

İyi günler
Benim paradox ile yaptığım veritabanımda arama yaparken yaşadığım bir sıkıntı var
program bir tür kütüphane
şimdi formumda dbedit1 dbedit2 dbedit3 var
bunlardan birine kitap adı birine yazar adı birine ise kitap türü giriliyor(hikaye,roman vs.)
şimdi ben burada arama butonu ile mesela bir yazara ait tüm kitapları veya kitap türünü girdircem bu türe ait kitapları listelemesini istiyorum.
normal locate ile yaptığımda oraya yazarın adını gösterdiğimde o yazarın yazdığı ilk kaydı gösteriyo sonraki yok ondan sonrakileri göstermiyo kişi yazarın adını giricek ben o yazara ait kitapların isimlerini bir listboxda göstericem bunu nasıl yapabilirim ben bunu yaparken

table1.first;
repeat
I:=I+1;
table1.next;
if edit1.text=dbedit2.text then
listbox1.items.add(dbedit1.text);
until I=dbgrid1.columns.count;

şeklinde yapıyorum ama böyle yapınca kayıtlar artınca program çok yavaşlıyo bunun daha kolay bir yolu yokmu
umarım problemimi doğru aktarabilmişimdir
:mrgreen:
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Bir yazara ait kitaplarin sayisi eger bir kac yuzden fazla olacaksa ya da genel anlamda listbox'da gostereceginiz kayit sayisi cok fazla olacaksa yavaslik kacinilmaz olur. Ben sahsen 100 adetten fazla kayit soz konusu ise bunlari listbox veya combobox gibi componentlerin items property'sinde gostermiyorum. Oraya yuklemenin yavas olacak olmasindan vs..

Yaptiginiz isleme gelince bu ornek klasik bir client server mimari avantajini aciklama ornegi oldu. Gerci paradox client server mimariyi desteklemiyor ama ola ki destekleyen bir veritabani kullaniyor olsaydiniz sizin verdigini ornekte kitap tablosundaki butun kitaplari client tarafa cekip karsilastirmayi client bilgisayarin memory'si,nde yapmis oluyordunuz yani 10,000 kitap varsa bu 10,000 kitap kaydi da server'dan client'a tasinmis olacakti. Bunun yerine ideal cozum bir query ile sadece sonuclarin client tarafina gelmesini saglamaktir.

Yani mesela

Kod: Tümünü seç

with TQuery.Create(Self) do
begin
  DatabaseName:='KITAP';
  SQL.Add('Select * from KITAP where YAZAR_ADI='+#39+Edit2.Text+#39);
  Open;
  while not Eof do
  begin
    Listbox1.Items.add(FieldByName('KITAP_ADI').AsString);
    Next;
  end;
  Free;
end;
gibi bir kod ile doldurma isini yapabilirsiniz. Kodu denemeden yazdim. Yazim hatasi olabilir belki . DatabaseName olarak KITAP isimli bir Database oldugunu varsaydim. KITAP isimli bir tabloda KITAP_ADI ve YAZAR_ADI seklinde alanlar oldugunu varsaydim.

Kolay gelsin...
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7587
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

bence de bu iş için Listbox iyi bir seçim değil. Neden DbGrid kullanmıyorsunuz. Mesela 'Tarih' konulu kitapları listelemek için, bir Query kullanın ve bu Query'i bir DbGrid'e bağlayın. Sonuçlar gridte gözüksün.

Kolay gelsin.
EeCOMP
Üye
Mesajlar: 119
Kayıt: 13 Tem 2003 10:38
Konum: istanbul
İletişim:

Mesaj gönderen EeCOMP »

işin kötü tarafı ben query bilmiyorum bu tablenin bir filtreleme özelliği felan yokmu biri bana olduğunu söylemişti ama nasıl olduğunu söylememişti ben mesela hem bir yazara ait hemde o yazarın sadece hikayelerini listelendiricem yani kişi yazarın adını gircek birde kitap türünü bu ikisi baz alınarak program bir filtreleme yapacak ve sonuçları gösterecek aslında bunu yukarda yazdığım repeat until döngüsüyle çok rahat yaparım mantığı basit ama 1000 kayıt varsa kullanıcı baya bir beklemek sorunda kalıcak ki ben bu programı web tabanlı tasarlıyorum yani internetten kullanım olacak buda kullanıcı için bir işkence olacağı kesin belki bu query ile yapılır ama ben bilmiyorum tablenin böyle bir özelliği varsa çok iyi olur eğer yoksa ve query kullanmak zorunda isem query ile ilgili internette bildiğiniz bir kaynak varsa söylerseniz çok mutlu olurum
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7587
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

SQL işi basit ve çok gerekli/faydalı.

Sitede Veritabanı bölümünde SQL'e Giriş isimli yazıyı birkaç kez oku. Yeterli olacaktır.

Kolay gelsin.
must68
Üye
Mesajlar: 21
Kayıt: 14 Tem 2003 12:28

Mesaj gönderen must68 »

Sonuçları mutlaka Listbox'da göstereceğim dersen.
senin yazdığın koddan daha hızlı çalışan kod aşağıda.
ama bence de sonuçları DbGrid de göstermek en iyisi.

Kod: Tümünü seç

  Table1.Filter := 'YAZAR_ADI='''+Edit1.Text+'''';
  Table1.Filtered := True;
  Table1.First; 
  While Not Table1.EOF do
    Begin
    Listbox1.Items.Add(DbEdit1.Text); 
    Table1.Next; 
    End;
EeCOMP
Üye
Mesajlar: 119
Kayıt: 13 Tem 2003 10:38
Konum: istanbul
İletişim:

Mesaj gönderen EeCOMP »

teşekkürler must 68 verdiğin kod çok işe yaradı o problemim çözüldü ama şimdi bir problemim daha var

şimdi bir yazara ait kitap isimlerini bir listboxda listeliyorum peki bir yazara ait sadece romanları listelesem onu nasıl yapıcam mantıken biri ile filtreleyip çıkan sonuçlar içinde bir filtreleme daha yapılabilir ama ben buna ait bir kod olabileceğini düşünüyorum ben aklıma esti şöyle bir kod denedim


form1.Table1.Filter := 'turu='''+combobox1.text+'''';
form1.Table1.Filter := 'yazar='''+Edit1.Text+'''';


form1.Table1.Filtered := True;
form1.Table1.First;
While Not form1.Table1.EOF do
Begin
Listbox1.Items.Add(form1.DbEdit2.Text);
form1.Table1.Next;
End;

yaptım olmadı bu sekilde iken hep ikinci filteri esas alıyo turunu sona alırsam bu sefer tüm romanları listeliyo ikisini bir kullanarak nasıl filtreleme yapabilirim
must68
Üye
Mesajlar: 21
Kayıt: 14 Tem 2003 12:28

Mesaj gönderen must68 »

o zaman Filterda ve kapısı (and) kullanman gerek.

Kod: Tümünü seç

Table1.Filter := '(YAZAR='''+Edit1.Text+''') and (Turu='''+ComboBox1.Text+''')';
SQL bu isler içindir. İnanki cok basit bir mantigi ve şiir gibi bir dili vardır.
EeCOMP
Üye
Mesajlar: 119
Kayıt: 13 Tem 2003 10:38
Konum: istanbul
İletişim:

Mesaj gönderen EeCOMP »

teşekkürler must68
Cevapla