Key violation hatası

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Tahsinzencir
Üye
Mesajlar: 48
Kayıt: 15 May 2009 12:16

Key violation hatası

Mesaj gönderen Tahsinzencir »

paradox veri tabanı kullanıyorum aşağıdaki örnek çalışmada vt. ilki kaydediyorum ikinci kayıtta key violation hatası alıyorum ve vt. kayıt yapmıyor yardım lütfen
İrsaliye.rar
(388.7 KiB) 65 kere indirildi
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Key violation hatası

Mesaj gönderen ertank »

Merhaba,

Delphi7 ve Borland Database Engine bilgisayarımda yüklü olmadığı için Notepad++ içinden kodlarınızı incelemeye çalıştım.

Hatayı hangi form içinde aldığınızı belirtmemişsiniz. Ben aşağıda gözüme çarpan ilk olası hata noktası ile ilgili öneride bulunacağım. Eğer hata aldığınız yer farklı ise neresi olduğunu belirtmeniz gerekir.

"Key Violation" hatası database motoru ile ilgilidir. Eğer siz tablonuzda bir kolon için "Unique" (aynı değer değer iki satıra birden kaydedilemez) şeklinde tanım yaptı iseniz (Tasarım ekranında, satırında yıldız karakteri "*" olan kolonlar unique kolonlardır) ve bu alana iki defa aynı değeri kaydetmek isterseniz database sistemi tablo tanımındaki yapıya uyabilmek için kayıt girmez ve size sebebini hata ile bildirir.

Sorunuzun içeriğinde tablo yapınızı bildirmediğiniz ve kullandığınız database tablolarını ben açamadığım için bu sorunu nerede yaşıyor olabilirsiniz tahminde bulunamıyorum.

Gördüğüm kadarıyla kodunuzda birçok "tavsiye edilmeyecek" kullanım var. Probleme yönelik olarak öncelikle aşağıdaki düzeltmeleri yapıp daha detaylı bilgi vermenizi tavsiye ederim.

Unit2.Pas içinde Button1Click() olayında (Kaydet butonu) aşağıdaki şekilde düzenleyin:

Kod: Tümünü seç

if (Table1.Status <> dsEdit) and (Table1.Status <> dsInsert) then Exit;
Table1Evrak.AsString:=E1.Text;
Table1HTipi.AsString:=E2.Text;
Table1HTanim.AsString:=E3.Text;
Table1BSantiye.AsString:=E4.Text;
Table1HKodu.AsString:=E5.Text;
Table1HarTipi.AsString:=E6.Text;
Table1IrNo.AsString:=E7.Text;
Table1MalNo.AsString:=E8.Text;
Table1Malzeme.AsString:=E9.Text;
Table1Miktar.AsString:=E10.Text;
Table1Durum.AsString:=E11.Text;
Table1.Post;
Tahsinzencir
Üye
Mesajlar: 48
Kayıt: 15 May 2009 12:16

Re: Key violation hatası

Mesaj gönderen Tahsinzencir »

Hocam hata ("Unique" ) tanım yapmadığım halde hata alıyorum oysa bazı alanlara zaman zaman Aynı değerleri girmem gerekiyor, key'i kaldırmadan bunu nasıl sağlarım
if (Table1.Status <> dsEdit) and (Table1.Status <> dsInsert) then Exit; saatır çalışmadı
Status yerine state kullandım Program çalışıyor ancak işlem görmüyor aynı Hatayı veriyor. Teşekkürler
AfterPost
Üye
Mesajlar: 144
Kayıt: 12 Tem 2014 10:22

Re: Key violation hatası

Mesaj gönderen AfterPost »

irNo alanın zorunlu alanına index vermişin ve bu alana veri girişi yapmadığın zaman bu hatayı alman normal. veri girişi yaparken mükerrer kayıt girersende bu hatayı alırsın.
1) önce tablo.insert moduna al
2) sonra post yaptır
aynı anda hem insert hem de post olmaz. tek butonda bunu yapmaya çalışmışın.
m_yaprakci

Re: Key violation hatası

Mesaj gönderen m_yaprakci »

Merhaba.
Bence öncelikle paradox veritabanı kullanmaktan vazgecmelisiniz. Paradox hemen hemen tüm delphicilerin ilk göz ağrısı olsa da aynı zamanda ilk baş ağrısıdır da. Bunun yerine ADO bileşenleri ile MSACCESS kullanabilirsiniz. Bu aynı zamanda query, table yapılarını da öğrenmenizi kolaylaştıracaktır. MSAccess birçok güncel veritabanı ile şekil ve yapı açısından benzerdir.

Gelelim sorununuza:
İlk olarak table.append dedikten sonra tek tek atamanıza gerek yok. Edit bilesenlerini kaldırıp DBEdit bileşenlerini kullanın ve bunları direkt olarak tablonuza bağlayın. (Dataset / Datasource kısmından)

AfterPost'un dediği gibi:
irNo alanın zorunlu alanına index vermişin ve bu alana veri girişi yapmadığın zaman bu hatayı alman normal. veri girişi yaparken mükerrer kayıt girersende bu hatayı alırsın.
1) önce tablo.insert moduna al
2) sonra post yaptır
aynı anda hem insert hem de post olmaz. tek butonda bunu yapmaya çalışmışın.
index olarak belirlediğin bir alanı boş bırakamaz veya aynı kaydı iki kez giremezsin.

Hatayı kontrol altına almak istersen TRY / EXCEPT kullanabilirsin.
ORNEK:

Kod: Tümünü seç

Try
//kodlarımız burada
//kodlarımız burada
Except
on E: Exception do
// hata olursa burayı çalıştır. aynı zamanda E değişkenine hata durumunu aktar ki hata konusunda
// bilgi sahibi olalım ve kullanıyıca ona gore hata iletisi gösterelim.
ShowMessage(E.ClassName+' İşlem esnasında hata oluştu ve işlem tamamlanamadı. Hata Mesajı: '+E.Message);

// E'yi if bloguna da alabiliriz.
// if  pos('Key violation', E.Message)>0 then 
// ShowMessage(E.ClassName+' Key violation hatası verdim :D Hata Mesajı: '+E.Message);
End;
Except kısmı Debug yaparken (F9 ile) hatayı bilgi amaclı bize gosterir, fakat Release (Shift+Ctrl+F9) halinde gostermez.
AfterPost
Üye
Mesajlar: 144
Kayıt: 12 Tem 2014 10:22

Re: Key violation hatası

Mesaj gönderen AfterPost »

Merhabalar, bana kalırsa MSACCESS ile paradox arasında fazla bir fark yok , yeni başlayanlar için paradox dan başka bir alternatif yok gibi.
paradox da kendini geliştirirken firebird e göz kırmak gerekiyor . En köklü ve kalıcı çözüm şüpesiz ki Firebird.
Cevapla