Kayıtları en uygun filtreleme yöntemi nedir
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Kayıtları en uygun filtreleme yöntemi nedir
İ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
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
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
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...
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;
Kolay gelsin...
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
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.
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;
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
ş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
o zaman Filterda ve kapısı (and) kullanman gerek.
SQL bu isler içindir. İnanki cok basit bir mantigi ve şiir gibi bir dili vardır.
Kod: Tümünü seç
Table1.Filter := '(YAZAR='''+Edit1.Text+''') and (Turu='''+ComboBox1.Text+''')';