Veritabanı Sorgusu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
darrenjones
Üye
Mesajlar: 25
Kayıt: 12 Ara 2013 08:35

Veritabanı Sorgusu

Mesaj gönderen darrenjones »

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?
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: Veritabanı Sorgusu

Mesaj gönderen omurolmez »

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 :

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
sorgusunu çalıştıran bir veri kümesi üzerinde,

Kod: Tümünü seç

Locate('KitapAdi',Edit1.Text,[ loPartialKey]) ve Locate('YazarAdi',Edit1.Text,[ loPartialKey])
aramaları yapabilirsiniz.

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
sorgusu atadığınız verikümesinin, YazarAdi ve KitapAdi parametrelerine değer atayarak her seferinde sorguyu baştan çalıştırabilirsiniz.

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
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.
Ömür Ölmez
darrenjones
Üye
Mesajlar: 25
Kayıt: 12 Ara 2013 08:35

Re: Veritabanı Sorgusu

Mesaj gönderen darrenjones »

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 :

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
sorgusunu çalıştıran bir veri kümesi üzerinde,

Kod: Tümünü seç

Locate('KitapAdi',Edit1.Text,[ loPartialKey]) ve Locate('YazarAdi',Edit1.Text,[ loPartialKey])
aramaları yapabilirsiniz.

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
sorgusu atadığınız verikümesinin, YazarAdi ve KitapAdi parametrelerine değer atayarak her seferinde sorguyu baştan çalıştırabilirsiniz.

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
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.
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.
darrenjones
Üye
Mesajlar: 25
Kayıt: 12 Ara 2013 08:35

Re: Veritabanı Sorgusu

Mesaj gönderen darrenjones »

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