Foreign Key Tanımlı Alanda ID Alma Sorunu

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
Kullanıcı avatarı
Metinx
Üye
Mesajlar: 54
Kayıt: 04 Eki 2007 01:39

Foreign Key Tanımlı Alanda ID Alma Sorunu

Mesaj gönderen Metinx »

Merhaba Arkadaşlar,

Benim bir sorunum var. Genel olarak konu şöyle;

Şimdi bir Master Table var ( SATIS ) birde Detail Table var ( SATIS_DETAY ) . Şimdi detay tablodaki U_ID alan ile master tablodaki ID alanı foreign tanımlı. Yeni işlem yapacağım zaman satış tablosunu insert yapıyorum ve generator vasıtası ile ekrana o anki id yi yazdırıyorum. Buraya kadar sorun yok detail tablonun before post olayına mesela

Kod: Tümünü seç

satis_detayid.asinteger:=satisid.asinteger;
yazıyorum ve post olayı tetiklenmeden id alınması gerekiyor lakin almıyor ve FK hatası veriyor.

Konu ile ilgili olarak forumdaki kayıtların hepsini okudum

Kod: Tümünü seç

master tabloyu post yap trans yap o zaman detay tablo ID noyu alır.
çözümünden başka bir çözüm bulunamamış buda benim yapıma müsait değil.

İnşallah sorunumu anlatabilmişimdir. Yardımlarınızı bekliyorum arkadaşlar.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Foreign Key Tanımlı Alanda ID Alma Sorunu

Mesaj gönderen aslangeri »

s.a.
atama yaparken ekrana yazdırdığın değeri ata.
birde ID alanını kullanıcıya niye gösteriyorsunuz ki?
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
Metinx
Üye
Mesajlar: 54
Kayıt: 04 Eki 2007 01:39

Re: Foreign Key Tanımlı Alanda ID Alma Sorunu

Mesaj gönderen Metinx »

aslangeri arkadaşım ilgin için öncelikle teşekkür ediyor ve selamını alıyor a.s diyorum.
Ekrana yazdırılan yani generator vasıtası ile master tablenin id alanında oluşan degeri alamıyorum. Herhangi bir transact olmadığı için id değerini masterdan alamıyor. FK yapısından kaynaklanıyor diye tahmin ediyorum. Kullanıcıya İşlem No adı altında gösteriyorum degeri.

Kod: Tümünü seç

satis_detayid.asinteger:=satisid.asinteger;
olmuyor yani F5 ile işaretledikten sonra çalıştırıyorum detail before post ta tetiklenen bu işlemde satisid.asinteger=12 ( yani ID no ) gibi değer gösterirken satis_detayid.asinteger=0 diyor
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Foreign Key Tanımlı Alanda ID Alma Sorunu

Mesaj gönderen Kuri_YJ »

Selamlar,

Detay Tablonun PK olan alanına (satis_detayid), Master tablonun PK alanını (satisid) koyarsanız, FK'dan önce PK hatası alırsınız. Cannot Duplicate Value Primary Key filan diyerek hata vermesi lazım (Eğer doğru bir DB dizayn ettiyseniz).

Generator ile elde edilen sayı, tablolarınızn Trigger'ında mı duruyor? Yoksa IBX bileşenlerini kullanarak, belirttiğiniz tablolar için (OnNewRecord, OnPost, OnServer gibi seçenekleri var) bu Generator alanı Delphi Tarafında nasıl tanımladınız? Veya bir adet Generator SP'si oluşturup, kayıt işlemlerinden önce bunu çağırıp Generator alanlarınızın alacağı değerleri buna mı soruyorsunuz?

Gördüğünüz gibi 3 değişik yöntem sordum. Siz bunlardan hangisini kullanıyorsunuz? Hepsinin avantaj ve dezavantajları var. Siz bunlar içerisinde o anki işinize hangisi uygun ise bunu tercih edip, buna göre yapmanız lazım.

Eğer FK koyduysanız, öncelikli olarak MASTER tablonun kaydolunması ve MASTER Tablonun PK Fieldının ID Değeri DETAIL tablodaki FK olarak tanımlanmış olan alana koymalısınız. Bu da DETAIL Tablonun OnNewRecord eventinde gerçekleştirilebilecek bir husus. IBX bileşenleri ile tablolara belirteceğiniz GENERATOR alanlar ve GENERATOR'un alınma zamanı ile Delphi tarafında kolayca geçebilirsiniz.

Bunların dışında FK olan tablolarda, MASTER kayıt önce, DETAIL kayıtlar da sonra POST edilmelidir aksi halde Önce DETAIL kaydı yollamaya kalkarsanız Cannot Insert vs. vs. Foreign Key Constraint hatası alırsınız.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
Metinx
Üye
Mesajlar: 54
Kayıt: 04 Eki 2007 01:39

Re: Foreign Key Tanımlı Alanda ID Alma Sorunu

Mesaj gönderen Metinx »

Merhaba Arkadaşlar;
Özellikle Kuri_YJ sana ilgi ve alakandan dolayı çok teşekkür ediyorum. Aslında sorunum yeni bir satış formu açıldığın insert olan master tablo detayındaki detail konumda olan tabloya masterın id bilgisini alıp bir türlü detailin U_IB alanına yazdıramadığım durumudur. şimdi ise detailin after insertine masteri post ederek manual bir çözüm buldum. Master detail yapımın ilişkili alanları şöyle,

Master

ID PK


Detail
ID
U_ID FK

Firebird kullanıyorum ve trigerle standart bir şekilde AutoInc yapıyorum ve IBX bileşenlerini kullanıyorum.

Bu arada bişey eklemek istiyorum soruma. Şimdi mesela ben bir satış fişinde master detail ve sub detail diye 3 tablo kullanıyorum yani satış,satış_detay,satıştoplam gibi.
Tablolar hep fk ile birbirine bağlı satışı da cari karta bağlayayım mı nasıl olur ?

Saygılar sevgiler...
Kullanıcı avatarı
Metinx
Üye
Mesajlar: 54
Kayıt: 04 Eki 2007 01:39

Re: Foreign Key Tanımlı Alanda ID Alma Sorunu

Mesaj gönderen Metinx »

Arkadaşlar bu konu günceldir. Sorunum için yardımcı olabilecek bir arkadaş varmı acaba?
zengin
Üye
Mesajlar: 233
Kayıt: 06 Ağu 2003 10:13

Re: Foreign Key Tanımlı Alanda ID Alma Sorunu

Mesaj gönderen zengin »

s.a

degerli arkadaşım

(alıntı
satis_detayid.asinteger:=satisid.asinteger;
yazıyorum ve post olayı tetiklenmeden id alınması gerekiyor ? > lakin almıyor ve FK hatası veriyor )

1 secenek :o zaman ıbdatasetin öyle bir özelligi var onu kullan ?

2 secenek :insert yapmış oldugun dügmeye
satistable.edit;
satis_detayid.asinteger:=satisid.asinteger;
satis.post;

olarakda olması lazım kolay gelsin
Zengin
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Foreign Key Tanımlı Alanda ID Alma Sorunu

Mesaj gönderen Kuri_YJ »

Selamlar,

IBX bileşenlerin Generator Field diye bir özelliği var. Bunu kullanın. Delphi tarafında Querynize bir insert yaptığınızda Delphi otomatik olarak belirttiğiniz GENERATOR'ün değerini yükler. Sizin bir şey yapmanıza gerek kalmaz. Böylelikle istediğiniz işlem olur. Yani Trigger'a ihtiyaç duymadan tablonuze INSERT ettiğiniz anda Identity Field'ınıza değer yüklenir.

Query bileşeninizde GeneratorField property'sine bakın.

Kolay Gelsin

Not : Foruma ara sıra girdiğim için yanıtını yeni gördüm.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
Metinx
Üye
Mesajlar: 54
Kayıt: 04 Eki 2007 01:39

Re: Foreign Key Tanımlı Alanda ID Alma Sorunu

Mesaj gönderen Metinx »

Sorunum ile ilgili yardımcı olmaya çalışan tüm arkadaşlara teşekkürler. Kuri_YJ arkadaşım sanada ayrıca teşekkür ediyorum. Şimdi ben IBDataset nesnesini kullanıyorum ve Generator Field Özelliğinden o table için yaptığım Generatörü seçiyorum burda sorun yok. Sorun Master Table ( SATIS ) birde Detail Table ( SATIS_DETAY )'ın uyum yani bir satış fişi insert yaptığımda Ana Table Insert modunda Detail table de veri girilirse insert modunda oluyor ve alt satıra geçerken gridde yani post işlemi gerçekleşirken Detail tablede Ana tablede id değerini göremiyor. Master tablenin detailden önce kaydolması veya buna benzer farklı bir durum olması gerkiyor.

Yardımlarınız için şimdiden teşekkür ederim.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Foreign Key Tanımlı Alanda ID Alma Sorunu

Mesaj gönderen emin_as »

Detail tabloya ekleme yapmadan önce aşagıdakine benzer bir kodlama yapabilirsin.

Kod: Tümünü seç

procedure TDataModule1.detailTabloBeforeInsert(DataSet: TDataSet);
begin
  if AnaTablo.State in [dsInsert, dsEdit] then
    AnaTablo.Post;
  if Anatablo.RecordCount = 0 then
  begin
    DetailTablo.Cancel;
    raise EDataBaseError.Create('Önce Anatablo Bilgileri Girilmelidir.');
  end;
end;
Kullanıcı avatarı
Metinx
Üye
Mesajlar: 54
Kayıt: 04 Eki 2007 01:39

Re: Foreign Key Tanımlı Alanda ID Alma Sorunu

Mesaj gönderen Metinx »

emin_as yardımın için teşekkür ederim. Eğer kullanıcı işlemi iptal etmek isterse bu sefer anatabloyu silmek gerekececek. Farklı kullanımlarda da sanki sıkıntı olacak gibi duruyor. Bildiğiniz daha stabil bir yol varsa onu öğrenebilirmiyim yoksa bu yapıyı kullanacağım. PK ve FK yapıyı kullanmak bu kadar sıkıntılımı.

Saygılar.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Foreign Key Tanımlı Alanda ID Alma Sorunu

Mesaj gönderen emin_as »

Veritabanı bütünlüğü sözkonusu olunca biraz sıkıntıya katlanmak gerekiyor.
Detail tablodan vazgeçilmesi çok önemli değil, yani kullanıcı onu silse de anatablo varolabilir. Burada önemli olan anatablo silinince detail tablodan kurtulmaktır. FK da on delete durumunda cascade ile bu iş çözülüyor.

Aşagıdaki linkte foreign key kullanımı ve cascade işlemi anlatılıyor.
http://www.ib-aid.com/articles/item72
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Foreign Key Tanımlı Alanda ID Alma Sorunu

Mesaj gönderen Kuri_YJ »

Selamlar,

Generator Field'ın Generator değerini üretme zamanı olarak neyi seçiyorsun? OnPost mu OnServer mı yoksa OnNewRecord mu?

Master tablo için OnNewRecord seçersen, Master tabloya herhangi bir INSERT yaptığın anda daha DB'ye gönderilmeden önce ID alanı değerini alır !!!!! Ben böyle kullanıyorum ve şimdiye kadar hiç senin bahsettiğin gibi Detail'de Master için değer almamazlık yaptığını görmedim.

Ayrıca Detail'lerin OnNewRecord Event'lerinde, DetailQueryMASTER_TABLE_ID.AsInteger := MasterQueryID.AsInteger gibi Master Tablonun ID alanındaki bağlantını koyman lazım.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla