master detail aynı anda kayıt eklemek

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

master detail aynı anda kayıt eklemek

Mesaj gönderen Abrak »

selam Arkadaşlar;
master/detail tablom var projeye dbgrid ekledim gerekli bağlantıları yaptım ilk önce mastere bilgiler girip kaydedip daha sonra detaile veri girip kaydettiğimde sorun yok gerekli triggerlerle kendi otomatik bağlantıyı kuruyor fakat ben şunu yapmak istiyorum
yeni kayıt dediğimde master ve detaile yeni kayıt açarak her iki alanıda doldurduktan sonra tek tuşla kayıt dediğimde master/detail sistemini bozmadan kaydetsin bunu normal editlerle arka planda yapabiliriz ama benim istediğim DB componentleriyle yapmak istediğimde forgkeyn hatası veriyor nasıl yapabilirim bu olayı biliyorum biraz karmaşık anlattım ama sorularınızla sadeleşir sanırım
şimdiden teşekkürler
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
sorun master tablodaki id alanının yeni kayıt dediğinizide henüz verilmemiş olması dolayısı ile detay tabloya verilecek değeri bilememesi.
çözüm olarak bir öneri.
master tablo olarak ibdataset kullan.
ibdatasetin generatorfields parametrelerinde onnewrecord u seç.
böylelikle insert dediğin zaman pkey alan değerini alacak detay tabloda bu alanı görüp kendisine otomatik olarak alacaktır.
(eğer otomatik almazsa elle atama yaparsın.)
koaly gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

aslangeri yazdı:s.a.
sorun master tablodaki id alanının yeni kayıt dediğinizide henüz verilmemiş olması dolayısı ile detay tabloya verilecek değeri bilememesi.
çözüm olarak bir öneri.
master tablo olarak ibdataset kullan.
ibdatasetin generatorfields parametrelerinde onnewrecord u seç.
böylelikle insert dediğin zaman pkey alan değerini alacak detay tabloda bu alanı görüp kendisine otomatik olarak alacaktır.
(eğer otomatik almazsa elle atama yaparsın.)
koaly gelsin.
evet o şekilde yapıyorum dediğiniz gibi otomatik alıyor o kısımda sıkıntı yok ama söylediğim gibi ilk önce masteri girip kaydetip daha sonra detaili girdiğimde herşey otomatik hallediyor,
ben her iki tablodada gerekli bilgileri girdiğimde kaydet dediğimde forgieyn hatası veriyor
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

master dataset ve detay dataset için tek Transaction kullan.
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

kadirkurtoglu yazdı:master dataset ve detay dataset için tek Transaction kullan.
tek Transaction kullanıyorum sorunla ilgili ufakbir proje gönderebilirim
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Syn Abrak bende aynı dert ten muzdaribim.Master a kayıt girileceği durumda datail e girilecek kayıt butonunun enabled özellliğini false yapıyorum bu şekilde master kaydının kayıt girişi bitmeden datail kayıt girdirmeyi engelliyorum.Umarım bunun daha pratik bir yolu vardır. :!:
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

haydarxxx yazdı:Syn Abrak bende aynı dert ten muzdaribim.Master a kayıt girileceği durumda datail e girilecek kayıt butonunun enabled özellliğini false yapıyorum bu şekilde master kaydının kayıt girişi bitmeden datail kayıt girdirmeyi engelliyorum.Umarım bunun daha pratik bir yolu vardır. :!:
iyi sende öyle bir durum var gene bende proje kullanımı açısından o şekilde bir altarnetifimde yok mesela kullanıcı sende masteri girdi diyelim detaile geçti sonra vaz geçme şansı yok çünkü sen masteri kaydetmiş oluyorsun vardır mutlaka bir yolu inşallah öğreneceğiz
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

ben Foreign Key kullanmıyorum. master kayıt silindiğinde detay kayıtları silmek için sp yazıyorum.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

kadirkurtoglu yazdı:ben Foreign Key kullanmıyorum. master kayıt silindiğinde detay kayıtları silmek için sp yazıyorum.
sp'leri trigger'dan tetiklemiyorsan kontrol yine DB'de değil sen de oluyor. Bir yerden patlar...
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

mussimsek yazdı:
kadirkurtoglu yazdı:ben Foreign Key kullanmıyorum. master kayıt silindiğinde detay kayıtları silmek için sp yazıyorum.
sp'leri trigger'dan tetiklemiyorsan kontrol yine DB'de değil sen de oluyor. Bir yerden patlar...
baktım son mesaj mustafa beyden tamamdır geldi çözüm diye bir anda panik yapmıştım :D
saygılar
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

mussimsek yazdı:
kadirkurtoglu yazdı:ben Foreign Key kullanmıyorum. master kayıt silindiğinde detay kayıtları silmek için sp yazıyorum.
sp'leri trigger'dan tetiklemiyorsan kontrol yine DB'de değil sen de oluyor. Bir yerden patlar...
elbette trigger den tetiklenerek çalıştırıyorum.

sp

Kod: Tümünü seç

Create procedure detay_sil(masterid integer)
as
begin
  delete from hareket
  where masterid =:masterid;
end
trigger

Kod: Tümünü seç

CREATE TRIGGER DETAY_DEL FOR MASTER
ACTIVE BEFORE DELETE POSITION 0
AS
begin
  execute procedure detay_sil(old.masterid);
end
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

merhaba,

bilmiyorum sorun çözüldü mü ama aklıma şu geldi belki yanlıştır. kaydet butonuna bastığın anda ilk önce master tablo kaydetsin arada bir kum saati gibi bir zaman geçirecek işlem koyup daha sonra detail tabloyu kaydetmesini sağlayabilirsin. tek button ile olacaksa tabi. benimde şu anki uygulamam bir master beş detail den oluşuyor ve fk ile birbirlerine bağlı. ben detail alana girildiğinde yani gride girildiğinde dataset in state komutu ile kontrol ettirip eğer insert veya edit ise masteri kaydettiriyorum. arka planda olduğu için kullanıcı anlamıyor ve yoluna takılmadan devam ediyor.

kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

muhtemel en iyi çözüm FK yı kaldırıp, yapıyı manuel kurmak bağımsız tabloları daha kolay kontrol edebilirsiniz.
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

bu sorunu çözebilmek için ufak bir tablo oluşturdum
İl master
ilce detail
semt subdetail

BeforePost

Kod: Tümünü seç

 if DataSet.Fields.Fields[1].IsNull then 

DataSet.Fields.Fields[1].Value:=DataSet.DataSource.DataSet.Fields.Fields[0].Value;
ilce Dbgrid insert diyorum daha sonra
semt DBgrid insert diyerek dolduruyorum

tekrar dönüp ilceye kaydet dediğimde (violation of FOREİGN KEY constraint FK_SEMT_1" on table "SEMT") hatası veriyor belki bu hatadan nedemek istediğini anlayabilirsiniz diye yazdım bana sadece semt açık ifadesi çağrıştırıyor.

Syn bobasturk dediğinizi yapmaya çalıştım fakat olmadı sanırım çözüm sizde saklı :lol:

Syn kadirkurtoğlu FK kullanmamdaki ısrar kayıtları silerkenki gerekli olan alt detaillerinde silinmesi gibi veya raporlamalarda sağlayacağı kolaylıktan dolayı ısrar ediyorum.

en son çare DB leri kaldırıp arka planda normal editlerden bilgileri alarak kaydetmek olacak ozaman bir sorun olmayacaktır[/code]
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
peki tabloların pkeylerine değerleri ne zaman veriyorsun.
yaptığın örneğe üç tanede grid ekle.
tablodaki id alanlarınıda göstersin. kayıt girişini gene editlerden dene.
bakalım id alanlarını alıyormu.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Cevapla