PDA

View Full Version : نوشتن یک Trigger



MajidAzadiYazdi
پنج شنبه 22 مرداد 1388, 12:38 عصر
نوشتن یک Trigger با موضوع زیر:
(ما سه جدول به نام های
دانشجو: با فیلدهای کد دانشجو ، نام و ...
درس :با فیلدهای کد درس ، نام درس و ...
دانشجو درس :با فیلدهای کد دانشجو ،کد درس، سال تحصیلی ،ترم،نمره را داریم)
حال می خواهیم یک تریگر بنویسیم که :
دانشجویی که در ترمی مشروط می شود در ترم بعد نتواند بیشتر از 14 واحد بگیرد.

محمد سلیم آبادی
پنج شنبه 22 مرداد 1388, 19:40 عصر
سلام.
برای این منظور شما می توانید از INSTEAD OF INSERT trigger استفاده کنید.
باید واحد هایی که دانشجو در این ترم اخذ کرده است را با واحد درس ای که سعی در انتخاب آن دارد جمع کنید و اگر بیش از 14 شد مانع از درج در جدول شوید.

اگر واقعا نمی توانید query بنویسید که واحد های دروس انتخاب شده دانشجو در ترم جاری را بدست آورد یا اینکه معدل ترم گذشته را لطفا جداول خود را در این تاپیک ارسال کنید.

MajidAzadiYazdi
جمعه 23 مرداد 1388, 08:29 صبح
با عرض سلام
موضوع نوشتن query نیست
من هم هیچ گونه آشنایی با دستورات Trigger ندارم
اما جداول:
1 - جدول STT با ستون های زیر :
STID , STNAME , STFAMIL , STMJR , STDEG , STDEID
2- جدول COT با ستون های زیر :
COID , CONAME, COVAHED , COTYPE , CODEID
3- جدول STCOT با ستون های زیر :
STID , CO ID , YEAR , TERM , GRADE

و اما توضیحات این جداول :
STT : نام جدوا دانشجو
COT: نام جدول درس
STDEG: نام دوره تحصیلی (کارشناسی، ارشد ، دکترا)
STDEID:شماره گروه آموزشی
CODEID:شماره گروه آموزشی
STMJR: نام رشته تحصیلی

:لبخندساده:

محمد سلیم آبادی
جمعه 23 مرداد 1388, 10:59 صبح
حد اقل یک نمونه از داده های هر سه جدولت برای ما ارسال کنید.
برای این منظور باید result کوئری را در Text قرار دهید و سپس در word کپی کرده و از آنجا به تگ کد انتقال دهید.

محمد سلیم آبادی
جمعه 23 مرداد 1388, 12:41 عصر
CREATE TRIGGER trg_i_STCOT
ON STCOT
INSTEAD OF INSERT
AS
BEGIN
DECLARE @avg int, @SumVaheds
SELECT s.STID, @avg=SUM(c.COVAHED*s.grade)/sum(c.COVAHED)
FROM STCOT s INNER JOIN [COT] c
ON s.COID=c.COID
WHERE STID=(SELECT STID FROM Inserted)
AND Term=(SELECT Term FROM Inserted)-1
GROUP BY STID

SELECT @SumVaheds=SUM(c.COVAHED)
FROM STCOT s INNER JOIN [COT] c
ON s.COID=c.COID
WHERE STID=(SELECT STID FROM Inserted)
AND Term=(SELECT Term FROM Inserted)
GROUP BY STID

IF @avg<12
AND @SumVaheds+ (SELECT COVAHED FROM [COT]
WHERE COID=
(SELECT COID FROM Inserted))<=14
INSERT STCOT
SELECT STID, COID, [Year], Term, Grade
FROM Inserted
END

MajidAzadiYazdi
جمعه 30 مرداد 1388, 12:42 عصر
با عرض سلام و خسته نباشید
من دستوراتی را که گفته بودید در sql نوشتم اما موقع اجرا به error زیر برخورد کردم .

Msg 141, Level 15, State 1, Procedure trg_i_STCOT, Line 8
A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations
البته چند error دیگر هم میداد که با تغییر خط (DECLARE) به شکل زیر مشکل رفع شد :

DECLARE @avg int, @SumVaheds int

اما حالا نمی فهمم پیغام بالا برای چیست ؟؟؟؟:گریه:

محمد سلیم آبادی
جمعه 30 مرداد 1388, 12:58 عصر
دوست من، من این کد ها را بدون داشتن جداول خارجی نوشته ام طبیعی است که بدون Error اجرا شوند!

به جای این خط در کد مورد نظر


SELECT s.STID, @avg=SUM(c.COVAHED*s.grade)/sum(c.COVAHED)


این خط را استفاده کنید


SELECT @avg=SUM(c.COVAHED*s.grade)/sum(c.COVAHED)

محمد سلیم آبادی
جمعه 30 مرداد 1388, 13:14 عصر
البته بگم این راه اصلی نیست که من به شما پیشنهاد کردم.

روش اصلی این است که در یک View شما لیست دانشجویان و معدل ترمهای مختلف را داشته باشید و در trigger از این ویو برای بدست آوردن معدل استفاده کنید.

ولی من این ها را در یک trigger خلاصه کردم.