unique index tanımlama ve hata yakalama

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Aynı yerde

Kod: Tümünü seç

...
If Pos('_IDX1',e.Message)>0 tHEN 
...
ile başlayan bloktan sonra, bir de

Kod: Tümünü seç

...
If Pos('_IDX2',e.Message)>0 tHEN 
...
başlatacağın bir blok ile kontrol edebilirsin :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

teşekkürler hocam
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Hocam bir şey daha soracağım UNIQUE olarak tanımladığımız alana aynı veriyi giremiyoruz.
Master\Detail tablolama da aynı veri girme durumuz olacak (detail Tablosuna ) şöyleki

Kod: Tümünü seç

TBL_OGRENCI    TABLOM (MASTER) 
OGRENCI_ID * 
ADI_SOYADI 
SINIFI 

TBL_DERSLER    TABLOM (DETAY) 
DERS_ID 
OGRENCI_ID * 
DERS_GIRIS 

* Olanlar ortak key 

OGRENCI_ID          ADI_SOYADI                   SINIFI 
1                        abc                  2A 
2                        abd                 2C 
3                        abe                 2A 
4                        abf                  2A 

DERS_ID               OGRENCI_ID             DERS_GIRIS 
 1                         1                  TURKCE 
2                          1                MATEMATIK 
3                          1                RESIM 
4                          2                  TURKCE 
5                          2                  FEN 
6                          2                RESIM 
7                          3                  TURKCE 
8                          3                MATEMATIK 
9                          3                 FEN 
10                        4                 SOYAL 
11                        4                MATEMATIK 
12                        4               FEN 

ana tablomuzda ADI_SOYADI bölümü UNIQUE indexi,detay tablomuzdaki DERS_GIRIS bölümünüde UNIQUE indexi yaparsak aynı dersi tekrar giremeyiz master tabloda farklı bir kayıt olsa dahi.örneğin burada aynı tablo içinde birden fazla TURKCE girilmiş istiyorum ki sadece bir kişiye birden fazla TURKÇE girilmesin bunu indexle nasıl ayarlayabiliriz.Teşekkürler
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Dersler tablosundaki OGRENCI_ID + DERS_ID alanlarının ikisini birlikte PK (Birincil İndeks - Primary Key) olarak kullanabilirsin. Master/Detay yapısında ise sadece OGRENCI_ID leri ilişkilendirmen yeterli olacak. Bu şekilde OGRENCI tablosunda herhangi öğrenciyi seçtiğinde DERSLER tablosunda o OGRENCI_ID ye ait kaç tane ders kayıtı varsa hepsi gelecektir. OGRENCI_ID + DERS_ID tekil (unique, PK) olduğundan her dersten bir adet olabilecek. Birden fazla yıl yada yarıyıl olma durumunda PK ya YIL ya da YARIYIL diye bir alan daha ilave etmen gerekecektir :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Hocam Tablo ilişkim dediğiniz gibi (Dersler tablosundaki OGRENCI_ID + DERS_ID alanlarının ikisini birlikte PK (Birincil İndeks - Primary Key) ) ve OGRENCI tablosunda herhangi öğrenciyi seçtiğinde DERSLER tablosunda o OGRENCI_ID ye ait kaç tane ders kayıtı varsa hepsi geleliyor.Ama ben detail tablosuna (DERSLER )şu kod ile ders ataması yapıyorum

Kod: Tümünü seç

procedure TForm1.DBLookupComboBox1Click(Sender: TObject);
begin
QRY_DERSLER.append;
QRY_DERSLER.FieldByName('DERS_KATILIM').Value:=DBLookupComboBox1.Text;
QRY_DERSLER.FieldByName('HF_SAAT').Value:=FORM2.QRY_DERSGIRIS.FieldByName('HF_DERS_SAATI').Value;
QRY_DERSLER.post;
QRY_DERSLER.refresh;
IBTransaction1.CommitRetaining;
  end;
burada ders ataması yaptığım tabloda aynı dersin aynı kişiye tekrar atanmasını nasıl engelleyebilirim.Teşekkür ediyorum
palandoken
Üye
Mesajlar: 151
Kayıt: 16 Eki 2006 10:43
Konum: ERZURUM

Mesaj gönderen palandoken »

Arkadaşlar yukarıdaki mesajları okudum.Benim Index tanımlama hakkında pek bilgim yok bunun için ben mükerrer kayıt olayını şu şekilde yapıyorum.

Kod: Tümünü seç

   if IBTable1.Locate('AdiSoyadi',Edit1.Text,[]) then
      showmessage('Bu isimde bir kayıt var.Başka bir kayıt girin.')
   else
      //kaydet kodları
Böyle olmazmı.Bu kod çok mu acemice.Ne dersiniz.
akıllanma , aklını başına toplama , toparlanma , kendisini derleme bu dünyaya ait bir vazife.
ahirette nasıl olsa aklın başına gelecek.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Olur tabi ki. Fakat aynı DataSet le değil de farklı bir DataSet (IBTable2 gibi) ile yapmak gerekiyor. Çünkü yeni kayıt gilgilerini girdiğiniz DBGrid veya DBEdit ler önceki DataSet (IBTable1) e bağlı olacak. İsterseniz bu kontrol işini veritabanına yıkıp, eşsiz/unique indeks yapısının aynı/tekrarlayan/mükerrer kayıta zaten izin vermeyecektir. OnPost Error da da mesajı yakalarsiniz :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla