interbasede master-detail ilişki

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

interbasede master-detail ilişki

Mesaj gönderen unalaygun »

bu konuda forumu araştırdım ama inanın bulamadım

tek tablodaki işlemlerde sorun yok ve makaleden okuduğum gibi yaptım sorun yok..

şu bileşenleri kullanıyorum tek tabloda
transaction1
dataset1
datyabase1
datasource1

1.tablodaki alanlarım
idno(autoincrement)not null
adi(char)
adresi(char)



Ama 2.tabloyu oluştururken
no
idno
sehir
telefon

transaction2
dataset2
database2
datasource2


bole bir yapı yaptıktan sonra neler yapmam gerekli lutfen birisi detaylı anlatabilirmi tşkür ederim çok aradım ama bulamadım inanın
kolay gelsin slmlar.
derviş
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

hocam bu konuyu bulamadım dersen ayıp edersin. Master detail diye arattır, bir sürü konusu geçti bunun.

Kolay gelsin.
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

Mesaj gönderen unalaygun »

mustafa abi dediğin gibi arattım bir sürüde kaynak çıktı haklıymışssın ama bir sorunla karşılaştım verileri ibexpert ile girip delpide gride tıklayınca masterdaki kayıta bağlı olarak detaile gidiyor ama kesinlikle detaile delphide yaptığım arayüzden bir şey giremiyorum ve silemiyorum sanki readonly açıyor anlayamadım sorunu mustafa abi ve surdaki bilgilerin aynısını yapmaya çalıştım neden olabilir acaba kolay gelsin...
Merhabalar,
Öncelikle database ile ilgili componentlerini (IBdatabase, IbDataset vs) koymak için datamodule kullanmanız işleri kolaylaştırır.
Eğer interbase/firebird kullanıyorsanız. Aşagıda yazdıklarım işinize yarar.
masterTable
MasterIdAlan-->integer, Pk (primary) not null
DigerAlanlar
DetailTable
DetailId-->ınteger, Pk not Null (bu alan şart değil)
MasrerIdAlan-->integer Fk (foreign Key) not Null (bu alanla Detail table master table a bağlanacak)
Detail Table a aşağıdaki kodu ekle.
Kod:

ALTER TABLE detailTable ADD CONSTRAINT FK_DetailTable FOREIGN KEY (MasterIdAlan) REFERENCES MasterTable (MasterIdAlan);


Buna benzer iki table oluştur ve diğer alanları ekle.
IbDetail dataset in select ine
Kod:

select * from DetailTable where masterIdAlan=:MasterIdAlan


yazın.
IbDetail dataset in after insert ine

Kod:

IBDetailMasterIdAlan.AsInteger:=IBMasterTableMasterIdAlan.AsInteger;


yazın.
Son olarak
IbDetailTable---->DataSource:=MasterTableDataSource
özelliğini ayarlayın.
Master Detail ilişkiniz hazır durumdadır.
Kolay gelsin
derviş
ProgMan
Üye
Mesajlar: 16
Kayıt: 23 Tem 2004 05:18
Konum: İzmir

Mesaj gönderen ProgMan »

kardeş sen nasıl bir veri tabanı dosyasıyla ilişki kurmaya çalışıyosun ya.
2 tane database koymanın sebebi tabloları farklı gdb lerde tutman mı yoksa işi garantiye almak için mi anlayamadım :) bunu belirtirsen sevinecem
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

Mesaj gönderen unalaygun »

abisi valla ilkdefa interbase ile çalışcam bu yüzden hangi bileşenlerden kaçtane kullancamı bilmiyorum yani bir databaseim var ve 2 tablom var bunlarla master detail ilişki kurcam hangi bileşenlerden kaç tane kullanmam gerekli bilmiyorum dogrusu daha once paradox kullanıyordum interbase ilk defa kullanıyorum yani kardeş anlıycan safız ogrenmeye çalışıyoz yardımlarınızı bekliyoruz saol tşkler...
derviş
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Sitede veritabanı bölümündeki IBX makalesini oku.

Kolay gelsin.
ProgMan
Üye
Mesajlar: 16
Kayıt: 23 Tem 2004 05:18
Konum: İzmir

Mesaj gönderen ProgMan »

abi bence IB nin delphi deki örnelerini bir incele istersen
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

Mesaj gönderen unalaygun »

abilerim mustafa abinin dediği makaleyi okudum ama ben sorunumu şu şekilde hallettim
2 adet ibdatabase
2 adet dataset
2 adet datasource
2 adet transaction
ve master-detail ilişkiyi kurdum ve hatta master dan silince detailden silme olayını da okumuştum cascade yontemile başardık neyse ama
kafama talıkdı şimdi benim durumumumsole abiler 1 adet veritabanım 2 adet de tablom var şimdi ben fazla bileşen mi kullanıyorum ....


asıl şekli nedir bunun kafamda kocaman bir ? işareti var benim su an......
beni bu konuda aydınlatırsanız çok sevinirim teşekürler yardım için.....

bence IB nin delphi deki örnelerini bir incele derken delphinin helpinde falanmı var yokssa başka bir yerdemi yerini belirtirsen çok sevinirim kolay gelsin tekrar...
derviş
andronoid
Üye
Mesajlar: 35
Kayıt: 26 Tem 2004 06:44

Mesaj gönderen andronoid »

Ben şöyle yapıyorum;

IBExpert`te;

Bir veritabanı ve içine tabloları, triggerleri, sp`leri oluşturuyorum. Eğer master-detail bir tablo yapısı oluşturacaksam;
detail tabloda bir Foreign Key tanımlıyorum. Update Rule ve Detail Rule özellikleri var. Eğer master tablodaki Pkey`li alan güncellendiğinde detail tablodaki aynı veriler`in güncellenmesini istersem Update Rule seçeneğini Cascade yapıyorum. Aynı şekilde Master tablodan bir kayıt silindiğinde detail tablodan da ilgili kayıtların silinmesini istersem Delete Rule özelliğini de Cascade yapıyorum. Master-detail yapısını triggerler aracılığla veri tabanında kendimiz de kod yazarak oluşturabiliriz. Bu konuda makaleler kısmında Fahrettin Bey`in güzel bir makalesi var.


Delphi`den ise;


Bir tane datamodule ekliyorum. İçine;
1 tane IBDataBase, 1 tane IBTransaction, 2 adet IBDataSet (Master-Detail için.)

IBDataBase`in ve IBTransaction`unda gerekli ayarlarını yaptıktan sonra;

IBMasterDataSet`in ayarları;
DataBase=IBDataBase1
SelectSql=Select * from MasterTabloAdı

Bundan sonra IBMasterDataSet`in üzerinde sağ tıkla/DataSet Editör.
Burada PKey alanını seçtikten sonra Generate Sql komutunu verirsek IBMasterDataset için deletesql, modifysql vs. kodları otomatik olarak oluşturulacak.


IBDetailDataSet`in ayarları

DataBase=IBDataBase1
SelectSql=Select * from DetailTabloAdı

Diğer ayarlar IBMasterDataSet`in ayarları ile aynı.

Bunları yaparsak master-detail ilişkisini tamamlamış oluruz. Fakat master tablodan bir kayıt seçtiğimizde Detail tabloda ilgili kayıtlar gösterilmez. Çünkü biz IBDetailDataSet`in SelectSql`ine: Select * from DetailTabloAdı kodunu girmiştik. Ama veritabanından ayarladığımız FKEY veya triggerler ile master-detail ilişkisi çalışacaktır.

Eğer master tablodan bir kayıt seçtiğimizde detail tablodan ilgili kayıtların gösterilmesini istersek;

IBDetailDataSet`in DataSource özelliğine (Object Inspector/Properties`de) IBMasterDataSet`in DataSource`ünü seçeriz.

Bundan sonra IBDetailDataSet`in SelectSql`ini şu şekilde değiştiririz;

Select * from DetailTabloAdı where DetailMasterTabloID=:MasterMasterID
(Select * from DetailTabloAdı where numara=:numara gibi)


DetailMasterTabloID ve MasterMasterID ilişkilendirilecek alanlar...

Bundan sonra diğer ayarlar aynı.

Sizin yazdıklarını kabaca göz attım. Bence iki tane IBDataBase`e gerek yok. (Eğer tablolar tek DataBase içindeyse).

Zaten forumda da bu konular daha önceden de konuşulmuş. Umarım diğer arkadaşlara ayıp olmamıştır ve yazdıklarımda yanlışlık yoktur..
Herkese iyi çalışmalar... Kolay Gelsin...
Cevapla