sql de joinle seçim yapmak ve dbgridle like gibi arama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
selman
Üye
Mesajlar: 664
Kayıt: 04 Ara 2003 12:06
Konum: İzmir

sql de joinle seçim yapmak ve dbgridle like gibi arama

Mesaj gönderen selman »

Selam
Öncelikle daha önceden bu tarz bir soru sormuştum fakat sornumu tam olarak çözemedim.yapamadığım olay şöyledi...

Şimdi benim 4.ad tablom var Bunlar:
1.Firmalar
2.Listeler
3.Renkler
4.Firma İşlemleri
Firmalar:master tablom
listeler: detay tablom
Renkler: detaya bağlı child tablom
Firma İşlemleri :buda detaya bağlı child tablom

Ben bir tane Firma tanımı yapıyorum .Ve o Firma tanımı ile ilgili işlemleride
şu şekilde yapıyorum.Öncelikle Firma tanımı yapıldı. Ve daha sonra o firmaya ait liste veya o firmaya ait listelerin tanımı yapılıyor...

Olayın daha net anlaşılabilmesi için şöyle söyliyim.Firma kodu:=1 ve bu firma kodunda diyelim 3.ad de liste tanımı yapmışız.ve her bir liste tanımımdada ayrı ayrı firma işlemleri ve renkler seçimi tablosu var..
yani diyelim ki liste1 in firma işlemleri ve renkleri farklı liste2 nin farklı....


firma işlemleri bölümünde kalite ,ürün,alı fiyatı,satış fiyatı gibi alanlar var..
ürün manuel girilemiyorYani şu şekilde
firma kodu:=VSB
kalite:=100
liste1:=1
Ürün:=VSB-100-1
şeklinde oluyor.
şimdi bu rası firma bölümü ile ilgili işlemler.

Birde sipariş bölümüm var.ordada ürün,renk,miktar,fiyat gibi alanlarım var..
birde baştan gerçi unuttum yazmayıda listelerim aktif ve pasif olabiliyor
eğer listem aktif ise ben oluşturduğum ürünleri görebiliyorum.değilse dbgridde göremiyorum...Ve ürünlerde dbgridde gösteriliyor

Adam geliyor siparişler bölümünde de
ürün,renk,sipariş,fiyat gibi... dbgrid alanları var.
Ben Ürün hanesinde entara bastığımda Ürünlerin bulunduğu dbgrid ekrana geliyor.
Ve adam ürün diyelim

VSB-1-100 seçti.yani VSB ürününden ve liste 1 inde bulunan renkleri gösttersin başka bir dbgridde.yapmak istediğim olay bu .Herkese iyi çalışmalar.
Kullanıcı avatarı
selman
Üye
Mesajlar: 664
Kayıt: 04 Ara 2003 12:06
Konum: İzmir

Mesaj gönderen selman »

selam
Sorunumun cevabını hala bulabilmiş değilim.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2384
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Sorunu tam anlamdım açıkçası, fikir vermek için şunları diyebilirim. Kullandığın her tabel a ID integer ve PRKey tanımla mutlaka, aralardı bağlantıları bununla yap.
Firma Table:
ID, Firma adı

Renk Table:
ID Renk adı

Kalite Table:
ID Kalite türü

Firmaya ait bilgileride mesela

Firma Ürünleri:
ID Integer, Renk_ID Integer, Kalite_ID integer.....

Renk_ID Renk Table a (foreingkey ile bağlamak mantıklıdır genelde)
Kalite_ID Kalite table ına bağlı

sonuç istediğindede joinlerle istediğin sonucu çekebilirsin. Where kullanarakta filtremeleri yaparsan hem hız hemde hata olasılıklarını azaltmış olursun

fikir vermiştir umarım

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
selman
Üye
Mesajlar: 664
Kayıt: 04 Ara 2003 12:06
Konum: İzmir

Mesaj gönderen selman »

Öncelikle freeman35 abi cevabınız ve fikriniz için çok tşkederim.Gerçekten güzel bir düşünce bende zaten sizin söylediğiniz şekilde yaptım fakat benim sorunum 3 tablodan veri çekmem olayı biraz
zorlaştırıyor.
Şöyleki
ürünleri şu şekilde çekiyorum

Kod: Tümünü seç

select  DISTINCT fdurum.durum,fis.urun,fis.alis,fis.seri
from fdurum join fis on fis.did=fdurum.id where fdurum.durum='Aktif'
 
ve bu çektiğim ürünleride bir dbgridde göstermekteyim.
ve bu dbgridde
mesela
Ürünlerim şöyle oldu

Örnek:
VSB-1-100
RSN-2-200
VSB-1-300
YMN-3-500
şeklinde ürünlerim şu anda gösteriliyor
buraya kadar tmm
sonra
ben bu ürünleri seçtiğim dbgrid yani bu dbgridden

VSB-1-100 üzerindeyim .ve entera bastığımda VSB-1-100 de ki 1 sayısını çekecek yani burdaki 1 liste nin 1.liste olduğunu gösteryior.Ve liste 1 e ait
renkler gelecek ekrana eğer ortadaki sayı 2 ise liste 2 ye ait renkelr gelcek.Kolay gelsin
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2384
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

fdurum.durum='Aktif'
bu şekilde kullanımı ben tercih etmiyorum Sebei string ifsdeler değişkendir. büyük küçük hasrf fark eder, onun yerine integer kullanıp ayrı bir table da bu iadeleri kullanmak çok daha kullanışlı. Sadece aktif pasif şeklinde bile olsa case kullanıp dışarıya çıkacak değeri elle yazmayı tercih ederim.

bir diğer noktada FB yada IB kullanıyorsan tüm SQL i kesinlikle büyük harfle yazman. Tam nedenini hatırlamıyorum ama fb ekibi eskiden bunu önermişlerdi.

Son yazdığından anladığımsa şu
VSB-1-100 üzerindeyim .ve entera bastığımda VSB-1-100 de ki 1 sayısını çekecek yani burdaki 1 liste nin 1.liste olduğunu gösteryior.
sen yazmışsın zaten, ilk verdiğim mantığa bak.
Renk Table:
ID Integer ve PRKEY, Renk adı varchar
yapman gereken lookup larla yada artık sana kalmış, rengi temsil eden ID yi yani prkey i kaydetmen. Bu sayede join yada lookup larla kayıtlı olan rengin ID sine ulaşıp kullanıcıya rengin adını göstericeksin

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
selman
Üye
Mesajlar: 664
Kayıt: 04 Ara 2003 12:06
Konum: İzmir

Mesaj gönderen selman »

selam
freeman35 abi vermiş olduğunuz açıklayıcı fikirler için ayrıca tşkederim.
Sizin fikirlerinizi dikkat alıcam .Haklısınız ben şimdi buraya kadarda hallettimde

Kod: Tümünü seç

select  DISTINCT fdurum.durum,fis.urun,fis.alis,fis.seri, lrenk.renk
from fdurum,lrenk
inner join fis on (fis.did=fdurum.id) 
 join lrenk  on (lrenk.did=fdurum.id) 
where fdurum.durum='Aktif'
and fis.urun Like '%-1-%'

buraya kadar gelebildim ve bu yazdığım sql sorunsuz çalışıyor.Ve burda
liste 1 e ait renkelri çekebiliyorum fakat liste 1 değilde 2 olunca veya 3 olunca nasıl yapmam gerekir.Bu sql ibquerynin sqline yazıldı.Kolay gelsin.İyi çalışmalar.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2384
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Kod: Tümünü seç

select  DISTINCT fdurum.durum,fis.urun,fis.alis,fis.seri, lrenk.renk
from fdurum,lrenk
inner join fis on (fis.did=fdurum.id)
 join lrenk  on (lrenk.did=fdurum.id)
where fdurum.durum='Aktif'
and fis.urun Like '%-1-%' 
%-1-% buraya yğunlaşmangerekiyor. sıkıntın bunu string olarak sakladığından kaynaklanıyor yukarıda yazdıklarım gibi bir mantık kursaydın, like yerine where kullanıcaktın ve where e de parapetre göndermek çok kolay olacaktı. Senin kullandığın kod görede aklıma gelen bu SQL cümlesini her seferinde tekrar oluşturmaktan başka bir şey gelmiyor.

Kod: Tümünü seç

const = TMP_SQL = '
select  DISTINCT fdurum.durum,fis.urun,fis.alis,fis.seri, lrenk.renk
from fdurum,lrenk
inner join fis on (fis.did=fdurum.id)
 join lrenk  on (lrenk.did=fdurum.id)
where fdurum.durum='Aktif'
and fis.urun Like '%-%d-%' ';
.........
.........
var ID Integer;
..........
.........
ID := 2;//Yada her ne renk olacaksa
xQuery.SQL.Clear;
xQuery.SQL.Text := Format(TMP_SQL, [ID]);
.............

sanırım %d için format diğer % işaretlerinden su koyvermez, eğer olmazsa string ekleyerek yapılabilinir

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
selman
Üye
Mesajlar: 664
Kayıt: 04 Ara 2003 12:06
Konum: İzmir

Mesaj gönderen selman »

selamunaleykum

Öncelikle freeamen35 abi size çok çok tşkederim.Gerçekten bilginiz ışığında aydınlattığınız için.

Ve adnan abi sanada ayrıca tşkederim.Benim sorunumu çözmeme vesile oldunuz.Bilmem şu anda duygularımı nasıl anlatsam.Gerçekten Çok sağolun abi.Allah ne muradınız varsa versin.Şu anda gayet rahat bir nefes aldım gerçekten.Şu andaki duyuglarımı nasıl anlatcağımıda bilemiyorum.her şey için sağolun varolun....
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Selamlar.
Bu tür sql işlemleri için genelde dinamik sorgu oluşturmak çoğu zaman çözüm sağlayacaktır.Yapmanız gereken parametreleri ya da şartları uygun biçimde sql cümlesine monte etmek.Ben datasetler haricinde (istisnai durumlar hariç..) sorguların genelini dinamik oluşturuyorum ve gayet stabil çalışıyor.

Kolay gele..
Cevapla