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

Mesaj gönderen Abrak »

aslangeri yazdı: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.
id değerlerini Trigger veriyor otomatik İBdataset generatör ayarlarını yaptım kayıt insert dediğinde anında otomatik veriyor id leri
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

id değerlerini Trigger veriyor otomatik İBdataset generatör ayarlarını yaptım kayıt insert dediğinde anında otomatik veriyor id leri
aslangeri nin id den kastı ilişkisel id ler. generatorfield seçimi ile tablonun knedi alanlarındaki autoinc ler çalıştırılır.

kısaca

detay tablonun select ifadesinde belirtilen parametreye değer göndermen gerekiyor.

Kod: Tümünü seç

select * from DETAY 
where masterid =:masterid
ifadesindeki :masterid parametredir. bu parametre detay tablosuna ait bir field olan masterid alanına değer aktarmak içindir.

sen de detay tablonun OnBeforePost yordamında

Kod: Tümünü seç

detayTabloMasterID.asinteger := masterTabloMasterID.asinteger;
şekinde bir kod yazarak detay tabloda kayıt gereçkelşmeden bu alana değeri vermen gerekiyor.
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

kadirkurtoglu yazdı:
id değerlerini Trigger veriyor otomatik İBdataset generatör ayarlarını yaptım kayıt insert dediğinde anında otomatik veriyor id leri
aslangeri nin id den kastı ilişkisel id ler. generatorfield seçimi ile tablonun knedi alanlarındaki autoinc ler çalıştırılır.

kısaca

detay tablonun select ifadesinde belirtilen parametreye değer göndermen gerekiyor.

Kod: Tümünü seç

select * from DETAY 
where masterid =:masterid
ifadesindeki :masterid parametredir. bu parametre detay tablosuna ait bir field olan masterid alanına değer aktarmak içindir.

sen de detay tablonun OnBeforePost yordamında

Kod: Tümünü seç

detayTabloMasterID.asinteger := masterTabloMasterID.asinteger;
şekinde bir kod yazarak detay tabloda kayıt gereçkelşmeden bu alana değeri vermen gerekiyor.
pardon yanlış anladım

Kod

Kod: Tümünü seç

select * from ILCE where il_kod=:il_kod
bunlar mevcut zaten tek tek kayıtlarda bir sorun yok
sorun her iki DBgridde aynı anda bilgileri girdikten sonraki kaydetmeye çalıştığımda gerçekleşiyor

Kod: Tümünü seç

procedure TDataModule2.IBDataSet3BeforePost(DataSet: TDataSet);
begin
 if IBDataSet3.FieldByName('ilce_kod').IsNull then 

ibdataset3.FieldByName('ILCE_KOD').Value:= ibdataset2.FieldByName('ILCE_KOD').Value;
end;

burda gerekli atamayıda yapıyorum

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

Mesaj gönderen kadirkurtoglu »

+ son olarak FK tanımlı tablolarda master tabloyu commit et.
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

arkadaşlar bakmak isterseniz denediğim projeyi upload ettim

40KB
http://www.maxiupload.net/show.php/118 ... .rar.html
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

eğer ibdataset generator ayarını yaptıysan değerleri triger vermiyordur.
ibdataset kendisi generatorden değer çekiyor. sonra triger başka bir değer veriyordur.
1.triger kodlarında null kontrolu yapıyormusun.
2.dbgridlerde değim işlemi bi yap.
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ı:eğer ibdataset generator ayarını yaptıysan değerleri triger vermiyordur.
ibdataset kendisi generatorden değer çekiyor. sonra triger başka bir değer veriyordur.
1.triger kodlarında null kontrolu yapıyormusun.
2.dbgridlerde değim işlemi bi yap.
trigerleri kaldırdım dediğiniz gibi generatorlerden alıyor idleri 3 dbgrid ekleyerek deniyorum sorun aynı
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

projenizi download edip denedim. hiç bir sorun yok. hiçbir hata almadım. nasıl kayıt yaptığınız hakkında biraz bilgi verebilirseniz.

+

FK tanımlı tablolarda master kayıt yeni bir kayıt ise mutlaka post edilmelidir. aksi halde detay tablo master deki ilişki id sini algılamaz. ve Foreign Key hatası alırsınız...
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

kadirkurtoglu yazdı:projenizi download edip denedim. hiç bir sorun yok. hiçbir hata almadım. nasıl kayıt yaptığınız hakkında biraz bilgi verebilirseniz.
ilçe ve semtlere aynı anda insert yapalım AD ları doldurup herhangi birine kayıt diyelim bahsettiğim hatayı verecektir

FK tanımlı tablolarda master kayıt yeni bir kayıt ise mutlaka post edilmelidir. aksi halde detay tablo master deki ilişki id sini algılamaz. ve Foreign Key hatası alırsınız...
evet sorun o sanırım ama bende zaten post etmeye çalışırken hata alıyorum dediğim şekilde girmeyi denerseniz sorunu anlayacaksınızdır

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

Mesaj gönderen kadirkurtoglu »

arkadaşım yine aynını diyorsun. mantık basit aynı anda nasıl giriyorsun anlamadım. önce master kaydı tamamlayacaksın. daha sonra detay kayıt gireceksin.

Kod: Tümünü seç

mastertablo.insert;
mastertablo.post;
detaytablo.insert;
detaytablo.post;
yukardaki kod blokları yukardan aşağı doğru çalışır. ve sıralama da master kayıt post edildiği için detay kaydın post işleminde hata almazsınız.

hiçbir şey yapamıyorsanız. ilgili master tablonun bağlı olduğu DBGridin on exit yordamında state sorgulayarak post olmasını sağlayın.
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

kadirkurtoglu yazdı:arkadaşım yine aynını diyorsun. mantık basit aynı anda nasıl giriyorsun anlamadım. önce master kaydı tamamlayacaksın. daha sonra detay kayıt gireceksin.
evet farkındayım aynı şeyleri söylüyorum çünkü sorunumu anlatamadığım için aynı cevap geldiğindendir mantığı biliyorum

sizin söylediğiniz çözüm ise;
1-kullanıcı master bilgileri doldurdu siz post ettiniz sonra detaile geçti ve doldurdu kaydet butonuna basmadan vazgeçti kaydetmekten ve çıktı ne olacak post ettiği masteri tekrar bulup silecekmiyiz.
2-yeni kayıt dedi aynı formda giriş olduğundan sondan başladı doldurmaya ve en son mastere geldi bir deneyin bakalım DBedit lerde dediğiniz sıralamada post edebilecekmisiniz.
3-ben istedimki kullanıcı özgür olsun istediği yerden başlasın doldurmaya tek tuşla kaydet dediğimizde sizin dediğiniz gibi ilk önce masteri post etsin daha sonra detaili post etsin arkasındanda varsa subdetaili post etsin ama DBxxx lerde ikinci tabloya geçtimi yapamadım sizin dediğiniz sıralamayı

Son olarak son mesajda bana biraz yeter artık gibi bir çıkış oldu gibi geldi bu yüzden kapatmak istedim bu konudaki yardım talebimi çok özür dilerim kafanızı ağrıttım ve zamanınızı aldım
ben çözmeye çalışırım çözemezsemde en baştanda söylediğim gibi olmadı normal editlere dönerim ama sanki bir çıkış
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
şimdi olay biraz daha netleşti.
siz master tabloya kayıt girilmeden detay tabloya kayıt girmek istiyorsunuz. Hata mesajıda size onu söylüyor.
şöyle bir şey yapılabilir. kullanıcı kayıt girişi penceresini açtığı zaman master tablolara otomatik kayıt girersiniz. önce master kaydedildiği için detay tablolarda id alanlarını alırlar. eğer kullanıcı vazgeçerse transaction ı rollback yaparsınız. master tabloda kullanıcının girmesi gereken alanlarıda kullanıcı edit ederek girebilir.
umarım anlatabilimişimdir.
kolay 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.
şimdi olay biraz daha netleşti.
siz master tabloya kayıt girilmeden detay tabloya kayıt girmek istiyorsunuz. Hata mesajıda size onu söylüyor.
şöyle bir şey yapılabilir. kullanıcı kayıt girişi penceresini açtığı zaman master tablolara otomatik kayıt girersiniz. önce master kaydedildiği için detay tablolarda id alanlarını alırlar. eğer kullanıcı vazgeçerse transaction ı rollback yaparsınız. master tabloda kullanıcının girmesi gereken alanlarıda kullanıcı edit ederek girebilir.
umarım anlatabilimişimdir.
kolay gelsin.
söylemek istediğinizi anladım fakat ozamanda çok kullanıcılı olduğundan rollback ta karışıklık olmazmı
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

niye karışıklık olsunki?
rollback yaptığınız zaman sizin yaptığınız işlemler iptal ediliyor.
generatorlerdeki artırmalar hariç.
diğer makinelerde generatorlerden zaten farklı değerler alacaklar.
karışıklık olmaz.
karışıklık konusunda kafanıza takılan yeri sorabilirsiniz.
kolay 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 »

tşk ederim aslangeri söylediğiniz şekilde yapmaya çalışacağım
Cevapla