الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Using Triggers

بدأه TheBestBenz في 28 أكتوبر 2010 · 6 رد · 947 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته

ندخل في الموضوع الجداول كالاتي

جدول قطع الغيار

post-224322-031532400 1288255443_thumb.j

جدول المصروفات لقطع الغيار

post-224322-075496700 1288255405_thumb.j

العلاقة بينهما

post-224322-035763600 1288255424_thumb.j

أحاول جاهدا عمل قادح Trigger يقوم عند حذف أي صف من جدول المصرفات بإرجاع الكمية الى جدول قطع الغيار إليكم إحدى محاولاتي الفاشلة

ALTER TRIGGER [dbo].[Trg_AddOnDelete] 
   ON  [dbo].[Consumes] 
   AFTER DELETE
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for trigger here
DECLARE @D_Qty Float, @ID Int, @I Int

SET @I = (SELECT COUNT(*) FROM deleted)


While    @I > 0
begin    


Select  @ID    = (Select deleted.spare_ID from deleted, W_Consumes where deleted.Spare_ID=W_Consumes.Spare_ID),
        @D_Qty = (Select deleted.Qty from deleted where Spare_ID=@ID)


UPDATE       Spares
SET          Spares.Qty = Spares.Qty + @D_Qty
FROM         Spares INNER JOIN
                      deleted ON Spares.ID = deleted.Spare_ID
WHERE     (Spares.ID = @ID)


SET @I = @I-1;

CONTINUE
end
END

أنا فعلا جديد على MS SQL Server يمكن لا أتجاوز الشهرين لدى أعتذر عن أي خطأ

و كنت قد فعلت ما اريده من client حيث اني استخدم لغة دلفي و الامر سهل و تعمل جيدا

و لكن اريد الاستفادة قدر الامكان من SQL Server

لكم جزيل الشكر

المرفقات
Consumes Table.jpgRelation.jpgSpares Table.jpg

تم تعديل هذه المشاركة بواسطة TheBestBenz في 28 أكتوبر 2010 في 13:29

#2

السلام عليكم.

انا لاحظت بشكل سريع وجود خطأ بسيط, في التعليمة التالية:

@D_Qty = (Select deleted.spare_ID from deleted where Spare_ID=@ID)

بينما يجب أن تكون كالتالي:

@D_Qty = (Select deleted.Qty from deleted where Spare_ID=@ID)
#3

و عليكم السلام

صدقت و تم التعديل

هذا ناتج النسخ و اللصق

شكرا

#4

السلام عليكم.

قمت بتعديل الكود الذي وضعته كالتالي ( بعد حذف الحلقة التي لا داعي لها )

ALTER TRIGGER [dbo].[Trg_AddOnDelete] ON [dbo].[Consumes]
    AFTER DELETE
AS
    BEGIN
        DECLARE @D_Qty FLOAT ,
            @ID INT


        SELECT  @ID = ( SELECT  deleted.spare_ID
                        FROM    deleted
                      )

        SELECT  @D_Qty = ( SELECT deleted.Qty
                         FROM   deleted
                         WHERE  SpareID = @ID
                       )


        UPDATE  Spares
        SET     Spares.Qty = Spares.Qty + @D_Qty
        FROM    Spares
        WHERE   ( Spares.ID = @ID )
    END
#5

و عليكم السلام أخي عادل

هذا التعديل ينفع مع حذف سجل واحد فقط و لكن عند حذف أكثر من سجل تأتي رسالة الخطأ المشهورة

Subquery returned more than 1 value.

و في الكود الذي كتبت هذا الخطأ يحدث في الجملة الـــ Select

        SELECT  @ID = ( SELECT  deleted.spare_ID 
                        FROM    deleted 
                      )

و انت اصبت الجرح, حيث ان هذه أصل المشكلة وجملة الحلقة محاولة لتكرار إضافة الكمية عل كل سجل محذوف

تحياتي و شكرا

#6

شكراً للتصحيح: أنا جربت الكود على داتابيس صغيرة أنشأتها للتجربة و اشتغل معي بشكل صحيح !! و لكن فقط لأنني كنت أحذف السجلات من الواجهة المرئية و ليس عن طريق ال SQL.

في الحالة العامة يمكنك استخدام الكود التالي:

ALTER TRIGGER [dbo].[Trg_AddOnDelete] ON [dbo].[Consumes]
    AFTER DELETE
AS
    BEGIN


        UPDATE  Spares
        SET     Spares.Qty = Spares.Qty + ( SELECT  SUM(DELETED.Qty)
                                            FROM    DELETED
                                            WHERE   Spare_ID = Spares.ID
                                          )
        FROM    Spares JOIN DELETED ON Spares.ID=Spare_ID

    END
1
#7

السلام عليكم

الله الله عليك يأخي عادل بارك الله فيك

أنا منذ أسبوع و أنا أبحث

شكرا جزيلا

مواضيع مشابهة