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.
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.
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.
ş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.
Ç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
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