interbasede master-detail ilişki
interbasede master-detail ilişki
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.
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ş
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
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ş
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ş
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...
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ş
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...
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...