işlemi olan stoğun silinmesini engellemek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
must_sargin
Üye
Mesajlar: 216
Kayıt: 14 Şub 2004 03:13
Konum: Gebze
İletişim:

işlemi olan stoğun silinmesini engellemek

Mesaj gönderen must_sargin »

s.a. arkadaşlar
yapmak istediğim satis tablosunda kaydı olan bir stoğun stok tablosundan silinmesini engellemek.forumda aradım ancak bulamadım.acaba nasıl bir mantık izlemeliyim.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
forign key, referational integrity (umarım yanlış yazmamışımdır) forumda aratın. :wink:
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
must_sargin
Üye
Mesajlar: 216
Kayıt: 14 Şub 2004 03:13
Konum: Gebze
İletişim:

Mesaj gönderen must_sargin »

foreign keyde cascadeyi ayarladığımda stoğu sildiğimde otomatik olarak satış tablosundan o stok bulunan tüm satışlarda siliniyor.acaba ne yapmam gerekiyor.tablonun beforedelete olayına query bağlayıp kontrol ettirsem olurmu?
serkan
Üye
Mesajlar: 666
Kayıt: 10 Tem 2003 12:08
Konum: bursa

Mesaj gönderen serkan »

stok kartları tablosuna bir trigger koyarak yapabilirsin.en garanti yol bul on delete olayında hareket tablosuna bakarsın tabloda bilgi var ise hata istisnası oluşur..
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

Hayir, kesinlikle foreign key kullanmalisiniz.

Cascade özelligi, zaten silindiginde ilgili kayitlarin silinmesi icin var, cascade isaretini kaldirin. Ayrica hangi veritabanini kullaniyorsunuz? MS-SQL ise checkbox seklinde de o yuzden ;)

Trigger'a gelince, bildigim kadariyla, triggerda ilgili kaydin olup olmadigini kontrol ederken yazacaginiz SQL kodu tum tabloyu arayacaktir, eger trigger kullanacaksaniz,

Kod: Tümünü seç

SELECT COUNT(STOKREFNO) FROM SATIS WHERE STOKREFNO = 15
gibi bir ifade kullanip COUNT degerini kontrol ederseniz, bu bir yavaslamaya sebep olacak cünkü COUNT yaparken tum tabloyu sonuna kadar arayacak, o yuzden IFEXISTS (MSSQL de boyle digerlerinde bilmiyorum) seklinde ifade kullanmalisiniz ki en ufak bir kayit oldugunda hemen result TRUE olur yani tum tabloyu kontrol etmez bu da performansi artirir.. Ama tabiki bence hepsi gereksiz cunku foreign key kullanmaniz en mantiklisi.

Kolay gelsin.
Kullanıcı avatarı
selimr
Üye
Mesajlar: 556
Kayıt: 16 Eki 2003 02:07

Mesaj gönderen selimr »

procedure stoksil

eger hareket tablosunda count = 0 ise sil
değilse
bu kaydı silemezsin çünkü hareketi var..

gibi...
must_sargin
Üye
Mesajlar: 216
Kayıt: 14 Şub 2004 03:13
Konum: Gebze
İletişim:

Mesaj gönderen must_sargin »

veritabanı için ibexpert kullanıyorum.foreignkey kısmında no action,cascade,set null,set default değerleri var.no action olunca hiçbirşey yapmadan kayıt siliniyor.acaba nasıl yapmalıyım?
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

no actinda eğer bağlı kayıt varsa silinmez.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
must_sargin
Üye
Mesajlar: 216
Kayıt: 14 Şub 2004 03:13
Konum: Gebze
İletişim:

Mesaj gönderen must_sargin »

bu kısımda hata mesajını nasıl verdirebilirim ?
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

hata mesajini verdirmeyi try except blogunla yapabilirsiniz.. Zaten eger veritabani kisminda foreign key düzenlemesini yaptiysaniz veritabananiniz exception olusturacaktir.

Try
.
.
AdoQuery.ExecSQL;
except
On E: Exception do
begin
ShowMessage(E.Message);
.
.
end;
end;
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Mesaj gönderen Ali Erdoğan »

Bu konuda en sağlam çözüm stok tablosunda silme işleminden önce çalışan bir trigger ile olur. Bu trigger ile bir hata fırlatabilirsin.
must_sargin
Üye
Mesajlar: 216
Kayıt: 14 Şub 2004 03:13
Konum: Gebze
İletişim:

Mesaj gönderen must_sargin »

bencede en güzeli stok tablosunun beforedelete olayına trigger yazmak.bir türlü işin içinden çıkamadım.
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

Kesinlikle katilmiyorum trigger ile yapmamaya calisin. Foreign key kullanimini ogrenin beceremiyorsaniz en son care onu deneyin.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Glen yazdı:Kesinlikle katilmiyorum trigger ile yapmamaya calisin. Foreign key kullanimini ogrenin beceremiyorsaniz en son care onu deneyin.
@Glen haklı. Foreign Key (FK) tutarlı bilgi girişini sağlamak haricinde ilişkili bir kaydın silinip tutarsızlığa sebep vermemek için icat edilmiş bir özelliktir :idea: Fakat uygun FK yi oluşturmak lazım. Mesela

Kod: Tümünü seç

ALTER TABLE STOK_KART ADD CONSTRAINT FK_STOK_KART_BIRIM_ID FOREIGN KEY (BIRIM_ID) REFERENCES BIRIMLER (ID);
böyle olması gereken bir Stok ve Stok Birimleri tablosu FK oluşturmada;

Kod: Tümünü seç

ALTER TABLE STOK_KART ADD CONSTRAINT FK_STOK_KART_BIRIM_ID FOREIGN KEY (BIRIM_ID) REFERENCES BIRIMLER (ID) ON DELETE CASCADE;
derseniz Birimler tablosundan bir kayıt silinince sorununuzun tam tersi olarak tüm aynı birimdeki stok kart kayıtlarını da siler :idea: Benzer şekilde ON UPDATE CASCADE ile de master tablodaki bir değişiklik detay tablodaki tüm kayıtlara yansır :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
must_sargin
Üye
Mesajlar: 216
Kayıt: 14 Şub 2004 03:13
Konum: Gebze
İletişim:

Mesaj gönderen must_sargin »

bende bu konuya katılıyorum ancak yapmak istediğim silinirken kullanıcıya stok satış tablosunda yer almaktadır uyarısı vermesini sağlamak.ne denediysem halledemedim.çaresizlikten trigger kullanmak zorunda kaldım.
Cevapla