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

أريد عمل Trigger After Update & Delete

مغلق
بدأه enjyshahin في 10 أكتوبر 2006 · 10 رد · 1,594 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

الإخوة الكرام

عندى 3 جداول , جدول بنود وجدول حسابات وجدول حركة لقاعدة بيانات خاصه بمصروفات

جدول البنود به أسم البند ورقمه ورصيده الإفتتاحى وإجمالى الحركة والرصيد ونفس الشئ بالنسبة لجدول الحسابات

يمكن للبند ان يكون له أكثر من حساب وأيضا للحساب يكون لآكثر من بند

أما جدول الحركة فيه رقم الحركة وتاريخها ورقم البند ورقم الحساب ومدين ودائن

عملت trigger after insert والحمد لله اشتغلت معى

وكود الtrigger after insert هو

}Create Trigger InsDbtBal
on Trans
After Insert
as
if (COLUMNS_UPDATED()) > 0
declare @accid int , @itmid int
set @accid = (Select AccountID from Inserted)
set @itmid = (Select ItemID from Inserted)
begin
update Account set debit = (select Inserted.Debit + Account.Debit
							From Account join Inserted
							on Inserted.AccountID = Account.AccountID
				join Trans
							on Inserted.TransID = Trans.TransID),
				   credit = (select Inserted.credit + Account.credit
							From Account join Inserted
							on Inserted.AccountID = Account.AccountID
				join Trans
							on Inserted.TransID = Trans.TransID)
where accountId = @accid

update Item set debit = (select Inserted.Debit + Item.Debit
							From Item join Inserted
							on Inserted.ItemID = Item.ItemID
				join Trans
							on Inserted.TransID = Trans.TransID),
				   credit = (select Inserted.credit + Item.credit
							From Item join Inserted
							on Inserted.ItemID = Item.ItemID
				join Trans
							on Inserted.TransID = Trans.TransID)
where ItemID = @itmid					   
end

وان كان فيه أى تعديل بالنسبة للTrigger After Insert أى تعديل أتمنى أن تفيدونى

ولكن ما لم أستطع عمله هو ال Trigger After Updateو Trigger After Delete

أرفقت backup device لقاعدة البيانات

فهل يمكن لأحد ان يساعدنى في إنشاء ال Triggers

اتمنى ان أكون قد أوضحت ما اريده

أختكم إنجى

testdb.rar

يا حى يا قيوم برحمتك أستغيث اصلح لى شأنى كله ولا تكلنى إلى نفسى طرفة عين

اللهم أعنا على ذكرك وشكرك وحسن عبادتك

اللهم انك عفو كريم حليم تحب العفو فاعفو عنا

اللهم إنى أسألك رضاك والجنة وأعوذ بك من سخطك والنار

اللهم إرحمنا فوق الأرض وإرحمنا تحت الأرض وإرحمنا وإعتق رقابنا يوم العرض

اللهم لا تدع لنا ذنبًا إلا غفرته ولا همًا إلا فرجته ولا مريضًا ولا دينًا إلا قضيته ولا عيبا إلا سترته ولا حاجًا هى لك رضا إلا قضيتها

اللهم انى أسألك موجبات رحمتك وعزائم مغفرتك والسلامة من كل إثم والغنيمة من كل بر والفوز بالجنة و النجاة من النار اللهم أمين يا رب العالمين

#2

enjyshahin كتب:
ولكن ما لم أستطع عمله هو ال Trigger After Updateو Trigger After Delete

فهل يمكن لأحد ان يساعدنى في إنشاء ال Triggers

اتمنى ان أكون قد أوضحت ما اريده

أختكم إنجى

يعطيكي العافية

أنا قرأت المشكلة لكن في النهاية تبين لي إنه طلب

المشكلة هون إنه لازم نفهم قاعدة البيانات بطريقة أكثر

نفهم قاعدة البيانات من التصميم المنطقي

فبما إنك عم تشتغلي على هذه القاعدة

لازم انتي تعرفي تكتب القوادح و الإجراءات لوحدك

لإنه فهم قاعدة البيانات ليس بالأمر السهل

إضافة إلى هذا الأمر ما في عندك مشكلة لحتى

نحاول نساعدك في حلها

سلام

#3

بسم الله الرحمن الرحيم

شكرا لك أخى Desigen

أسفة لانى لم اوضح طلبى جيدا

كما ذكرت مسبقا ان لدى ثلاث جداول

جدول بنود عبارة عن إسم البند ورقمه ورصيده الإفتتاحى (مدين ودائن) وإجمالى الحركة (مدين ودائن) والرصيد (مدين ودائن)

وايضا بالنسبة لجدول الحساب

مثلا لدينا بند مرتبات و بند انتقلات وبند تأمينات

ولدينا حساب محمد وحساب أحمد

عندما اريد إضافة حركة تكون كالتالى

رقم الحركة : تسلسلى - تاريخ الحركة : 10-10-2006 - بند : مرتبات - حساب : أحمد -مبلغ مدين : 1000 - مبلغ دائن : 0

يزيد المبلغ تلقائى لإجمالى المدين للبند مرتبات وللحساب أحمد بمبلغ 1000 حتى الآن لا يوجد مشكلة

أما ما أريده هو عندما اريد تعديل هذة الحركة واجعل المبلغ 1500 بدلا من 1000 تعدل تلقائيا للبند والحساب التابع للحركة عن طريق ال Trigger

بالتالى الحركة سوف تزيد بالفرق وهو ال 500

كيف لى ان احصل على الفرق حتى يتم تعديل جدول البنود وجدول الحسابات

اتمنى ان اكون قد أوضحت طلبى

إنجى

يا حى يا قيوم برحمتك أستغيث اصلح لى شأنى كله ولا تكلنى إلى نفسى طرفة عين

اللهم أعنا على ذكرك وشكرك وحسن عبادتك

اللهم انك عفو كريم حليم تحب العفو فاعفو عنا

اللهم إنى أسألك رضاك والجنة وأعوذ بك من سخطك والنار

اللهم إرحمنا فوق الأرض وإرحمنا تحت الأرض وإرحمنا وإعتق رقابنا يوم العرض

اللهم لا تدع لنا ذنبًا إلا غفرته ولا همًا إلا فرجته ولا مريضًا ولا دينًا إلا قضيته ولا عيبا إلا سترته ولا حاجًا هى لك رضا إلا قضيتها

اللهم انى أسألك موجبات رحمتك وعزائم مغفرتك والسلامة من كل إثم والغنيمة من كل بر والفوز بالجنة و النجاة من النار اللهم أمين يا رب العالمين

#4

سأقوم بالإطلاع على الجداول المستهدفة و بعديها .. أحاول أساعدك يا أخت ..

وأتمنى عليك أن توضحي المسألة بشكل مجرد .. يعني بصيغة شبيهه بالتالية :

أريد أن أعدل قيمة الحقل number الموجود في الجدول A .. عندما تتعدل قيمة الحقل name في الجدول B ...

لأنو بصراحة أنا لم أستوعب كثيراً .. ومع ذلك رح حاول ساعد بقدر الإستطاعة ..

تم تعديل هذه المشاركة بواسطة imadouzoun في 10 أكتوبر 2006 في 17:14

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#5

بسم الله الرحمن الرحيم

شكرا لك أخى عماد

سأوضح لك ما اريده

أريد تعديل Debit ,Credit في جدول Item , Account بناءا على تعديل أو إلغاء مبلغ في Debit ,Credit في جدول ال Trans

وطبعا بناءا على ال TransID و AccountId أو ItemID

اتمنى ان أكون قد أوضحت المشكلة

إنجى

يا حى يا قيوم برحمتك أستغيث اصلح لى شأنى كله ولا تكلنى إلى نفسى طرفة عين

اللهم أعنا على ذكرك وشكرك وحسن عبادتك

اللهم انك عفو كريم حليم تحب العفو فاعفو عنا

اللهم إنى أسألك رضاك والجنة وأعوذ بك من سخطك والنار

اللهم إرحمنا فوق الأرض وإرحمنا تحت الأرض وإرحمنا وإعتق رقابنا يوم العرض

اللهم لا تدع لنا ذنبًا إلا غفرته ولا همًا إلا فرجته ولا مريضًا ولا دينًا إلا قضيته ولا عيبا إلا سترته ولا حاجًا هى لك رضا إلا قضيتها

اللهم انى أسألك موجبات رحمتك وعزائم مغفرتك والسلامة من كل إثم والغنيمة من كل بر والفوز بالجنة و النجاة من النار اللهم أمين يا رب العالمين

#6

يا ريت تعززي المشكلة بمثال لكن خليه واضح

بس أنا يلي فهمته إنه إنتي بدك تعدلي قيم في جدولين

إعتمادا على تغير قيمية في جدول ثالث

معناتوا إنه بنعمل قادح على الجدول التالت

After Update Delete

و بنعدل القيم في الجدوال المرادة بواسطة تعليمات

Update لكلا الجدولين

أرجوا وضع مثال شوي بسيط

و خلي المثال له علاقة بالحقول المراد تعديلها

شكرا لكي

#7

بسم الله الرحمن الرحيم

أرفقت مثال لعمل update و delete للجدول Trans

وبعد ال update لجدول ال Trans للdebit و credit columns يعدل الTotal debit,Total credit columns في الAccount , Item Tables

بمعنى ان لو كانت القيمة للDebit = 1000 بTransID = 3 وقمت بتعديل قيمة ال Debit = 1500 لنفس ال TransID طبعا , هنا يجب ان تخصم القيمة قبل التعديل وهى ال(1000) وتضاف القيمة الجديدة (1500) للDebit Column في ال Item , Account Tables .

وقاعدة البيانات مرفقه في المشركة الأولى لى

أتمنى ان أكون قد أوضحت ما اريده

إنجى

Trigger.rar

تم تعديل هذه المشاركة بواسطة enjyshahin في 11 أكتوبر 2006 في 22:01

يا حى يا قيوم برحمتك أستغيث اصلح لى شأنى كله ولا تكلنى إلى نفسى طرفة عين

اللهم أعنا على ذكرك وشكرك وحسن عبادتك

اللهم انك عفو كريم حليم تحب العفو فاعفو عنا

اللهم إنى أسألك رضاك والجنة وأعوذ بك من سخطك والنار

اللهم إرحمنا فوق الأرض وإرحمنا تحت الأرض وإرحمنا وإعتق رقابنا يوم العرض

اللهم لا تدع لنا ذنبًا إلا غفرته ولا همًا إلا فرجته ولا مريضًا ولا دينًا إلا قضيته ولا عيبا إلا سترته ولا حاجًا هى لك رضا إلا قضيتها

اللهم انى أسألك موجبات رحمتك وعزائم مغفرتك والسلامة من كل إثم والغنيمة من كل بر والفوز بالجنة و النجاة من النار اللهم أمين يا رب العالمين

#8

بسم الله الرحمن الرحيم

انا الحمد لله عملت الTrigger After update

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO



ALTER	Trigger UpdateBalance
On Trans
After Update
As
if (COLUMNS_UPDATED()) > 0
Declare @itm int,@acc int 
Set @itm = (select ItemID from Deleted)
Set @acc = (select AccountID from Deleted)
If update(debit) or update(credit)
begin
Declare @deb decimal, @crd decimal
set @deb = (select (Inserted.Debit - Deleted.Debit)
			from Inserted join Deleted 
			on Inserted.AccountID = Deleted.AccountID
			join Trans
			on Inserted.TransID = Trans.TransID)
set @crd = (select (Inserted.Credit - Deleted.Credit)
			from Inserted join Deleted 
			on Inserted.AccountID = Deleted.AccountID
			join Trans
			on Inserted.TransID = Trans.TransID)
update Account set debit = (Debit + @deb) , credit = (Credit + @crd)
where AccountID = @acc 
end
Begin
set @deb = (select (Inserted.Debit - Deleted.Debit)
			from Inserted join Deleted 
			on Inserted.ItemID = Deleted.ItemID
			join Trans
			on Inserted.TransID = Trans.TransID)
set @crd = (select (Inserted.Credit - Deleted.Credit)
			from Inserted join Deleted 
			on Inserted.ItemID = Deleted.ItemID
			join Trans
			on Inserted.TransID = Trans.TransID)
update Item set debit = (Debit + @deb) , credit = (Credit + @crd)
where ItemID = @itm 
End



GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

والحمد لله عملت مع تمام سواء بالإضافة أو بالخصم

وعملت Trigger After Delete

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO



ALTER  Trigger DeleteBalance
On Trans
After Delete
As
if (COLUMNS_UPDATED()) > 0
Declare @itm int,@acc int 
Set @itm = (select ItemID from Deleted)
Set @acc = (select AccountID from Deleted)
If update(debit) or update(credit)
begin
Declare @deb decimal, @crd decimal
set @deb = (select (Account.Debit - Deleted.Debit)
			from Account join Deleted 
			on Account.AccountID = Deleted.AccountID
			join Trans
			on Deleted.TransID = Trans.TransID)
set @crd = (select (Account.Credit - Deleted.Credit)
			from Account join Deleted 
			on Account.AccountID = Deleted.AccountID
			join Trans
			on Deleted.TransID = Trans.TransID)
update Account set debit = @deb , credit = @crd
where AccountID = @acc 
end
Begin
set @deb = (select (Item.Debit - Deleted.Debit)
			from Item join Deleted 
			on Item.ItemID = Deleted.ItemID
			join Trans
			on Deleted.TransID = Trans.TransID)
set @crd = (select (Item.Credit - Deleted.Credit)
			from Item join Deleted 
			on Item.ItemID = Deleted.ItemID
			join Trans
			on Deleted.TransID = Trans.TransID)
update Item set debit = @deb , credit = @crd
where ItemID = @itm 
End



GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

اكن المشكلة انى كل ما احاول أعمل delete

تظهر لى هذة الرساله

اقتباس
Server: Msg 515, Level 16, State 2, Procedure UpdateBalance, Line 38

Cannot insert the value NULL into column 'Credit', table 'khld.dbo.Item'; column does not allow nulls. UPDATE fails.

The statement has been terminated.

اتمنى ان أجد حل ان شاء الله

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

تم تعديل هذه المشاركة بواسطة enjyshahin في 17 أكتوبر 2006 في 00:31

يا حى يا قيوم برحمتك أستغيث اصلح لى شأنى كله ولا تكلنى إلى نفسى طرفة عين

اللهم أعنا على ذكرك وشكرك وحسن عبادتك

اللهم انك عفو كريم حليم تحب العفو فاعفو عنا

اللهم إنى أسألك رضاك والجنة وأعوذ بك من سخطك والنار

اللهم إرحمنا فوق الأرض وإرحمنا تحت الأرض وإرحمنا وإعتق رقابنا يوم العرض

اللهم لا تدع لنا ذنبًا إلا غفرته ولا همًا إلا فرجته ولا مريضًا ولا دينًا إلا قضيته ولا عيبا إلا سترته ولا حاجًا هى لك رضا إلا قضيتها

اللهم انى أسألك موجبات رحمتك وعزائم مغفرتك والسلامة من كل إثم والغنيمة من كل بر والفوز بالجنة و النجاة من النار اللهم أمين يا رب العالمين

#9

الرسالة تقول أنك تحاولين ادخال القيمة الخالية إلى عامود لايقبل القيمة الخالية

بتوقع الخطأ عم يصير في السطرين هذول

set @crd = (select (Inserted.Credit - Deleted.Credit)
            from Inserted join Deleted on Inserted.ItemID = Deleted.ItemID
            join Trans on Inserted.TransID = Trans.TransID)
update Item set debit = (Debit + @deb) , credit = (Credit + @crd)
where ItemID = @itm

شو رأيك تعالجي القيمة الفارغة أثناء الإجراء

بإستخدام الدالة IFNULL

سلام

#10

بسم الله الرحمن الرحيم

ألف شكر لك أخى Design على إهتمامك

وان شاء الله أجرب وأخبرك

بس لو أمكنك تعمل لى مثال صغير على طريقة إستخدمها أكون شاكرة لك

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

تم تعديل هذه المشاركة بواسطة enjyshahin في 17 أكتوبر 2006 في 23:08

يا حى يا قيوم برحمتك أستغيث اصلح لى شأنى كله ولا تكلنى إلى نفسى طرفة عين

اللهم أعنا على ذكرك وشكرك وحسن عبادتك

اللهم انك عفو كريم حليم تحب العفو فاعفو عنا

اللهم إنى أسألك رضاك والجنة وأعوذ بك من سخطك والنار

اللهم إرحمنا فوق الأرض وإرحمنا تحت الأرض وإرحمنا وإعتق رقابنا يوم العرض

اللهم لا تدع لنا ذنبًا إلا غفرته ولا همًا إلا فرجته ولا مريضًا ولا دينًا إلا قضيته ولا عيبا إلا سترته ولا حاجًا هى لك رضا إلا قضيتها

اللهم انى أسألك موجبات رحمتك وعزائم مغفرتك والسلامة من كل إثم والغنيمة من كل بر والفوز بالجنة و النجاة من النار اللهم أمين يا رب العالمين

#11
Declare @xVar Int , @yVar Int 
Select @xVar = 2 , @yVar = NULL 

Select IsNULL ( @xVar , 4 ) 
Select IsNull ( @yVar , 4 )

هذا الموضوع مغلق.

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