Ms-Sql Tablo ilişkilendirme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
doktoraltun
Üye
Mesajlar: 73
Kayıt: 06 Oca 2012 06:56

Ms-Sql Tablo ilişkilendirme

Mesaj gönderen doktoraltun »

Selamün Aleyküm arkadaşlar bir ricam olacaktı yardımcı olabilirmisiniz ?

Ms-Sql ile 2 tablom var bunları ilişkilendirmek istiyorum ama algoritma kuramadım bir türlü, şekil olarak çizdim yardımcı olursanız çok sevinirim.

Resim
resimdeki bilgileri aşağıdaki şekile göre ilişkilendirmek istiyorum ama başaramadım.
Resim

şimdiden teşekkür ediyorum.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Ms-Sql Tablo ilişkilendirme

Mesaj gönderen Lord_Ares »

master detail form oluşturabilir bu iki alnı bir birine bağlayabilirsin. fakat kendim yapacağım dersen de şöyle yapabilirsin.
isimler ve özellikler adında iki veritabanın var diyelim.
isimler vertibanı
idno: autoincrement; // burada otomatik artan bir değişken tanımlarsın
adı: string;

özellikler veritabanı
idno: integer; //burada da integer bir değişken
özelliği:string;


bilgi kaydederken,
isimler.append;
//burada idno otomatik artacağı için bişey yapmana gerek yok
adı.asstring:=edit1.text;

özellikler.append;
özellikler.idno.asinteger:=isimler.idno.asinteger; // özellikler tablosundaki idno alanı , isimler tablosundaki idnoya eşittir dedik.
özelikler.özellği.asstring:=edit2.text;
isimler.refresh;
özellikler.refresh

dbgrid te birkayıt seçildiğinde ( yani dbgrid oncellcilick kısmına da ) özellikler tablosunu , isimler tablosundaki idnoya göre filtreleme yaparsın istediğin olur.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Ms-Sql Tablo ilişkilendirme

Mesaj gönderen thelvaci »

Lord_Ares arkadaşımızın yazdığına ilave olarak; kişiler ve özellikler için birer tablo tanımlamanız yanında; bir de kişi-özellik tablosu tanımlamanız faydalı olacaktır. Çünkü bir kişiye birden fazla özellik bağlamak isteyebilirsiniz. Bu tabloda; ID int (aoutoincrement), KisiID int ve OzellikID int alanlarının varlığı yeterli olacaktır sizin için. Tabii bu tabloda KisiID + OzellikID alanlarının ikisi birden unique index olarak belirtilmelidir.

Kod: Tümünü seç

  SELECT ...
  FROM KisiOzellik KO
    INNER JOIN Kisi K ON K.ID = KO.KisiID
    INNER JOIN Ozellik O ON O.ID = KO.OzellikID
gibi de kullanabilirsiniz.
doktoraltun
Üye
Mesajlar: 73
Kayıt: 06 Oca 2012 06:56

Re: Ms-Sql Tablo ilişkilendirme

Mesaj gönderen doktoraltun »

Lord_Ares Kardeşim anlattığınız şekilde yaparsam eğer aynı özelliği iki kişiye atayabilmem mümkün olurmu bire bir id noyu eşitlersek aynı özellik ali de ve ahmette varsa ne olacak ozaman.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Ms-Sql Tablo ilişkilendirme

Mesaj gönderen Lord_Ares »

şuan sorduğun sorunun cevabını thelvaci hocam yanıtında verdi aslında. Tablo ilişkilendirme olarak aratırsan sana master detail form nasıl hazırlanır hakkında bir çok yol çıkacaktır. Ben sana manuel olarak, master detail değilde kendin kod ile nasıl yapılacağını göstermek istedim. Master detail form oluşturarak bu işlemi daha kolay yapabileceğini unutma.
Aynı özelliği bu şekilde her iki kişiyede atayabilirsin sorun olmaz çünkü her iki kişide de şöyle görünecektir
ADI= ahmet Kısıno=1 Ozellikno:1 Ozellik_Adı=ev ADI= ahmet Kısıno=2 Ozellikno:1 Ozellik_Adı=ev
yani isimler ve özellik noları aynı fakat birbirinden ayırt eden kişi nosu dikkat ettiysen birinin kişi nosu 1 diğerinin 2 bu yüzden sen 2 nolu ahmete tıkladığında program kişi nosu 2 olan ahmetin özelliklerini getirecektir.

Senaryomuz şöyle.
1)isimleri tutan bir veritabanımız.
2)özellikleri tutan bir veritabanımız ( ev, araba,dükkan vs gibi)
3)kişiye ait özellikleri tutan bir veritabanımız ( ahmete ait olan ev,araba vs gibi)

ISIMLER DATAMIZ
KISI_NO : AUTOINCREMENT VE PRY KEY ATANMIŞ DURUMDA ( YANI BENZERSİZ ANLAMINA GELEN *)
KISI_ADI : STRING;
OZELLIKLER DATAMIZ
OZELLIK_NO : AUTOINCREMENT VE PRY KEY ATANMIŞ DURUMDA ( YANI BENZERSİZ ANLAMINA GELEN *)
OZELLIK_ADI :STRING;

KISIYE AIT ÖZELLİKLER DATAMIZ( HER YENI KAYIT GİRDİĞINDE BU KİŞİYE AİT ÖZELLİKLERİ TUTACAK DATAMIZ)
KISI_NO :INTEGER;
OZELLIK_NO :INTEGER;
OZELLIK_ADI :STRING;

yapacağımız işlemler şöyle;
1) ozellikler datamızda daha önceden girilmiş ( ev, araba, dükkan gibi) kayıtlarımız olmalı. yeni kayıt girerken bir combobox sayesinde kişiye seçtirerek girmek daha mantıklı olur. Böylece aynı isimde bir çok özellik girilmesini engellemiş oluruz. Dilersen bunu sen farklı bir yol ile de yapabilirsin.
kayıt eklerken iki datamızı kulllanacağız. ISIMLER ve KISI_OZELLIK datalarımızı

TISIMLER.Append;
TISIMLERADI.AsString:=Edit1.Text; // ısımler datasına ismi ekledik
TISIMLER.Refresh;

TKISI_OZELLIK.Append; // kısı özelliklerini tuttuğumuz dataya da o kişiye ait olan özellikleri ekliyoruz
TKISI_OZELLIKKISI_NO.AsInteger := TISIMLERKISI_NO.AsInteger; // isimler datsındaki kışı_no yu buraya ekle dedik ( böylece her kişiye benzersiz bir rakam atadık ki ismi ahmet olan kişileri birbirinden ayırmış olalım)
TKISI_OZELLIKOZELLIK_NO.AsInteger := TOZELLIKLEROZELLIK_NO.AsInteger; // ozellik datanda adı ev olan özelliğin özellik nosunu buraya atadık( böylece her özelliğe benzersiz bir rakam atayarak birbirinle karışmasını engelledik)
TKISI_OZELLIKOZELLIK_ADI.AsString := TOZELLIKLEROZELLIK_ADI.AsString;// özelliğin adını özellikler datasından çekerek kişi özellikadı alanına ekledik
TKISI_OZELLIK.Refresh;

3)db giridten bir kayıt seçilince ona ait kayıtları filitreleme;
dikkat ettiysen ısımler ve özellikler datasında benzersiz olarak tanımladığımız ve otomatik olarak artan alanlar vardı ( ısımler datasında KISI_NO ve ozellikler datasında OZELLIK_NO)
Bu alanların önemi burada ortaya çıkacak. Kayıt filitrelerken adı ahmet olan bir çok kişi olabilir. Fakat adı ahmet ve kişi nosu 1 olan tek kayıt olur. Çünkü biz yeni bir isim girerken dataya dedik ki, kışınoyu bir arttır. ikinci bir ahmet girmeye kalktığında adı ahmet fakat kışınosu 2 olacaktır.

şimdi adı isimler datasına girdik adı: ahmet oldu, kişinosu 1 oldu. Biz bunu kişiye ait özellikler datasına eklerken diyoruz ki,
kişi özelliklerdeki kişino=isimler tablosundaki kişi noya.
Böylece kişi özellikleri tablonda her kişiye ait bir kişino elde etmiş oluyorsun. Filtrelerken yapman gereken tek şey , kişi nosu bu olan özellikleri göster demek oluyor. Onuda dbgrid in oncellcilck olayında yapıyoruz.

Sana ekte basit bir örnek gönderiyorum incelersen daha rahat anlarsın. Takıldığın yer olursa elimden geldiğince yardımcı olmaya çalışırım.
Dosya ekleri
ORNEK.rar
(14.54 KiB) 97 kere indirildi
varyemez
Üye
Mesajlar: 262
Kayıt: 01 Oca 2009 11:00
Konum: Bursa
İletişim:

Re: Ms-Sql Tablo ilişkilendirme

Mesaj gönderen varyemez »

Çok fazla özellik kullanmayacaksan binary sistem gibi bir şey yapabilirsin. her özelliğe 1-0 değerleri atanıp sonuçta desimale çevirebilr ve bu rakamı şahsın karşısına yazabilirsin.

01110110 gibi bir değer 8 özelliğin var/yok oluğunu belirler. hepsi 1 olursa 256 rakamını elde edersin
doktoraltun
Üye
Mesajlar: 73
Kayıt: 06 Oca 2012 06:56

Re: Ms-Sql Tablo ilişkilendirme

Mesaj gönderen doktoraltun »

Çok teşekkür ediyorum sonunda başarabildim

dbgridin oncellclick olayına şunları yazdım

Kod: Tümünü seç

with Adoquery4 do
begin
Close;
SQL.Text:='select * from tbl_sonuc where tani_adi=:xx';
parameters.parambyname('xx').value:=dbedit6.text;
open;
end;
oldu sonunda :)
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Ms-Sql Tablo ilişkilendirme

Mesaj gönderen Lord_Ares »

bu kod ile dbedit6 ismindeki editin içindeki bilgiyi ilgili datanda arar. dbedit6 boş ise arama yapmaz bilgin olsun. edit boş olduğunda dönen bilgide boş olur, bu yüzden basit bir if döngüsü ile edit boş olup olmadığnı kontrol etmende yarar var :)))
Sana bahsettiğim master detail ile yapsan daha sağlıklı olurdu. Yinede istediğin olduysa sorun yok.
http://dokumanistan.blogspot.com/2011/0 ... rerek.html
Cevapla