Basit Bir Master-Detail Ama Çalışmıyor...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
R.K.
Üye
Mesajlar: 82
Kayıt: 02 Nis 2007 12:05
Konum: Adana

Basit Bir Master-Detail Ama Çalışmıyor...

Mesaj gönderen R.K. »

Merhaba arkadaşlar. Uzun zaman oldu delphiyle birşeyler yapmayalı. Basit bir programa ihtiyacım oldu başlamadan önce biraz antreman yapayım dedim ama daha ısınırken yarım kaldı :( Bu konuyla ilgili daha öncede soru sormuştum hatta kendi sorumdaki cevaplara baktım ama yine olmadı. Anlatmaya başlayayım. Veritabanı access 2003 sürümü ve 2 tablo içeriyor.
tbl_ana autoinc
--ana_id
--isim
--tel
----------------
tbl_detay
--detay_id autoinc
--ana_id
--ders
--kitap
Tablolarım bunlar ve sadece bu alanlar var deneme olsun diye alanlar bu şekilde. Kırmızı alanlar pk olarak tanımlı. Access'te ilişkiler bölümünde de ana tablodaki ana_id alanı ile detay tablodaki ana_id alanları ilişkili halde. Delphi tarafına geçince ise 1 adet AdoConnection, 2 adet AdoDataSet ve 2 adet DataSource nesnesi var. Connection ile vt'ye bağlanıp AdoDataSet nesnesi ile verileri çekiyorum ve DataSource ile veri bilinçli nesnelere bağlıyorum buraya kadar sorun yok. Detail AdoDataSet nesnesinin DataSource özelliğini master tablomun datasource yapıyorum ve master fields özelliğine tıklayınca ilişki tanımlayacağım bir pencere çıkıyor ve her iki tablodan da pk ve fk alanları seçip ilişkiyi tanımlıyorum. Form üzerine daha sonra bu alanları dbedit ile ilişkilendirerek koyuyorum. Yeni butonum ile master tabloma append komutunu veriyorum ve master tablomun alanlarına ve detail tablomun alanlarına birşeyler giriyorum ve kaydet butonuna tıklıyorum. Master tabloma kayıt gerçekleşiyor detail tablomada gerçekleşiyor fakat detail ile master arasında hiçbir ilişki olmadığını görüyorum. Burda sanki detail tabloma ana_id alanının 2 dataset nesnesi arasında yaptığım ayardan gelmesi gerektiğini düşünüyorum ama bir yerde eksik veya hatam var olmadı. Sorun nerede :( .......
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2385
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Basit Bir Master-Detail Ama Çalışmıyor...

Mesaj gönderen freeman35 »

ado kullanmadım ama muhtemelen master table ın pk sı senin detail ine otomatik aktarılmaz, detail in before post una senin kod eklemen lazım

Kod: Tümünü seç

detail.fieldbyname('ana_id').asinteger := master.fieldbyname('ana_id').asinteger;
ayrıca garantici biri olarak master ı post etmeden ben detail e kayıt girişine izinvermem, sonuçta transaction a bağlı.
ayrıca detail ın beforepost event ine breakpoint koyup değerleri kotrol edeilirsin,yanlış olanı bulabilirsin,database kısmında ben boş girişlere izin vermem yani hep not null dur, tabi açıklama vs gibi kullanıcının keyfine kalmış ve tablolar arası ilişkiler söz konusu değilse
koaly gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Basit Bir Master-Detail Ama Çalışmıyor...

Mesaj gönderen conari »

master tablodan, detay tabloda kaydı olan bir ID yi silmeye çalış bakalım. Şarlayacakmı, şarlar ise ilişki kurmuşsun demektir.
Ayrıca ben hiç delphi üzerinde master detail yapmıyorum. veritabanında ilgili ilişkileri kuruyorum.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
R.K.
Üye
Mesajlar: 82
Kayıt: 02 Nis 2007 12:05
Konum: Adana

Re: Basit Bir Master-Detail Ama Çalışmıyor...

Mesaj gönderen R.K. »

Merhaba arkadaşlar. Hocam dedikleriniz yapmıştım zaten. Yani master tablonun beforePost ta ana_id değerini almaya çalıştım olmadı, afterPost'ta olmadı onNewRecord'da denedim olmadı. Yani master tablodan ana_id değerini detail tabloya bir türlü geçiremedim. Önceden firebird kullanıyordum ve dediğiniz gibi bende vt kısmında yapmıştım bu işlemleri. Ama bu sefer access kullanmam lazım fakat bir türlü olmuyor. Delphi 2009 kullanıyorum acaba sürümle ilgili bir sıkıntı mı var anlamadım :( Bir de siz diyelim ki query ile böyle bir iş yapacaksınız o zaman nasıl bir yöntem kullanıyorsunuz. Yani master ve detail tablo query nesnesi ile soguları döndürüyor. Aynı zamanda ekleme (insert) yapmam gerekirse yani böyle bir yapıda siz veri bütünlüğünü nasıl sağlarsınız. Mesela olmadı bu iş access ile çözülemedi o zaman Firebird kullanırsam nasıl bir yöntem tavsiye edersiniz (veri bütünlüğünü vt kısmında çözmek gibi ve bununla ilgili ufak bir örnek bilgi verirseniz sevinirim) Dediğim gibi unuttuğum şeyler olmuş ama biraz pratikle sanırım hallolacak :) Cevaplarınız için teşekkürler..
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2385
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Basit Bir Master-Detail Ama Çalışmıyor...

Mesaj gönderen freeman35 »

Eğer tercih sana aitse hiç düşünme firebird e geç derim
master da bir şey yapmıyacaksın zaten :) sadece master ı post et o db ye yazılsın, fiziksel olarak doğru bir şekilde yazıldıysa afterpost una

Kod: Tümünü seç

showmessage(dataset.fieldbyname('pk_anaTable').asstring)
ile bir bak bakalım master table ın pk sı varmı kayıt edilmişmi.eğer anormal bir durum varsa ona bir şey diyemiyeceğim ben mikisoftla hiç işim olmadı inşAllahda olmaz :)

Kod: Tümünü seç

detail.fieldbyname('ana_id').asinteger := master.fieldbyname('ana_id').asinteger;
Bu kodu detayın beforepost una eklemen gerek. master kaydedilmiş ve pk sı elinde, detail i kaydetmeden önce detail table a masterın pk sını eklemen gerek.

Bilgi bütünlüğü diye bahsettiğim master ve detay ve/veya bunların saz arkadaşları varsa yani bikaydı oluşturan bilgileri, fatura girişi, tahsilat girişi gibi mesela, bir seferde hepsinin kaydedilmesi yada işlemin iptal edilirse bütün işlemin iptal edilmesi geeken işlemler.Bunları transaction ile bir paket haline getiriyorun. en son noktada kaydet dersen bütün yapılan işlemler db ye eklenir,yada vazgeçersen tüm işlemler iptal edilir.Yani master ve detay table larına yaptığın tüm post lar transaction commit etmediğin sürece db ye eklenmez.rollback edersende tüm post delete işlemleri iptal edilir. bilgi bütünlüğü budur.
Transaction da global olmamalı ki aynı anda futura formu ve tahsilat formu açık olabilir bunlar birbirinden farklı gruptur.bunları iyi gruplamak gerekir.
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
R.K.
Üye
Mesajlar: 82
Kayıt: 02 Nis 2007 12:05
Konum: Adana

Re: Basit Bir Master-Detail Ama Çalışmıyor...

Mesaj gönderen R.K. »

Hocam önerieriniz için çok teşekkürler. Mecbur kaldığım yerde FB'ye dönücem sanırım. Transaction zaten access ile yapabileceğim bir olay değil bildiğim kadarıyla ve bende detail tabloma sadece 1 değil birden fazla kayıt ekleyebilirim güzel bir öneri :bravo: . Peki detail tabloya bilgiler bir dbgrid içerisinden seçiliyorsa ve dbgridde hiç bir kayıt girişi olmamışsa kayıt işlemi gerçekleşmeden önce bunu dbgridin bir özelliğiyle mi öğrenirim yoksa bağlı olduğu datasetten mi? En iyisi ben FB ile veritabanını oluşturup yapmak istediklerimi bu şekilde gerçekleştireyim. Sonrada sonucu yazıcam hocam buraya. Son birşey daha sorayım o zaman. Veritanında trigger kullanmak istersem ve masterdaki id alanını alıp detaile trigger ile aktarmak istersem daha iyi bir yaklaşım mı olmuş olur sizce ve nasıl yaparım. Az çok hatırlıyorum daha öncede yapmıştım ama belki benim yaptığımdan farklı düşünüp yapan ve daha uygun olan tasarımı öğrenmek isterim....
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2385
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Basit Bir Master-Detail Ama Çalışmıyor...

Mesaj gönderen freeman35 »

öncelikle ve ilk kural "don't panic" panik yok işler yetişir yani :)
ilk düşündüğün şeyi ne yap nede söyle
yazdığını bir oku, ben sudoku çengel bulmaca gibi şeyleri sevmem sıkılırım.Derdini öz cümleler kurarak söyle, söylemeden öncede cümle cümle kafanda kur söylemeye çalıştığının yarısının cevabını kendin vereceksin zaten.
Programcılığın temeli if then else dir.
dbgridin bir özelliğiyle mi öğrenirim yoksa bağlı olduğu datasetten mi?
bu sorunu tekrar tekrar oku. benim cevabım 'Neyi kimden istiyorsun?' sonrada aklıma geldi çok sevdiğim atasözüdür, 550 tane memur varya onlara söylerim hep. "asil varken, vekile ... yemek düşer"
Bilgi bütünlüğü dedim her mesajımda. yarısı client ta yarsı serverda master-detail de triggerla neyi yaptırtacaksın anlamadım. 2 kes yazdım detail in beforepost u ne yazacağınıda yazdım üstelik ki eskiden tanıyanlar bilir ben bir satır bile kod yazmam,ukalalıktan değil,balık ve balık tutma hikayesinden
master detail dediğin şey yukarıda yazdığım 1 satır kod iki table 2 dataset 2 tanede grid 1 satır kod al sana program işte.bilgisayar nasıl kodu çalıştırıyorsa kapayın gözünüzü satır satır çalıştırın programı yazdığınız değil sadece compenent larıda.
kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Cevapla