Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

ÖNEMLİ AÇIKLAMA: MUTLAKA OKUYUNUZ!

Gönderen Konu: Firebird Master / Detail  (Okunma sayısı 7706 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
Firebird Master / Detail
« : 09 Ekim 2005 23:16:24 »

Önce yukarıdaki gibi veritabanı kısmını hazırlayın. Her tablonun ilk alanını  integer tipte otomatik  artacak bir primary key li alan yapıyoruz. Bu alanların değerlerini sp kullanarak oluşturduğumuz generatordan alıyoruz. Sp kullanmamızın sebebi IBTable bileşeninde generator desteği olmamasıdır.  İlçeler tablosundaki il_kodu alanını iller tablosundaki il_kodu alanına bağlı bir foreign key tanımlıyoruz. Semtler tablosundaki ilçe_kodu alanını ise ilçeler tablosundaki ilçe_kodu alanına bağlı bir foreign key oluşturuoruz. Böylece ilçeler tablosunda bir kayıt silindiği zaman semtler tablosunda ona bağlı alanlar silinecektir. İller tablosunda bir kayıt silindiği zaman ise önce ilçeler tablosundaki ilgili kayıtları silmeye gidecek ancak semtler tablosu  ilçelere bağlı olduğu için önce semtler tablosunda ilçeler tablosuna bağlı kayıtlar silinir daha sonra ilçeler tablosundaki ilgili kayıtlar silinir. İller tablosu ilçeler tablosunu tetiklerken ilçeler tablosu da semtler tablosunu tetiklemektedir. Bu güncelleme içinde geçerlidir.

SP’deki kod ise sp ye delphiden tablo ismini parametre olarak alıp o parametreye bakarak hangi generatordan veriyi alacağığmızı belirliyoruz. Bunun master/detaille ilgisi yoktur. Siz bildiğiniz şekilde otomatik artan alanınızı oluşturabilirsiniz. Size örnek teşkil etmesi için bunu tercih ettim. Primary ve foreign keye sahip alanlar not null  olmalıdır. Şimdi işlemin delphi kısmına geçebiliriz.

Şimdi hem IBTable hemde IBDatasetle Master / Detail bağlantıyı yapıcaz. IBQuery’de IBDataset gibidir.  Projeye bir datamodule ekleyip üzerine 1 IBDatabase, 1 IBTransaction, IBStoredProc, 3 IBDataset, 3 IBTable, 6 DataSource Bileşeni ekleyin. IBDatabase ve IBTransaction ayarları yapın. IBStoredProc Bileşenine oluşturduğumuz SP'yi gösterin. Datamodule’nin görüntüsü aşağıdaki gibi olmalı.




görüntüde hangi bileşene hangi ismi verdiğimi görüyorsunuz. Her tabloyu kendi datasourcesine bağlayın.      

 Formunuza 6 dbgrid 6 dbnavigator ve her birinin datasource özelliklerini ayarlayın. Formun görüntüsü aşağıdaki gibi olabilir.





şimdi gelelim master/detail ilişkiye. IbDataset ile Master/Detail bağlantı kurmayı öğrenelim. Master  tablomuz olan ve illeri listeleyen Qry_IL bileşeninin SelectSQL özelliğine bildiğiniz şekilde tabloyu listeletin. Bu özelliğe aşağıdaki SQL Sorgusunu ekliyoruz.

Kod: [Seç]
select * from TBL_IL gördüğünüz gibi iller tablosununda bir farklılık yok. Geçelim detail tabloya. İlçeler tablosunu listeleyecek olan Qry_ILCE bileşeninin SelectSQL özelliğine aşağıdaki cümleyi ekliyoruz.

Kod: [Seç]
select * from TBL_ILCE Where IL_KODU=:IL_KODU

yukarıdaki örnekte gördüğünüz gibi şartlı bir sorgu yazdık. Buradaki Where IL_KODU ilçeler tablosundaki il_kodu alanını ifade etmektedir. İki nokta üst üste işaretinden sonra” yazdığımız il_kodu ise bir parametredir. IBQuery bileşeninde anlattığım parametreye benzer. Buradaki  parametre iller tablosundaki aktif olan kaydın il kodunu göstermektedir. Bu parametre ismi alanları gösterdiği için rastgele isim seçemezsiniz. Queryi active yapmaya çalıştığınız zaman hata verecektir. Çünkü parametre değerini bulması için Qry_ILCE bileşeninin  Datasource özelliğini iller tablosuna bağlı datasource bileşenini göstermelisiniz..

semtler tablosunu gösteren Qry_semt bileşeninin SQL Cümleside aşağıdaki gibidir.

Kod: [Seç]
select * from TBL_SEMT where ILCE_KODU=:ILCE_KODU

buradaki ilk ILCE_KODU setler tablosunda alanı ikinci ILCE_KODU ilçeler tablosundaki ILCE_KODU alanını temsil etmektedir.  Yine parametreyi görebilmesi için ilçeler tablosunu gösteren DataSoource bileşeninin Qry_semt özelliğine gösteriyoruz.

Şimdi detail  tabloya  kayıt girildiğinde siz master tablodaki aktif kaydın foreign keyin bağlı olduğu primary key alanının değerini foreign key tanımladığınız alana atamalısınız. Bunun için detail tabloların BeforePost olayına aşağıdaki kodu gibi bir yazmalısınız.

QRY_ILCE

Kod: [Seç]
if Qry_ILCE.FieldByName('IL_KODU').IsNull then //aLANDA DEĞER YOKSA

Qry_ILCE.FieldByName('IL_KODU').Value:=Qry_IL.FieldByName('I L_KODU').Value;


QRY_SEMT

Kod: [Seç]
if Qry_Semt.FieldByName('ILCE_KODU').IsNull then //aLANDA DEĞER YOKSA

Qry_Semt.FieldByName('ILCE_KODU').Value:= Qry_Semt.FieldByName('ILCE_KODU’).Value;


Ben yukarıdaki iki kod yerine her iki detail tabloyu seçip BeforePost olayına aşağıdaki kodu yazyorum.


Kod: [Seç]
if DataSet.Fields.Fields[1].IsNull then //ALANDA DEĞER YOKSA

DataSet.Fields.Fields[1].Value:=DataSet.DataSource.DataSet.Fields.Fields[0].Value;


Buradaki DataSet AfterPost Olay Proceduresinde bir parametredir. Bu parametre olayı  tetikleyen IBQuery,IBTable gibi bileşenlerin isimlerini barındırır. Olayı hangisi tetiklemişse o bileşenin ismine sahip olur. Fields[1] ise ismi verilen datasetteki ikinci alanı gösterir. Fields[0] olsaydı ilk alana konumlanacaktı. Yani alan sırası dizilerdeki gibi sıfırdan başlar. Dikkat ettiyseniz detail tablolarda ikinci alanlar foreign key’e  sahip alanlar. Bu  alana ataoyacağımıız değere dikkat ettiyseniz datasetin DataSource özelliğinden bağlı bulunan ilk alana konumlanıyoruz. İlişk hep ilk alan olan primary keyli alan olduğu için doğru adrese konumlanıyoruz.

Bunun dışında otomatik artan alanımızada kayıt eklenmeden önce değer atanmalıdır. Bunun içinde IBQueynin GeneratorField özelliğini daha önce  anlattığım şekilde ayarlayın.

Bileşenlerin Active özelliklerini True yapıp test edebilirsiniz.  Bu arada yukarıdaki semtler tablosunda semt_adi alanı integer değil varchar olacak.

Şimdi gelelim IBTable bileşenleriyle Master / Detail bağantıya. Burada da ilişki mantığı  aynıdır. Bağlantıya geçmeden önce tablonun BeforePost olayında yapacağımız atamaları yapalım. Detaildeki Foreign key’li alana değer atamak dışında IBTablenin GeneratorField özelliği olmadığı için beforePost olayında sp aracılığıyla Generatordan değeri alıp ilgili alana atamalıyız. 3 tabloyu seçerek aşağıdaki ortakkodu BeforePost olayına yazıyoruz.

Kod: [Seç]
IF DataSet.Fields.Fields[0].IsNull then

Begin

SP_GEN.Params.ParamByName('TABLO_ADI').Value :=UpperCase(DataSet.Name);

SP_GEN.ExecProc;

DataSet.Fields.Fields[0].Value:=SP_GEN.Params.ParamByName('GEN_NO').Value;

end;

if UpperCase(DataSet.Name)<>'TBL_IL' then

if DataSet.Fields.Fields[1].IsNull then //ALANDA DEĞER YOKSA

DataSet.Fields.Fields[1].Value:=DataSet.DataSource.DataSet.Fields.Fields[0].Value;


Burada otomatik artacak alanın null olup olmadığı kontrol ediliyor. Null ise sp’ye dataset ismini büyük harfe çevirerek sp’nin giriş parametresine atanıyor. Büyük harfe çevirmemizin sebebi sp’deki şartta büyük, küçük farklılığı olmamasını sağlamak.

Dikkat ederseniz Detail datbloya değer atamadan önce datasetin master tablo olup olmadığı kontrol ediliyor. Maser Tablo ise işlem yapılmıyor.

IbTabledede Master tabloda bir farklılık yok. Normal bağlantıya dokunmayın. İlçeler tablosunu illere bağlamak içinse TBL_ILCE bileşenini seçip MasterSource özelliğinden iller tablosunu listeleyen DataSourceyi seçin. Alan bağlantılarını yapmak içinse yine tbl_ilce tablosunu seçip MasterFields özelliğini tıklayın. Bağlantıyı oluşturmak için aşağıdaki pencere karşınıza çıkacaktır.



ilişkiyi kurup OK’e tıklayın.

TBL_Semt bileşenini seçip MasterSource özelliğinden ilçeler tablosunu listeleyen DataSourceyi seçin. Alan bağlantılarını yapmak içinse yine tbl_semt tablosunu seçip MasterFields özelliğini tıklayın. Bağlantıyı oluşturmak için aşağıdaki ayarları yapın.

 

örnek uygulamayı çalıştırıp test edebilirsiniz.


Bu örnekteki semtler tablosunu iller tablosuna bağlamak isteseydik DataSource,Parametre veya MasterSource, MasterFields özelliklerini iller  tablosuna göre ayarlamalıydık. Veritabanı kısmında ise foreign keyi ilçeler tablosuna değil iller tablosuyla ilişkilendirmeliydik.
Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.

Çevrimdışı bymerag

  • Kıdemli Üye
  • *****
  • İleti: 301
  • Rep: +1/-1
  • Cinsiyet: Bay
Ynt: Firebird Master / Detail
« Yanıtla #1 : 01 Nisan 2007 16:38:36 »
sağol eline sağlık

Çevrimdışı alakel

  • Üye
  • ***
  • İleti: 20
  • Rep: +0/-0
Ynt: Firebird Master / Detail
« Yanıtla #2 : 05 Nisan 2007 19:24:14 »
merhaba ben bu dökümanı inceledim uyguladım ama bana göre çalışmadı. firebird kullanıyorum. pk ve fk larım var burda anlatıldığı gibi hazırladım. ama burda karışmış gibi geldi bana :Ibtable, Ibquery ve Ibdataset  hepsi birbirine karışmış. ben Ibdataset kullanarak master detail yapmak istiyorum. aslında yusuf akgül hocam bana master detail hazırladı çalıştı. ama oda foregein key kullanmadan yaptı. foregein key olmadığı için,  masterden kayıt sildiğimde detailden kayıt silinmiyor ve detail kayıtlar açıkta kalıyor. foregein key kullanmadan masterden sildiğimde detailden de nasıl silinir veya foregein key kullanarak çalışan bir master detail nasıl yapabilirim. yardımlarınız için şimdiden teşekkür ederim

Çevrimdışı Aktolgali

  • Kıdemli Üye
  • *****
  • İleti: 182
  • Rep: +2/-0
Master/Detail tablolara veri girişi nasıl ..
« Yanıtla #3 : 07 Haziran 2007 17:44:20 »
Ben bir şeyi yapamadım bu tabloları birbirine ekledik (master/detail) veri girişini nasıl yapacağız. Mesela yeni bir ile yeni bir ilçe ve yeni bir semt tanımlamak istiyoruz bunu formlar üzerinden nasıl yapacağız. Birkaç deneme yaptım ama hem görüntü kirliliğine sebep oldum (fazla ve gereksiz olduğunu düşündüğüm ama başka yolunu bilmediğim bileşenler yüzünden) hemde otomatik artan sayıyı bir türlü aşamadım (illa elle atayacağım o zamanda var olup olmadığını bilmediğimden hatalı veri giriyorum) bilenlerden yardım bekliyorum.
Eyvallah..

Çevrimdışı Kocaturk

  • Administrator
  • *****
  • İleti: 2.474
  • Rep: +56/-5
  • Cinsiyet: Bay
    • Delphi Dünyası
Ynt: Master/Detail tablolara veri girişi nasıl ..
« Yanıtla #4 : 07 Haziran 2007 18:17:30 »
Şimdi neyi nasıl denediğin pek belli değil o yüzden şöyle söyleyebiliriz;

Master/Detail (Ana/Ayrıntı) yapıda temel mantık şu dur adında da anlaşılacağı gibi bir  Ana tablo ve bu ana tabloya bir alanından bağlı ayrıntı tablo hatta ayrıntının ayrıntısı şeklinde bir hiyerarşi vardır.
senin örneğe göre durum özetlemek gerekirse

ILLER  adlı tablo master tablo ve bu tabloda

ID(AutoInc)
ADI(String)
Bölgesi(String)
Komşuları(string)
PlakaNo(Integer)
.
.
.
.
.

şeklinde alanlar olduğunu varsayalım

ILCELER Tablosunda

ILADI(String)
ADI(String)
SEMTSAYISI(Integer)
.
.
.
.
alanlarımız var

ve SEMTLER Tablomuzda da

ILADI(String)
ILCEADI(String)
ADI(String)
MAHALLESAYISI(Integer)
.
.
..
alanlarımız olsun

kullandığın VT yapısına göre bunları master/Detail bağlamak için mantık olarak kullanacağın alanlar zaten belli

IL tablosu ILCELER in masterı olduğuna göre
IL.ADI->ILCELER.ILADI alanlarından birbirine bağlıyorsun
aynı şekilde
ILCELER.ADI->SEMTLER.ILCEADI alanlarından bağlıyorsun.

Veri ekleme düzenleme,silme olaylarına gelince Master tabloya Bağımsız bir tabloymuş gibi yani iller ekleyebilirsin ama il silerken hiyerarşi takip ederek önce bağlı tablolardaki veriyi sonra ilgili ili silmelisin aksi takdirde ayrıntı tablolarda lüzumsuz veri kirliliği oluşturursun.

Ayrıntı tablolarda ise doğal olarak bağlı alanlarda ki veri aynıdır dolayısı ile veri eklerken bağlantılı alanı kullanıcıdan bağımsız eklemelisin,düzenlerken bağlı alanın düzenlenmesine müsaade etmezsin.

örneğin
Kod: Delphi
  1.  
  2. Table_ILCELER.Insert;
  3. Table_ILCELER.FieldByName('ILADI').Value := Table_ILLER.FieldByName('ADI').Value;
  4. Table_ILCELER.FieldByName('ADI').Asstring := Edit1.Text;
  5. Table_ILCELER.FieldByName('SEMTSAYISI').Value := StrToInt(Edit1.Text);
  6. Table_ILCELER.Post;
  7.  
  8.  

şeklinde ayrıntı tabloya veri girebilirsin ayrıntı tablodan da veri silerken önce bağlantılı tablolardaki veriyi silmelisin.

umarım bu şekilde anlaşılır olmuştur.



« Son Düzenleme: 07 Haziran 2007 18:18:42 by kocaturk »

Çevrimdışı Aktolgali

  • Kıdemli Üye
  • *****
  • İleti: 182
  • Rep: +2/-0
Ynt: Master/Detail tablolara veri girişi nasıl ..
« Yanıtla #5 : 07 Haziran 2007 23:56:05 »
Sayın KocaTürk;
İlginiz ve cevabınız için teşekkür ederim ama anlamakta zorlanıyorum (bu cümlemden, siz, benim acemi olduğumu anlamışsınızdır) ekte bir dosya gönderiyorum küçük bir örnek olsun (Fatih hocanın makalesinden hazırladım) burada bana veri eklemeyi gösterebilir misiniz?
Tekrar teşekkür ediyorum.
http://dosyam.net/?id=9nxfgd

Eyvallah..

Çevrimdışı mudipasa

  • Kıdemli Üye
  • *****
  • İleti: 74
  • Rep: +0/-1
Ynt: Firebird Master / Detail
« Yanıtla #6 : 11 Kasım 2007 23:59:54 »
fatih beye IBDataSet ile sizin sayenizde ve bazı arkadaşlarımızın sayesinde Master Detail olayını çözdüm. cxGrid de gösterme olayınıda yaptım. yalnız iki sorum var :
1) ExpandButonsForEmtyDetails=False yaptığımda detail i boş olanlarda + işareti görünmüyordu. IBDataSet te olmadı.
2) Aynı şekilde cxGrid in AutoDataSetFilter = True yaptığımda filtreyi aynı zamanda tableyede uyguluyordu ama IBDataSet olduğunda yapmıyor.
Lütfen yadım edin. Firebirde ve IBDataSet e yeni giriş yaptım. Paradoxtan kurtuldum derken bu iki sorun benim canımı sıktı.

Çevrimdışı azizn

  • Kıdemli Üye
  • *****
  • İleti: 57
  • Rep: +0/-1
Ynt: Firebird Master / Detail
« Yanıtla #7 : 07 Ekim 2008 12:15:57 »
Mrb arkadaşlar.Öncelikle hepinize kolay gelsin.
Sorum şu;
bir proje var
A-B-C  kurumlarının  olduğu, bu kurumlarla ilgili X-Y-Z alanlarına her ay(OCAK-ŞUBAT ...) farklı farklı değerlerin girileceği bir proje var.
Yani her kurum için yılda 12 defa ilgili alanlara veri girilecek.Kurum sayısı arttıkça tablodaki düzensiz veri girişide artacak.
Delphi-firebird 2.0-İbexpert Personal  kullanıyorum.Şimdi bu tabloyu master-detail şeklinde nasıl yapabilirim.Acemi olduğum ve master-detail ilişkisinin ince mantığını kavrayamadığım için olayı çözemedim.Yardımcı olursanız memnun olurum.
Birde konuyla çok bağlantılı değil ama yinede sorayım;Firebird'de oluşturulmuş bir veri tabanı içinde maximum oluşturulabilecek table sayısı varmıdır.Yani bir database'de örneğin 20 tane tablo oluştursak,zararlımıdır,kapasiteyimi doldurur.Küçük çaplı bir Sağlık kurumları için projem var.Personel kayıtları tablosu-personelin sevk isteği tablosu-izin talebi tablosu-sağlık ocağında aylık yapılan istatistiklerle ilgili birbirine bağlantılı 5-6 tablo 'nun olduğu(ortalama 10-15 arası table olan) bir proje var.Bunları birbiri ile ilişkili olanları ayırıp bir kaç database ile mi,yoksa tek database içinde 10 tablo yaparakmı daha kullanışlı olur diye sorsam?Bu sorunun cevabı Firebird kullanılan bir proje ile MS SQL server yada Oracle kullanılan bir projede değişir mi?
Saygılar
Saygılar

Çevrimdışı cosmopolich

  • Yeni Üye
  • *
  • İleti: 11
  • Rep: +0/-0
Ynt: Firebird Master / Detail
« Yanıtla #8 : 13 Ocak 2009 12:40:06 »
arkadaşım ellerine sağlık güzel bir döküman olmuş.

Çevrimdışı cosmopolich

  • Yeni Üye
  • *
  • İleti: 11
  • Rep: +0/-0
Ynt: Firebird Master / Detail
« Yanıtla #9 : 15 Ocak 2009 18:28:07 »
hocam döküman süper olmuş ellerine sağlık.

Çevrimdışı cosmopolich

  • Yeni Üye
  • *
  • İleti: 11
  • Rep: +0/-0
Ynt: Firebird Master / Detail
« Yanıtla #10 : 06 Şubat 2009 17:36:28 »
fatih hocam eline sağlık güzel bir döküman olmuş.