PDA

View Full Version : سوال: تريگر



free_rockboy
سه شنبه 27 مرداد 1388, 02:25 صبح
با سلام خدمت دوستان
من يك جدول بانك دارم كه داراي سه فيلد (بانك،مانده حساب،تاريخ) و يك جدول ديگه كه پرداخت هاي بانكي را داخلش ثبت ميكنم و اطلاعات چند بانك داخلشه(بانك،تاريخ،مبلغ چك،باقيماده كنوني حساب).وباقيمانده حساب هر بانك را از جدول اول استخراج ميكنم- ميخوام پس از ثبت چك مبلغ از حساب كم بشه. من اين تريگر را داخل جدول دومي نوشتم .


declare @chek as numeric,@bank as nvarchar(50),@tarikh as nvarchar(50)


select @bank=bank,@tarikh=tarikh,@chek=chek from inserted


update TBANK set baghi=baghi-@chek where bank=@bank


update TBANK set tarikh=@tarikh where bank=@bank
خب من با اين موجودي بانك روپس از ثبت چك تو جدول اصلي بروز ميكنم.
اما سوالم ؟ من موجودي جدول دوم را از جدول اولي ميگيرم با اين تريگر :


declare @bank as nvarchar(50),@tarikh as nvarchar(50),@baghi as numeric


select @bank=bank,@tarikh=tarikh from inserted


select @baghi=baghi from TBANK where tarikh=@tarikh and bank=@bank


update TCHEK set baghi=@baghi where bank=@bank and tarikh=@tarikh
اما بخاطر اينكه تو شرط فقط اسم بانك و تاريخ، چك ميشه ،تو جدولم اگر من مثلا 3 چك از بانك خاصي امروز ثبت كرده باشم با ثبت چك چهارم باقيمانده حساب اون بانك در هر چهار ركورد بروز ميشه.چطور ميشه . چه شرطي بايد بذارم كه فقط فيلد باقيمانده ركورد آخر تغيير كنه؟

بهنام بهمنی
سه شنبه 27 مرداد 1388, 09:39 صبح
مانده حساب نبايد , ذخيره شود و بايد در هنگام نياز محاسبه و نمايش داده شود , در غير اين صورت احتمال دارد براي سازگاري اطلاعات consistancy پايگاه داده شما مشکل اساسي پيش بيايد.

بنابراين توصيه مي کنم, ساختارتان را اصلاح کنيد

free_rockboy
سه شنبه 27 مرداد 1388, 10:29 صبح
مانده حساب نبايد , ذخيره شود و بايد در هنگام نياز محاسبه و نمايش داده شود , در غير اين صورت احتمال دارد براي سازگاري اطلاعات consistancy پايگاه داده شما مشکل اساسي پيش بيايد.

بنابراين توصيه مي کنم, ساختارتان را اصلاح کنيد
خوب اگه نبايد ذخيره بشه،پس بعد از هر بار برداشت يا واريز به حساب بايد مانده حساب كجا ذخيره بشه؟ يعني من تو بانكم فقط بابد مقدار اوليه را ثبت كنم؟ آخه بنظر من كه نميشه ، لطف كنيد بگيد چطور. ممنون

بهنام بهمنی
سه شنبه 27 مرداد 1388, 11:54 صبح
حساب در ابتدا مانده اش صفر است و با یک ردیف مانده اولیه حساب به انتقال می یابد, شما هم نباید در هر عملياتي مانده را حساب کنيد, فقط در زمان گزارش با يک Select مي توانيد, مانده را حساب کنيد. شما مي توانيد با دستوري شبيه زير مبلغ هر رديف را منفي-مثبت بکنيد و سپس جمع رديف ها مانده شما مي شود.



Case Status when 1 then Amount when 0 then -1 * amount end as amount