PDA

View Full Version : مشکل در trigger



zahra.mf
یک شنبه 15 مرداد 1391, 16:46 عصر
سلام
من دوتا جدول دارم یکی اسمش kala یکی faktor forush moshtari میخوام وقتی تو جدول دوم یه مشتری یه کالایی درخواست میکنه فیلدtedad اگه از mojudi که یه فیلد توی kala هستش کمتر بود به اندازه tedad از موجودی کم کنه اگه بیشتر بود پیام خطا بده با trigger نوشتم ولی اجرا نمیشه به خطی که دارم از mojudi مقدار tedad و کم میکنم اشکال میگیره اون خط و که حذف می کنم با مقدار برگشتی مشکل داره
اینم کدم
CREATE TRIGGER Trigger1
ON dbo.[faktor forush moshtari]
FOR INSERT
AS
if((select tedad from [faktor forush moshtari]) < (select mojudi from [kala]))

mojudi =- tedad


else
print 'خطا'
ROLLBACK

KIMIA1981
دوشنبه 16 مرداد 1391, 08:15 صبح
سلام

خوب برای اینکه شما دارید بین دو تیبل مقایسه می کنید بهتر بود ابتدا view آن را می ساختید بعد عمل مقایسه را روی آن view انجام بدید .

حمیدرضاصادقیان
دوشنبه 16 مرداد 1391, 11:02 صبح
سلام.
شما به این طریق نمیتونید ازموجودی کم کنید. باید از Update استفاده کنید و اون فیلد رو در جدول مورد نظر Update کنید.
مثال :

update k
Set k.mojudi=k.mojudi-m.Tedad From kala k
Join [faktor forush moshtari] m on m.id=k.id

zahra.mf
دوشنبه 16 مرداد 1391, 13:09 عصر
من هم اینکاروکردم این کد و نوشتم ولی کاری انجام نمیده!!!
هیچ فرقی با نبودن trigger نداره!!!

ALTER TRIGGER Trigger2
ON dbo.[faktor forush moshtari]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE kala
SET kala.mojudi = kala.mojudi - Inserted.tedad
FROM kala Inner Join Inserted
ON kala.kala_ID = Inserted.kala_ID
END

من trigger و که باز میکنم به جای creste شده alter !!!!

zahra.mf
دوشنبه 16 مرداد 1391, 13:57 عصر
این trigger هم برای این نوشتم که اگه درخواست (tedad) از mojudi بیشتر بود خطا بده trigger بالایی و برای جدول faktor forush moshtari نوشتم اینم برای kala
ولی نوشتن و ننوشتنشون هیچ فرقی نمیکنهه!!!

ALTER TRIGGER Trigger3
ON dbo.kala
AFTER UPDATE
AS
IF (SELECT mojudi FROM Inserted)<0
BEGIN
SET NOCOUNT ON;
PRINT 'خطا'
ROLLBACK
END

حمیدرضاصادقیان
دوشنبه 16 مرداد 1391, 14:45 عصر
الان یعنی اگر یک رکورد خودتون به جدول فروش اضافه کنید جدول کالا تغییری نمیکنه؟

baktash.n81@gmail.com
دوشنبه 16 مرداد 1391, 14:57 عصر
نکته اول خطایی رو که Trigger ایجاد می کنه چه جوری مدیریت می کنید ؟! (در واقع به این راحتی ها نمی تونید)

Tigger برای رفع برخی از مشکلات برنامه هست و به هیچ عنوان به هیچ عنوان نباید تو پیاده سازی منطق برنامه از Trigger استفاده کنید ...

این منطق برنامتون هست ... که مقدار درخواست از موجودی بیشتر نباشه ... این رو حتما باید توی کد چک کنید ... یا یه SP بنویسید که اول چک کنه بعد Update رو انجام بده ...

zahra.mf
دوشنبه 16 مرداد 1391, 17:11 عصر
الان یعنی اگر یک رکورد خودتون به جدول فروش اضافه کنید جدول کالا تغییری نمیکنه؟

قبل این که trigger و بذارم برنامم اینجور بود که میشد یه کالا به جدول اضافه کرد ولی من میخوام اگه کالایی خریده شد به تعدادش از جدول اضافه بشه و اگه فروخته شد از تعدادش کم بشه ولی الان همچین اتفاقی نمیفته

zahra.mf
دوشنبه 16 مرداد 1391, 17:13 عصر
نکته اول خطایی رو که Trigger ایجاد می کنه چه جوری مدیریت می کنید ؟! (در واقع به این راحتی ها نمی تونید)

Tigger برای رفع برخی از مشکلات برنامه هست و به هیچ عنوان به هیچ عنوان نباید تو پیاده سازی منطق برنامه از Trigger استفاده کنید ...

این منطق برنامتون هست ... که مقدار درخواست از موجودی بیشتر نباشه ... این رو حتما باید توی کد چک کنید ... یا یه SP بنویسید که اول چک کنه بعد Update رو انجام بده ...

میشه بیشتر توضیح بدید متوجه نمیشم منظورتون رو

baktash.n81@gmail.com
سه شنبه 17 مرداد 1391, 07:29 صبح
یعنی اگه شما از طریق یه برنامه به بانک وصل باشید ( کاربرها یه مستقیم با SQL کار نمی کنن) اگر در هنگام اجرای trigger خطایی روی دهد برنامه شما متوجه نمی شه و به کاربر خطایی رو نشون نمی ده ...

برای پیاده سازی بهتر است یه SP برای Insert توی جدول اول ایجاد می کنی ... قبل از اینکه عمل Insert رو انجام بدی می ری شرط هایی رو که گفتی چک می کنی ... TSQL هم دستوراتی برای انجام این کارها داره ... و از توی برنامه هر وقت که می خوای یه رکورد رو Update کنی SP رو اجرا می کنی ...

sajjad_kochekian
پنج شنبه 19 مرداد 1391, 21:00 عصر
برای ارسال خطا از sql به محیط برنامه باید از دستور RAISERROR استفاده کنی

zahra.mf
سه شنبه 24 مرداد 1391, 12:52 عصر
من دارم الان همین کتری که گفتید و تنجام میدم یعنی شرط و تو برنامه چک کنم
dal.connect();
sql = "select sum(mojudi) from kala";
sql = string.Format(sql);
dt = dal.select(sql);
dt.Rows[0]["mojudi"].ToString();


sql = "insert into kala (namek,gheymatkala,mojudi) values (N'{0}',N'{1}',{2})";
sql = string.Format(sql,
(textBox4.Text.Replace("'", "''")),
(textBox5.Text.Replace("'", "''")),
(textBox6.Text.Replace("'","''"))
);
dal.docommand(sql);
sql = "select * from kala";
sql = string.Format(sql);
dt = dal.select(sql);
textBox4.Clear();
textBox5.Clear();
textBox6.Clear();
dataGridView2.DataSource = dt;
dal.Disconnect();
الان میخوام چک کنم که اگه موجودی بیشتر از 100 شد اجازه insert و نده ولی نمیدونم چجوری dt و تو شرط if بذارم