ilişkili tablolarla ilgili

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
intelcihat
Üye
Mesajlar: 20
Kayıt: 01 Kas 2006 12:32

ilişkili tablolarla ilgili

Mesaj gönderen intelcihat »

Hayırlı günler,

ibExpert ile ilgili bir sorum olacaktı.
Şimdi iki tablom var.Bunları birbirleriyle ilişkilendireceğim.

mesela
a tablomda 1 kayıt var
b tablomda da 1.kayıtın 6 tane alt kayıtı var.Mesela a tablosundaki bir yolcunun yaptığı 6 farklı sefer b tablosunda tutuluyor.

Bunu yapamıyorum.
a tablosundaki yolcu_no ile b tablosundaki yolcu_no ilişkili ve :
b tablosuna yolcu_no kısmına 1 yazıyorum detayları yanındaki alanlara v.s. ama yolcu_no 1 diyip tekrar bir kayıt ekleyemiyorum hata veriyor.yolcu_no kısmına 2 girersem oluyor ki istediğim bu değil...

umarım anlatabilmişimdir.
yardımcı olursanız çok mutlu olacağım
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

a tablosundaki yolcu_no primary key olacak
b tablosundaki yolcu_no ise primary key olmayacak, ayni sekilde uniq index falan da olmayacak. bu sartlari saglarsan iki alan arasinda foreign key baglantisi kurabilirsin.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Her tabloda eşitsizliği bozacak birincil anahtar alan (primary key) olarak kullanılacak bir ya da birden fazla alandan oluşan (sen yolcu_no demişsin, aynı numaralı iki yolcu olamayacak) tanımlanmalı. İkinci tabloda ise eşsizliği bozmak için yolcu_no yanına, tarih_zaman eklenmeli. Yani ikinci tabloda (detay tablosu) primary key iki alandan oluşmalı. Bu durumda da aynı gün iki kez yolculuk yapma şansı olmaz. Eğer tarihi saati-dakikasi ile yazarsan o zaman aynı anda farklı iki yerde olamayacağına göre eşsizlik (unique) sağlanmış olur. foreign key (bağımlı alan) tanımlarken de b tablosunun yolcu_no alanına girilecek değerin ana tablo a tablosundaki yolcu_no lardan biri olabileceği tanımını yapman gerekecek. Bundan sonraki kısmını da delphi tarafından halletmen gerekir. Onun için de master detail diye aratırsan yeterli bilgiye ulaşabilirsin :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
intelcihat
Üye
Mesajlar: 20
Kayıt: 01 Kas 2006 12:32

Mesaj gönderen intelcihat »

Hocalarım Allah sizden razı olsun...
intelcihat
Üye
Mesajlar: 20
Kayıt: 01 Kas 2006 12:32

Mesaj gönderen intelcihat »

" Invalid insert or update value(s): object columns are
constrained - no 2 table rows can have duplicate column values.
attempt to store duplicate value (visible to active transactions) in unique index "RDB$PRIMARY46".
null segment of UNIQUE KEY. "

Mus_Adi primary key yapmak istiyorum bu hatayı veriyor iExpertte...

Problem nedir,niye birincil anahtar yapamıyorum?
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Firebird Master / Detail ile ilgili belki incelemişsindir bilmiyorum ama yinede bu link e bir uğra derim

viewtopic.php?t=9830&highlight=master
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Mus_Adi alanının eşsiz olmasını istediğinden böyle bir şey düşünüyorsan bu doğru değil :!: Primary key yapamazsın anlamında değil ama bir detay tablosu ile ilişkilendirmen gerektiğinde uygun ve kullanışlı olmaz. Eşsiz/unique olması için (ki aynı isimde birden fazla kayıt olacağını da düşünmek lazım :idea: ) ikinci bir indeks tanımlayıp eşsiz/unique özellik verebilirsin :idea: Yolcu_no diye ya da musteri_no, musteri_id, musteri_kodu diye verilebilecek alan birincil anahtar alan (primary key) alanı olmalı. Listeleme ve raporlama amaçlı kullanılacak diğer alanlara da ayrıca indeks tanımlamak yüzlerce binlerce kayıtlı tablolarda yüzde yüz perfomansa yansıyacaktır :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
intelcihat
Üye
Mesajlar: 20
Kayıt: 01 Kas 2006 12:32

Mesaj gönderen intelcihat »

şimdi ben isme göre veritabanında arama yapmak istiyorum da, sanırım primary key yapacağım alanın integer gibi sayısal bir tipe sahip olması gerekiyor? doğru mu?

bir arama formu olacak ve ben ismi girdiğimde veritabanından ilgili tablodaki musteri_adi kısmından adını bulup kayıtları gösterecek.

bunu nasıl halledebilirim ?
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

intelcihat yazdı:şimdi ben isme göre veritabanında arama yapmak istiyorum da, sanırım primary key yapacağım alanın integer gibi sayısal bir tipe sahip olması gerekiyor? doğru mu?...
Primary key olma zorunluluğu yok. Hatta herhangi bir indeks tanımlamak zorunda bile değilsin. Çünkü SELECT ile istediğin aramayı yapabilirsin. Veri tabanı motoru (burada firebird) çok sayıdaki kayıt içinden istenen kayıt/kayıtları getirmesi indeksli bir tablodan daha hızlı gelecektir. Ayrıca integer/sayısal değeri nereden çıkardınız :?: Hayır.
intelcihat yazdı:...
bir arama formu olacak ve ben ismi girdiğimde veritabanından ilgili tablodaki musteri_adi kısmından adını bulup kayıtları gösterecek.

bunu nasıl halledebilirim ?
Bahsettiğin formda belli ki bir Edit alanı olacak, genel kalıp

Kod: Tümünü seç

SELECT MUST_ADI FROM TABLO_ADI
WHERE MUST_ADI CONTAINING Editteki_Alan
şeklinde olacak :wink:

Kod: Tümünü seç

IBDataSet1.SelectSQL.Clear; // aynı zamanda IBDataSet i kapatır (close).
IBDataSet1.SelectSQL.Add('SELECT MUST_ADI FROM TABLO_ADI');
IBDataSet1.SelectSQL.Add('WHERE MUST_ADI CONTAINING ' + QuotedStr(Edit1.Text) );
IBDataSet1.Open;
Burada CONTAINING yerine LIKE veya = de kullanabilirsin. CONTAINING büyük/küçük harf ayrımına duyarsızdır :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
intelcihat
Üye
Mesajlar: 20
Kayıt: 01 Kas 2006 12:32

Mesaj gönderen intelcihat »

Hocam Allah razı olsun.
Daha yeni olduğum için biraz zorlanıyorum.

Tekrar teşekkürler... :)
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Öğrenme azmi karşısında zorlanmanın şansı yok :wink:
Parola şu olmalı: Zoru başarırım imkânsız zaman alır :)

Ha bu arada sorun çözüldü mü :?:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
intelcihat
Üye
Mesajlar: 20
Kayıt: 01 Kas 2006 12:32

Mesaj gönderen intelcihat »

Hocam Allah razı olsun tekrardan.Uğraşıyorum.Bugün bitireceğim inşallah.Daha doğrusu bir projem vardı da onu bitireceğim.Canına okuyacağım :)

hayırlı günler

selam ve hürmetlerimle
intelcihat
Üye
Mesajlar: 20
Kayıt: 01 Kas 2006 12:32

Mesaj gönderen intelcihat »

Hocam yine bir problemim var.

Dediğiniz kodları uyguladım çalıştırdığımda şöyle bir hata veriyor anlayamadım :

project project2.exe raised exception class EIBClientError with message 'Size Mismatch - Field MUS_NO size is too small for data'.
Process stopped.Use Step or Run to continue
tabii ben her ne kadar şu mus_no ile ilgisini anlamasamda,ne alakası var mus_no ile? Ben mus_adi kısmından aratacağım :(

bununla birlikte ben mus_no alanını sildim (dbgridten) ve yine çalıştırdım.çalıştı ama bu sefer kayıtları görüntülemiyor

bugün bitirmeliyim :cry:
intelcihat
Üye
Mesajlar: 20
Kayıt: 01 Kas 2006 12:32

Mesaj gönderen intelcihat »

project project2.exe raised exception class EIBInterBaseError with message 'Maximum user count exceeded.Contact your database administrator'.Process stopped.Use Step or Run to continue
hocam diğerini bir nevi hallettim ama 7-8 tane ayrı formum var ve dolayısıyla her birinde ibDatabase bileşenini kullandım.Bundan kaynaklanıyor olabilir mi?Bu hatayı nasıl çözebilirim?
intelcihat
Üye
Mesajlar: 20
Kayıt: 01 Kas 2006 12:32

Mesaj gönderen intelcihat »

intelcihat yazdı:
project project2.exe raised exception class EIBInterBaseError with message 'Maximum user count exceeded.Contact your database administrator'.Process stopped.Use Step or Run to continue
hocam diğerini bir nevi hallettim ama 7-8 tane ayrı formum var ve dolayısıyla her birinde ibDatabase bileşenini kullandım.Bundan kaynaklanıyor olabilir mi?Bu hatayı nasıl çözebilirim?
Arkadaşlar cevap verebilecek olan yok mu ?
burada tıkandım kaldım
Cevapla