trigger satır hatası

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

trigger satır hatası

Mesaj gönderen pasa_yasar »

Kod: Tümünü seç

CREATE TRIGGER [cariguncelle] ON [dbo].[carihareket] 
FOR INSERT, UPDATE, DELETE 
AS
declare @bakiye money
declare @borc money
declare @alacak money
declare @cid integer

select @cid=ID,@borc=borc,@alacak=alacak from INSERTED

set @bakiye=@borc-@alacak
update cari set borc=@borc,alacak=@alacak,bakiye=@bakiye
şeklinde bir trigger yazdım. ilk denemem sql server. grid satırın işlem kaydolacağı zaman "anahtar sütun bilgileri yetersiz veya yanlış.Güncelleştirme çok fazla satırı etkledi." hatasını veriyor. bu işlemi klasik while ile yaptığım zaman sorun olmuyor. cxgrid kullandım ve cari kodu ve adı cxdbextlookupcombobox ile seçiliyor. acaba bunu nasıl düzenleyebilirim. trigger konusuna biraz uzağım.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
bu yaptığın işlemi döngüye koyup o şekilde yapmalısın.
forumda örnekleri olması lazım.
bir cursor tanımlayıp inserted tablosundan alanları cursora atacaksın. cursor içinden kayıtları tek tek okuyup sadece ilgili cari kaydını update yapacaksın.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: trigger satır hatası

Mesaj gönderen sabanakman »

Kodlarını set nocount on..set nocount off arasına al.

Kod: Tümünü seç

CREATE TRIGGER [cariguncelle] ON [dbo].[carihareket] 
FOR INSERT, UPDATE, DELETE 
AS
declare @bakiye money
declare @borc money
declare @alacak money
declare @cid integer

set nocount on

select @cid=ID,@borc=borc,@alacak=alacak from INSERTED

set @bakiye=@borc-@alacak
update cari set borc=@borc,alacak=@alacak,bakiye=@bakiye

set nocount off

viewtopic.php?p=126886#126886

Düzeltme:Hakkımda "bu adam da başka bir şey bilmiyor mu yau?" gibi bir düşünceye kapılmayın. Bunu bulana kadar çektiğimi bir ben bilirim :twisted:
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

isteyen istediğini desin üstad. tecrübe yediğimiz kazıkların bileşkesi sonuçta.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Mesaj gönderen pasa_yasar »

tşk ederim çalıştı. fakat toplamlı yazıyor. borc ve alacak döngü başlarında nasıl sıfırlayabilirim. forumda arattırdım fakat bulamadım
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Sorgunun where'i nerede :shock: .

Veri tabanı ve tablo ilişkilendirme mantığını nasıl oluşturduğun hakkında en ufak bir tahminim yok ve kodlarından da anlaşılmıyor. Kullandığın kodlar çok karmaşık değil. Şöööyle dikkatli bir yoğunlaşmayla bunun altından rahatlıkla kalkabilirsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Mesaj gönderen pasa_yasar »

ilk defa trigger kullanıyorum. kodlaması hakkında hiçbir fikrim yok. sağdan soldan araştırarak yazdım. amacım cari fişindeki bütün carileri sıra ile denetleyecek.carilerin geçtiği bütün kayıtları fatura,borç dekontu,alacak dekontu vb. bütün bilgileri toplayıp carinin bakiyesine yazacak. where kullanıp kullanmamam gerektiğini ve nerede kullanacağımı bilmiyorum. bu konuda yardımcı olursanız çok sevinirim. daha sırada stored procedurlar o da ayrı bir mesele. projeyi yarın teslim etmek zorunda olduğum için yoğunlaşmak ve araştırmak şu anda büyük bir lüks olur daha bunun stok,banka,çek senet kasa üretim bölümleri var
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Aslında senin olayının ana teması gerekli sorguyu üretmek. Trigger ya da procedure kavramları sadece çalışma sırasında devreye girer. İçerik ise kodlama ile doldurulur :wink:
pasa_yasar yazdı:...carilerin geçtiği bütün kayıtları fatura,borç dekontu,alacak dekontu vb. bütün bilgileri toplayıp carinin bakiyesine yazacak...
Bu mantığa göre düzenlenen bilgide, silineni çıkarıp ekleneni toplamak yeter.

Kod: Tümünü seç

CREATE TRIGGER [cariguncelle] ON [dbo].[carihareket] 
FOR INSERT, UPDATE, DELETE 
AS 
--silinen ve eklenen değerler
declare @sil_bakiye money, @ek_bakiye money
declare @sil_borc money, @ek_borc money
declare @sil_alacak money, @ek_alacak money
declare @sil_cid int, @ek_cid int

set nocount on 

select @ek_cid=ID,@ek_borc=isNull(borc,0),@ek_alacak=isNull(alacak,0) from INSERTED
--eklenen kaydın değerleri

select @sil_cid=ID,@sil_borc=isNull(borc,0),@sil_alacak=isNull(alacak,0) from DELETED
--silinen kaydın değerleri

update cari set borc=borc-@sil_borc, alacak=alacak-@sil_alacak,bakiye=bakiye-(@sil_borc-@sil_alacak) where ID=@sil_cid
--silinen değerleri o cariden (@sil_cid) çıkar

update cari set borc=borc-@ek_borc, alacak=alacak-@ek_alacak,bakiye=bakiye+(@ek_borc-@ek_alacak) where ID=@ek_cid
--eklenen değerleri o cariye (@ek_cid) ekle

set nocount off
Not:Bir kayıt değeri değiştirişdiğinde, eski değer siliniyor gibi (from DELETED), yeni değer de ekleniyormuş (from INSERTED) çalıştığından kayıt değişikliklerinde her iki tablodan da değer okunmaktadır. Bu kodları biraz incelersen işin mantığının çok zor olmadığını anlarsın. Kolay gelsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Mesaj gönderen pasa_yasar »

verdiğiniz bilgi için tşk ederim. işi biliyorsunuz gerçekten. fakat yine aynı sorun var. fişte iki cari girdiğim zaman birincisini 100 ytl borçlandırıyorum. ikincisinide 100 ytl borçlandırıyorum. birincisine 100 ytl borç yazıyor. ikincisine 200 ytl

kodu adı bakiye
-----------------------------------------------------
01 mustafa 100 (B)
02 hakan 200 (B)

ikisine 100 ytl borç girmiştim. acaba nedeni nedir. verdiğiniz kod çalışıyor çok tşk ederim ama böyle bir sorun var. toplamlı hesaplıyor.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

bu testi kod yazılmamış boş bir projede de yapmanı tavsiye ederim. Eğer aynı sorun devam ederse tüm veriler önünde. Otur karşısına adım adım kafa patlat. Bundan sonrasında top sende artık.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla