PDA

View Full Version : ثبت موجودی کالا در چند جدول



Davood_amega
چهارشنبه 31 شهریور 1389, 10:56 صبح
سلام و پیشاپیش از همه عزیزانی که کمکم می کنند تشکر می کنم
بنده با یک مثال کارمو توضیح میدم . بانک نمونه مثلا این Table ها هستند .
کالاها : شماره کالا ، نام کالا
موجودی کافی شاپ : شماره کالا ، تعداد کالا
کافی شاپ : شماره کالا ، تعداد کالا
تغییر و تحول کافی شاپ : شماره کالا ، توضیح ، تاریخ ، نوع تغییر ( افزایش یا کاهش )


http://barnamenevis.org/forum/attachment.php?attachmentid=56879&stc=1&d=1285141286


اضافه کردن کالا : وقتی کالاها را در کافی شاپ ثبت می کنیم تعداد موجودی آن کالا در Coffeeshop_Cash و فیلد CC_Cash_Qty افزایش می یابد و در Coffee_Change فیلد CC_Type برابر افزایش می شود یعنی اینکه به موجودی آن کالا افزوده شده است .
کاهش موجودی کالا : وقتی هم از کافی شاپ چیزی فروخته می شود از فیلد CC_Cash_Qty مربوط به آن کالا کم می شود و CC_Type هم برابر کاهش می شود .
حالا مشکلم این بود که در SQL این کاهش و افزایش را به چه صورت اعمال کنم که خودکار این کار را انجام دهد یعنی اینکه دیگه من با Coffeeshop_Cash کاری نداشته باشم و خودش موجودی هر کالا را بدست آورد .

Reza_Yarahmadi
چهارشنبه 31 شهریور 1389, 16:20 عصر
ميتونيد يه تريگر روي جدول Coffee_Change به صورت زير بنويسيد.

create trigger Cofee_Change_Insert on Coffee_Change
After insert
as
declare @id int
declare @Qty int
select @id = CC_ID from Inserted
select @Qty = C_Qty from CoffeeShop Where C_ID = @ID
if((select distinct CC_type from Inserted) = 'Add')
begin
if((select count(*) From CoffeeShop_Cash Where CC_ID = @id) = 1)
update CoffeeShop_Cash set CC_Cash_Qty = CC_Cash_Qty + C_Qty from Inserted inner join CoffeeShop on Inserted.CC_ID = CoffeeShop.C_ID
else
Insert Into CoffeeShop_Cash values (@ID,@Qty)
end
else
update CoffeeShop_Cash set CC_Cash_Qty = CC_Cash_Qty - C_Qty from Inserted inner join CoffeeShop on Inserted.CC_ID = CoffeeShop.C_ID

حمیدرضاصادقیان
چهارشنبه 31 شهریور 1389, 21:35 عصر
سلام.دوست عزیز اصلا طراحی جداولتون اشتباه هست.
این جداول اصلا نرمال نیستند.
شما یک جدول مشخصات کالا دارید. یک جدول مربوط به انبار.
در جدول مربوط به انبار موجودی کالاتون باید ذخیره بشه و هر وقت فاکتوری ثبت میکنید باید با یک دستور update این مقدار رو تغییر بدید یا به قول دوستمون یک تریگر بنویسید ولی تریگرتون هم خیلی ساده میشه و حجم عملیاتی که شما انجام میدید کاهش پیدا میکنه و سرعت گزارش گیری شما بالاتر میره و درصد خطای شما کاهش پیدا میکنه.
ولی با طراحی شما امکان وجود داده های غیر یکسان زیاده و در گزارشگیری ها به مشکل برخواهید خورد.
باید join های تودرتو بزنید که همین عمل باعث کندی کوئری های شما خواهد شد و چه بسا در مواقع حساس دیگه نمیتونید کاری رو انجام بدید.
موفق باشید