Forumda arattım bulamadım.
İsme göre arama yaparken Edit1'in Edit1Change'ine şu kodu yazıp istediğim kitabı bulabiliyorum:
KitapSorgulama4.ADOTable1.Filtered:=true;
KitapSorgulama4.ADOTable1.Locate('KitapAdi',Edit1.Text,[ loPartialKey]);
Ancak yazar adına göre arama yaparken yazarın tüm kitaplarının gelmesini istiyorum. Yukardaki kod sadece 1 kaydı kapsıyor ve diğer kayıtların içerisinden seçiyor. Ben sadece yazarın kitapları gelsin istiyorum.
Onu ADOTable ile nasıl yaparım?
Veritabanı Sorgusu
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Veritabanı Sorgusu
Merhaba,
Arama yapınızda sıkıntı görmüyorum. "Yazar Adı" na göre arama yaparak yazarı bulduğunuzda, o yazara ait tüm "Kitap Adı" ların listelenmesini istiyor iseniz; önce bu iki alan arasındaki ilişkiyi (muhtemelen yapmışsınızdır) ve bu iki alanı içeren görüntülemeyi kurmalısınız.
Bunu bir kaç farklı şekilde yapabilirsiniz. Eğer performans (kitap sayısı / yazar sayısı) sorununuz yoksa (ki başlangıçta olmayıp ileride olabilir); tek bir join li sorgu kullanan veri kümesi üstünde, her biri bir alan üzerinde arama yapan birden çok Locate çağrısı kullanabilirsiniz. Örneğin : sorgusunu çalıştıran bir veri kümesi üzerinde, aramaları yapabilirsiniz.
Diğer yandan, sorgusu atadığınız verikümesinin, YazarAdi ve KitapAdi parametrelerine değer atayarak her seferinde sorguyu baştan çalıştırabilirsiniz.
Ya da, sorgusu atadığınız verikümesinin, parametrelerine aşağıdaki gibi değerler atayarak sorguyu yeniden çalıştırabilirsiniz :
Örneğin,
YazarAdi ='Elif%' ve KitapAdi='%' sorgulaması, adı Elif ile başlayan yazarların tüm kitaplarını,
YazarAdi ='Elif%' ve KitapAdi='Baba%' sorgulaması, adı Elif ile başlayan ve Kitap adı 'Baba' ile başlayan tüm yazar-kitap ikililerini,
YazarAdi ='%' ve KitapAdi='%çocuk%' sorgulaması, kitap adında 'çocuk' geçen tüm kitapları (örneğin: 'Çocuk gelişimi', 'Sağlıklı çocuklar yetiştirmek') getirecektir.
Tabii bu son tipte, BÜYÜK/küçük harf duyarlılığı önemli. Örneğin Firebird, like operatöründe BÜYÜK/küçük harf duyarlı arama yapıyor. Bunun çözümü olarak, Yazar Adı ve Kitap Adı alanlarındaki veriyi, kaydetmeden önce büyük harfe çevirebilir ve arama parametrelerini de aramadan önce büyük harfe çevirebilirsiniz. Daha da iyisi, görüntülerken normal görüntülenmesi için Yazar Adı ve Kitap Adı alanlarını olduğu gibi kaydedebilir ve sadece aramalarda kullanmak üzere YazarAdiBuyuk gibi yardımcı bir alanı da insert edebilirsiniz (veya insert trigger ile otomatik kaydedebilirsiniz).
Bir de, aramalarda ve sıralamalarda türkçe harflerin düzgün yerleşimi için, veritabanının charset/collasion ının uygun seçilmesi gerekiyor.
Arama yapınızda sıkıntı görmüyorum. "Yazar Adı" na göre arama yaparak yazarı bulduğunuzda, o yazara ait tüm "Kitap Adı" ların listelenmesini istiyor iseniz; önce bu iki alan arasındaki ilişkiyi (muhtemelen yapmışsınızdır) ve bu iki alanı içeren görüntülemeyi kurmalısınız.
Bunu bir kaç farklı şekilde yapabilirsiniz. Eğer performans (kitap sayısı / yazar sayısı) sorununuz yoksa (ki başlangıçta olmayıp ileride olabilir); tek bir join li sorgu kullanan veri kümesi üstünde, her biri bir alan üzerinde arama yapan birden çok Locate çağrısı kullanabilirsiniz. Örneğin :
Kod: Tümünü seç
select
y.YazarAdi, k.KitapAdi
from yazar y
left join kitap k on y.YazarId=k.YazarId
order by y.YazarAdi, k.KitapAdi
Kod: Tümünü seç
Locate('KitapAdi',Edit1.Text,[ loPartialKey]) ve Locate('YazarAdi',Edit1.Text,[ loPartialKey])
Diğer yandan,
Kod: Tümünü seç
select
y.YazarAdi, k.KitapAdi
from yazar y
left join kitap k on y.YazarId=k.YazarId
where y.YazarAdi=:YazarAdi and k.KitapAdi=:KitapAdi
order by y.YazarAdi, k.KitapAdi
Ya da,
Kod: Tümünü seç
select
y.YazarAdi, k.KitapAdi
from yazar y
left join kitap k on y.YazarId=k.YazarId
where y.YazarAdi like :YazarAdi and k.KitapAdi like :KitapAdi
order by y.YazarAdi, k.KitapAdi
Örneğin,
YazarAdi ='Elif%' ve KitapAdi='%' sorgulaması, adı Elif ile başlayan yazarların tüm kitaplarını,
YazarAdi ='Elif%' ve KitapAdi='Baba%' sorgulaması, adı Elif ile başlayan ve Kitap adı 'Baba' ile başlayan tüm yazar-kitap ikililerini,
YazarAdi ='%' ve KitapAdi='%çocuk%' sorgulaması, kitap adında 'çocuk' geçen tüm kitapları (örneğin: 'Çocuk gelişimi', 'Sağlıklı çocuklar yetiştirmek') getirecektir.
Tabii bu son tipte, BÜYÜK/küçük harf duyarlılığı önemli. Örneğin Firebird, like operatöründe BÜYÜK/küçük harf duyarlı arama yapıyor. Bunun çözümü olarak, Yazar Adı ve Kitap Adı alanlarındaki veriyi, kaydetmeden önce büyük harfe çevirebilir ve arama parametrelerini de aramadan önce büyük harfe çevirebilirsiniz. Daha da iyisi, görüntülerken normal görüntülenmesi için Yazar Adı ve Kitap Adı alanlarını olduğu gibi kaydedebilir ve sadece aramalarda kullanmak üzere YazarAdiBuyuk gibi yardımcı bir alanı da insert edebilirsiniz (veya insert trigger ile otomatik kaydedebilirsiniz).
Bir de, aramalarda ve sıralamalarda türkçe harflerin düzgün yerleşimi için, veritabanının charset/collasion ının uygun seçilmesi gerekiyor.
Ömür Ölmez
-
- Üye
- Mesajlar: 25
- Kayıt: 12 Ara 2013 08:35
Re: Veritabanı Sorgusu
Merhaba hocam, yazdığınız detaylı bilgiler için çok teşekkür ederim. Ancak biraz karışık, anlayamadım. Açıkçası sadece temel SQL komutlarını gördük. Locate komutuyla yaptığım sadece yazarın tek bir kitabını gösteriyor. Ben dbgrid içerisinde diğer kayıtlar gitsin sadece yazarın kitapları kalsın istiyorum. Ve bunu mümkün olduğunca basit bir şekilde yapmam gerek. Program dönem ödevi o yüzden performans vs kaygısı barındırmıyor. Ayrıca sadece SQL kodu değil de edit2.text'in içerisine ne yazacağımı söylerseniz çok iyi olur. Daha fatura yazdırma ve satılan kitapların raporunu admin ekranına gönderip orada gelen raporları liste halinde göstermem gerek(belki raporun üstüne tıklandığında küçük bir form daha açılıp o ayki satılan kitapların listesi toplam fiyatı vs de olacak) ve işin kötü tarafı bunu pazara kadar bitirmem gerekiyor. Nasıl yapıcam hiç bilmiyorum.omurolmez yazdı:Merhaba,
Arama yapınızda sıkıntı görmüyorum. "Yazar Adı" na göre arama yaparak yazarı bulduğunuzda, o yazara ait tüm "Kitap Adı" ların listelenmesini istiyor iseniz; önce bu iki alan arasındaki ilişkiyi (muhtemelen yapmışsınızdır) ve bu iki alanı içeren görüntülemeyi kurmalısınız.
Bunu bir kaç farklı şekilde yapabilirsiniz. Eğer performans (kitap sayısı / yazar sayısı) sorununuz yoksa (ki başlangıçta olmayıp ileride olabilir); tek bir join li sorgu kullanan veri kümesi üstünde, her biri bir alan üzerinde arama yapan birden çok Locate çağrısı kullanabilirsiniz. Örneğin :sorgusunu çalıştıran bir veri kümesi üzerinde,Kod: Tümünü seç
select y.YazarAdi, k.KitapAdi from yazar y left join kitap k on y.YazarId=k.YazarId order by y.YazarAdi, k.KitapAdi
aramaları yapabilirsiniz.Kod: Tümünü seç
Locate('KitapAdi',Edit1.Text,[ loPartialKey]) ve Locate('YazarAdi',Edit1.Text,[ loPartialKey])
Diğer yandan,sorgusu atadığınız verikümesinin, YazarAdi ve KitapAdi parametrelerine değer atayarak her seferinde sorguyu baştan çalıştırabilirsiniz.Kod: Tümünü seç
select y.YazarAdi, k.KitapAdi from yazar y left join kitap k on y.YazarId=k.YazarId where y.YazarAdi=:YazarAdi and k.KitapAdi=:KitapAdi order by y.YazarAdi, k.KitapAdi
Ya da,sorgusu atadığınız verikümesinin, parametrelerine aşağıdaki gibi değerler atayarak sorguyu yeniden çalıştırabilirsiniz :Kod: Tümünü seç
select y.YazarAdi, k.KitapAdi from yazar y left join kitap k on y.YazarId=k.YazarId where y.YazarAdi like :YazarAdi and k.KitapAdi like :KitapAdi order by y.YazarAdi, k.KitapAdi
Örneğin,
YazarAdi ='Elif%' ve KitapAdi='%' sorgulaması, adı Elif ile başlayan yazarların tüm kitaplarını,
YazarAdi ='Elif%' ve KitapAdi='Baba%' sorgulaması, adı Elif ile başlayan ve Kitap adı 'Baba' ile başlayan tüm yazar-kitap ikililerini,
YazarAdi ='%' ve KitapAdi='%çocuk%' sorgulaması, kitap adında 'çocuk' geçen tüm kitapları (örneğin: 'Çocuk gelişimi', 'Sağlıklı çocuklar yetiştirmek') getirecektir.
Tabii bu son tipte, BÜYÜK/küçük harf duyarlılığı önemli. Örneğin Firebird, like operatöründe BÜYÜK/küçük harf duyarlı arama yapıyor. Bunun çözümü olarak, Yazar Adı ve Kitap Adı alanlarındaki veriyi, kaydetmeden önce büyük harfe çevirebilir ve arama parametrelerini de aramadan önce büyük harfe çevirebilirsiniz. Daha da iyisi, görüntülerken normal görüntülenmesi için Yazar Adı ve Kitap Adı alanlarını olduğu gibi kaydedebilir ve sadece aramalarda kullanmak üzere YazarAdiBuyuk gibi yardımcı bir alanı da insert edebilirsiniz (veya insert trigger ile otomatik kaydedebilirsiniz).
Bir de, aramalarda ve sıralamalarda türkçe harflerin düzgün yerleşimi için, veritabanının charset/collasion ının uygun seçilmesi gerekiyor.
-
- Üye
- Mesajlar: 25
- Kayıt: 12 Ara 2013 08:35
Re: Veritabanı Sorgusu
Personel kaydı yaptıktan sonra yeni personelin kullanıcı adını ve şifresini yazıyorum lütfen kullanıcı adınızı kontrol edin hatası veriyor. Ama diğer personelleri silersem ve 1 tane personel kalırsa o zaman personel ekranına giriş yapabiliyor.
Kodlar şöyle:
if ((Edit1.text)='')
and ((Edit2.text)='')
then Application.MessageBox('Lütfen tüm alanları doldurunuz!','Book Shop',MB_OK)
else if (StrToInt(Edit1.text)=ADOTable1.FieldByName('KullaniciAdi').Value)
and (StrToInt(Edit2.text)=ADOTable1.FieldByName('Sifre').Value)
then Personel3.Show
else Application.MessageBox('Lütfen Kullanıcı Adınızı veya Şifrenizi Kontrol Edin!','Book Shop',MB_OK);
Nerede hata var acaba?
Kodlar şöyle:
if ((Edit1.text)='')
and ((Edit2.text)='')
then Application.MessageBox('Lütfen tüm alanları doldurunuz!','Book Shop',MB_OK)
else if (StrToInt(Edit1.text)=ADOTable1.FieldByName('KullaniciAdi').Value)
and (StrToInt(Edit2.text)=ADOTable1.FieldByName('Sifre').Value)
then Personel3.Show
else Application.MessageBox('Lütfen Kullanıcı Adınızı veya Şifrenizi Kontrol Edin!','Book Shop',MB_OK);
Nerede hata var acaba?