View Full Version : مشکل استفاده از تریگر
iamebadi
دوشنبه 03 مرداد 1384, 19:19 عصر
سلام به همه دوستان
من در جدولی 4 فیلد p,f,d,v دارم که می خوام اگه این سه فیلد p,f,d آپدیت شد حاصل تقسیم مقادیر این سه فیلد بر مقدار فیلد v را در فیلد x قرار بدهم. از تریگر زیر استفاده کرده ام ولی مقادیر اشتباه بر میگرداند و ثانیا فیلد x تمامی رکوردها را ویرایش می کند.
منتظر راه حل هستم.
CREATE TRIGGER AvgVote ON dbo.MobilePhones
FOR INSERT, UPDATE, DELETE
AS
Declare @divided int,
@divisor int,
@d int,
@f int,
@p int
if update(D) or Update (f) or Update(P)
select @d=cast(D as int),@f=cast(F as int),@p=cast(P as int)
from MobilePhones
Select @divisor=cast(V as int)
from MobilePhones
set @divided=@d+@f+@p
update MobilePhones
Set x=(@divided / (3*@divisor)) + (@divided %(3* @divisor))
iamebadi
دوشنبه 03 مرداد 1384, 19:34 عصر
در ضمن sqlserver تقسیم عدد صحیح بر عدد صحیح رو به صورت یک عدد صحیح می دهد و نه اعشاری.برای این که بخواهیم قسمت اعشار را هم در جواب داشته باشیم چکار باید کرد.
AminSobati
دوشنبه 03 مرداد 1384, 21:44 عصر
دوست عزیزم،
به Trigger نیازی ندارین، بلکه Computed Column این کار رو به خوبی انجام میده:
CREATE TABLE Test(
C1 Money,
C2 Money,
C3 Money,
C4 AS (C1+C2)/C3)
INSERT Test(C1,C2,C3) VALUES (2,4,9.5)
SELECT * FROM Test
iamebadi
دوشنبه 03 مرداد 1384, 23:46 عصر
آقای ثباتی عزیز ،با سلام
من در Enterprise Manager چطور می تونم کد نوشته شده شما رو اعمال کنم.آیا حتما باید کد رو در Query Analayzer اجرا کنم ؟ و در ضمن جواب بحث تقسیم رو هم اگه میشه لطف کنید ممنون میشم.
majid_afra222
سه شنبه 04 مرداد 1384, 08:53 صبح
سلام
برای تعیین فیلد محاسباتی، تو بخش Formula بنویسش.
و در مورد تقسیم یکی از فیلدها رو تبدیل به یک نوع دارای اعشار کن، مثلا اگه a, b, c هستن و c = a/b بصورت زیر بنویسش c= convert(numeric(7,2),a) / b). نتیجه حاصل از تقسیم به نوع داده بالاتر تبدیل می شه.
AminSobati
سه شنبه 04 مرداد 1384, 15:12 عصر
ترجیحا اگر از جنسهایی که اعشار میپذیرند برای فیلد استفاده کنین، به Cast یا Convert بی نیاز خواهید بود. چون این عمل در هر بار خوانده شدن مقادیر توسط دستور SELECT انجام خواهد شد (محاسبه Formula) و شما یک قدم جلو هستید!
iamebadi
سه شنبه 04 مرداد 1384, 16:38 عصر
thanks alot for cooperation
iamebadi
چهارشنبه 05 مرداد 1384, 20:21 عصر
سلام
من این تریگر را برای داشتن مقادیر درصدی ستون HitsCount در ستون Percent نوشتم ولی مقادیر 0 در ستون Percent ثبت می شود
CREATE TRIGGER UpdateHits ON [dbo].[Amar]
FOR INSERT, UPDATE, DELETE
AS
Declare @Sum as Bigint
if update(HitsCount)
select @Sum=Sum(HitsCount)
from Amar
update Amar
Set [Percent]=(HitsCount/@Sum)*(100)
AminSobati
پنج شنبه 06 مرداد 1384, 18:55 عصر
دوست عزیزم اگر ممکنه دستور ساخت جدول Amar رو بفرستین تا از ساختارش مطلع بشیم
majid_afra222
جمعه 07 مرداد 1384, 08:56 صبح
سلام
iamebadi عزیز، درصد یعنی تقسیم بر صد، نه ضربدر صد. جای ضرب و تقسیم رو عوض کن.
AminSobati
جمعه 07 مرداد 1384, 11:41 صبح
و جای 100 با Sum@ هم میبایست عوض بشه تا اصل فرمول صحیح از آب دربیاد!:
Set [Percent]=(HitsCount*100)/(@Sum)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.