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ı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

unique index tanımlama ve hata yakalama

Mesaj gönderen haydarxxx »

Herkeze slm
Mükerre kayıt için forumda unique imiş ip ucu bende ondan yola çıkarak aramalar yaptım ama tam olarak biryere varamadım

Ibexpert tarfında new İndex diyerek TBL_GELIR(TABLOMDA) ADI_SOYADI bölümünü Included fields bölümüne alarak Unique bölümünü işaretledim ve _IDX1 adında bir index oluşturdum yada ben öyle zannediyorum çünkü ilk kez yapıyorum amacım ADI_SOYADI bölümüne aynı isimlerin girilmesini istemiyorum

delphi tarafında bu bölüme aynı adı girdiğimde delphinin uyarısı ile karşılaşıyorum

............unique index "_IDX1" process stopped........şeklinde
:roll: bu kayıt daha önce girilmiştir uyarısı verdirebiliriz.IBquery nin onPostError olayına

Kod: Tümünü seç

ShowMessage('Daha önce bu giriş yapılmış'); 
gibi bir uyarıyı nasıl verdiririz. _IDX1 index adına göremi yakaltacağız ,delphi tarafına nasıl bir kod yazılıyor .Teşekkürler
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

ApplicationEvents nesnesinin Exception olayında

If Pos('Unique index',e.Message)>0 tHEN
Showmessage('Bu kayıt daha önce girilmiş...');

diye kontrol yaptırabilirsin
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

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

Mesaj gönderen rsimsek »

Problem çözülmüş olsa da bir ilave yapmak isterim. Hata verip program sonlanıyorsa yani hata kontrolu derleyicide (delphi) ise bu durum hatayı net okumak haricinde pek kullanışlı olmayacaktır. Hata denetim kontrolunun sizde olması için Debug ayarlarından Stop on Delphi Exceptions'ı kapatmalısınız. Daha sonra da try / except-finally / end bloğu ile hatayı yakalayabilirsiniz. Verilen örnekte ise eşsiz/unique bir alan için aynı/mükerrer kayıt girişindeki hata mesajı OnPostError olay/event ında yakalanacaktır. Gerekli uyarı mesajını oraya koyabilirsiniz :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 »

hocam dediğiniz ayarı daha önce yapmıştım teşekkürler.şu an sorunsuz çalışıyor
Kullanıcı avatarı
spoke25
Üye
Mesajlar: 434
Kayıt: 16 May 2005 04:06
Konum: Bolu

Mesaj gönderen spoke25 »

Boyle Bir hata kontrolunde şöylebir durumda oalabilir sanırm
ramazan kaya
yerine
ramazan kaya yazsanız bu hata oluşmayacaktır ad ile soyad arasında iki bosluk verseniz hata oluşmayacaktır.
sadece uyarı babaından soyledim
Başlayan Herşey Birgün Bitmek Zorundadır.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

sy spoke25
doğru dersin.
bu arada bir şey daha sormak istiyorum aynı tabloda birden fazla alana 'Unique index' verilebiliyormu yada aynı tabloda yeni 'Unique index' indexleri ayrı ayrı tanımlana biliyormu.Örneğin ben ADI_SOYADI bölümünü 'Unique index'ledim aynı tabloda NUMARASI bölümünede aynı numaranın girilmesini istemiyorum burayada 'Unique index' i tanımlanabiliyormu.IBexper ile denedim ama olmadı :?
mucit
Üye
Mesajlar: 83
Kayıt: 24 Kas 2004 10:41
Konum: BURSA

Mesaj gönderen mucit »

Merhaba,

Kod: Tümünü seç

CREATE UNIQUE INDEX INDEKS_ADI ON TABLE_ADI (SAHA_ADI);
şeklinde bir table üzerinde birden fazla unique index tanımlayabilirsiniz. Fakat indexleyeceğiniz sahada daha önceden girilmiş veriler mevcutsa ve bu saha için farklı kayıtlarda aynı değer mevcutsa index oluştururken hata verecek unique indexi oluşturmayacaktır.

Kolay gelsin..
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Kod: Tümünü seç

CREATE UNIQUE INDEX INDEKS_ADI ON TABLE_ADI (SAHA_ADI); 
ApplicationEvents nesnesinin Exception damı belirteceğiz bunu.Nereye yazacağız :?: :oops:
mucit
Üye
Mesajlar: 83
Kayıt: 24 Kas 2004 10:41
Konum: BURSA

Mesaj gönderen mucit »

Merhaba,

Sanırım hata yakalama ile index oluşturma'yı birbirine karıştırdınız.

Indexi oluşturma işlemini IBExpert ya da benzeri bir araç içerisinden SQL editör ile

Kod: Tümünü seç

CREATE UNIQUE INDEX INDEKS_ADI ON TABLE_ADI (SAHA_ADI); 
kodunu yazıp çalıştırabildiğiniz gibi, kendi uygulamanız içerisinden

Kod: Tümünü seç

  Query.SQL.Clear;
  Query.SQL.Add('CREATE UNIQUE INDEX INDEKS_ADI ON TABLE_ADI (SAHA_ADI)');
  Query.ExecSQL;
şeklinde de yapabilirsiniz.

Hata yakalama işlemini ise yukarıda @yakgul ve @rsimsek gayet güzel açıklamışlar.

Kolay gelsin.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

CREATE UNIQUE INDEX "_IDX1" ON tbl_ogrenci (KURS_NO);

Kod: Tümünü seç

This operation is not defined for system tables.
unsuccessful metadata update.
STORE RDB$INDICES failed.
attempt to store duplicate value (visible to active transactions) in unique index "RDB$INDEX_5".
Hatası veriyor
mucit
Üye
Mesajlar: 83
Kayıt: 24 Kas 2004 10:41
Konum: BURSA

Mesaj gönderen mucit »

Merhaba,

Oluşturmak istediğiniz indexe daha önceden var olan başka bir indexin adını vermişsiniz. Aynı Veritabanı içinde table farklı dahi olsa aynı index adı kullanılamaz.

Kod: Tümünü seç

CREATE UNIQUE INDEX "_IDX1" ON tbl_ogrenci (KURS_NO);
yerine

Kod: Tümünü seç

CREATE UNIQUE INDEX tbl_ogrenci_IDX1 ON tbl_ogrenci (KURS_NO);
gibi bir isim verin.

Kolay gelsin.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

hocam IBexpert te New ındex diyerek TBL_OGRENCI den ADI_SOYADI bölümünü UNIQUE INDEX i oluşturmuştum adı _IDX1 index sql si

Kod: Tümünü seç

CREATE UNIQUE INDEX "_IDX1"
ON TBL_OGRENCI (ADI_SOYADI)
aynı tablo üzerinden ikinci bir index adı açamıyorum ki örneğin "_IDX2" adında

Kod: Tümünü seç

CREATE UNIQUE INDEX "_IDX2"
ON TBL_OGRENCI (KURS_NO)
şeklinde yazabileyim.Yani ben ikinci index i oluşturup bir ad veremiyorum :?
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

eşsiz/unique liği bozan bir kayıt var belkide :?: Aynı zamanda alan NOT NULL olmalı :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 »

Evet hocam bunu bende düşünmüştüm düzeltim oldu.teşekür ediyorum.Fakat bir eklemem daha olacak yaklanacak her UNIQUE için ayrı bir ApplicationEvents mi kullanamam gerekir yoksa tek ApplicationEvents temi yapmak gerekir.

Kod: Tümünü seç

a:integer;
b:string;
begin
If Pos('_IDX1',e.Message)>0 tHEN

b := QRY_GELIR.fieldbyname('ADI_SOYADI').asstring+'   kaydını daha önce girmişsiniz.Kaydı İptal Etmek İstermisiniz...';
a:=application.MessageBox (PChar(b),'Uyarı',mb_yesno+mb_iconstop);

if a=idyes then
begin
 QRY_GELIR.Cancel;
Showmessage('Kaydınız iptal Edildi...');
end;
kodum ApplicationEvents de buraya örneğin _IDX2 gibi yeni bir UNIQUE indexini nasıl yakalatabiliyoruz.(2. bir index i)
Cevapla