--Sp_S_PricingStore 1 alter PROCEDURE [dbo].Sp_S_PricingStore @SDA_ID int = 0 AS BEGIN set transaction isolation level read uncommitted; -- حذف جدول تمپ IF OBJECT_ID('tempdb..#sdi') IS NOT NULL DROP TABLE #sdi declare @toDate as int = 0; select @toDate = todate from StoreDocumentAccount where id = @SDA_ID select sd.Tarikh, sd.Saat, d.ID Dom_ID, -- افزایشی|کاهشی p.Dom_ID_Detail, -- موجودي اوليه، فروش، خرید و ... --d.Title d_title, -- بعدا حذف شود - فقط جنبه نمایشی دارد --p.Title p_title, -- بعدا حذف شود - فقط جنبه نمایشی دارد sdi.ID, sdi.Kal_ID, sdi.Pro_ID_Unit, sdi.Dom_ID_Restoration, sdi.Quantity, sdi.Price into #sdi from StoreDocument sd inner join StoreDocumentItem sdi on sd.id = sdi.SD_ID inner join OtherProperties p on sd.Pro_ID_DocType = p.ID inner join domain d on p.Priority = d.ID -- برای تعیین نوع کاهشی|افزایشی where sd.Tarikh <= @toDate and sdi.ID not in (select SDI_ID from StoreDocumentAccountItem) /* نیاز به دو حلقه تودرتو داریم اولی برای تفکیک کردن آیدی کالا و کد مرمت دومی برای قیمت دار کردن */ declare @kalId as int, @domIdRestoration as int; declare @RowNumber AS int, @Tarikh as int, @Saat as int, @Dom_ID as int,@Dom_ID_Detail as int, @ID as int, @Kal_ID as int, @Pro_ID_Unit as int, @Dom_ID_Restoration as int; declare @Quantity as float; declare @Price as decimal(19,4); DECLARE SDI_Cursor CURSOR FOR select distinct Kal_ID, Dom_ID_Restoration from #sdi OPEN SDI_Cursor; FETCH NEXT FROM SDI_Cursor INTO @kalId, @domIdRestoration; WHILE @@FETCH_STATUS = 0 BEGIN Print ' @kalId => ' + cast(@kalId as nvarchar(max)) + ' ---- @domIdRestoration => '+ cast(@domIdRestoration as nvarchar(max)) -- حذف جدول تمپ IF OBJECT_ID('tempdb..#lstKala') IS NOT NULL DROP TABLE #lstKala select --ROW_NUMBER() OVER(ORDER BY (SELECT 1)) RowNumber, ROW_NUMBER() OVER(ORDER BY Tarikh, Saat, ID) RowNumber, * into #lstKala from #sdi where Kal_ID = @kalId and Dom_ID_Restoration = @domIdRestoration order by Tarikh, Saat, ID declare @temp_price as decimal(19,4) = 0 -- متغیر کمکی نگهداری مبلغ DECLARE lstKala_Cursor CURSOR FOR select * from #lstKala OPEN lstKala_Cursor; FETCH NEXT FROM lstKala_Cursor INTO @RowNumber, @Tarikh, @Saat, @Dom_ID, @Dom_ID_Detail, @ID, @Kal_ID, @Pro_ID_Unit, @Dom_ID_Restoration, @Quantity, @Price; WHILE @@FETCH_STATUS = 0 BEGIN if(@Dom_ID = 886) -- افزایشی begin if(@Dom_ID_Detail in (896,897,903)) /*موجودي اوليه*/ begin insert into StoreDocumentAccountItem(SDA_ID,SDI_ID,Dom_ID_PriceType,Price)values(@SDA_ID,@ID,921 /*موجودی اول دوره*/,@Price) end else if(@Dom_ID_Detail in (897)) /*رسيد خريد*/ begin insert into StoreDocumentAccountItem(SDA_ID,SDI_ID,Dom_ID_PriceType,Price)values(@SDA_ID,@ID,910 /*قيمت خريد*/,@Price) end else if(@Dom_ID_Detail in (903)) /*رسید ضایعات تولید*/ begin insert into StoreDocumentAccountItem(SDA_ID,SDI_ID,Dom_ID_PriceType,Price)values(@SDA_ID,@ID,922 /*فهرست بها*/,@Price) end else if(@Dom_ID_Detail in (898)) /*رسيد انتقال انبار*/ begin -- بررسی می کنیم که حواله انتقال آن مبلغ دار شده است یا نه set @temp_price = isnull(( select sdaiHavaleh.Price from storeDocument sd inner join StoreDocumentItem sdi on sd.ID = sdi.SD_ID inner join StoreDocumentItemRefrenceID sdir on sdi.ID = sdir.SDI_ID inner join StoreDocumentItemRefrenceID sdirHavaleh on sdir.BD_ID = sdirHavaleh.BD_ID inner join StoreDocumentAccountItem sdaiHavaleh on sdaiHavaleh.sdi_ID = sdirHavaleh.sdi_ID inner join StoreDocumentItem sdiHavaleh on sdaiHavaleh.sdi_ID = sdiHavaleh.ID inner join StoreDocument sdHavaleh on sdiHavaleh.sd_ID = sdHavaleh.ID inner join OtherProperties p on sdHavaleh.Pro_ID_DocType = p.ID where sdi.ID = @ID and p.Dom_ID_Detail = 892 -- حواله انتقال بین انبار ),0) if(@temp_price > 0) -- اگر قیمت دار شده باشد بزرگتر از صفر است begin insert into StoreDocumentAccountItem(SDA_ID,SDI_ID,Dom_ID_PriceType,Price)values(@SDA_ID,@ID,909 /*قيمت ميانگين*/,@temp_price) end --else --begin -- print('حواله انتقال بین انبار قیمت دار نشده است'); --end end else if(@Dom_ID_Detail in (904)) /*رسید تولید محصول*/ begin -- باید در زیرسیستم تولید قیمت دار شده باشد insert into StoreDocumentAccountItem(SDA_ID,SDI_ID,Dom_ID_PriceType,Price)values(@SDA_ID,@ID,920 /*بهای تمام شده*/,@Price) end else if(@Dom_ID_Detail in (906)) /*رسید برگشت از فروش*/ begin -- بررسی می کنیم که حواله فروش آن مبلغ دار شده است یا نه set @temp_price = isnull(( select sdai.Price from storeDocument sd inner join StoreDocumentItem sdi on sd.ID = sdi.SD_ID inner join StoreDocumentItemRefrenceID sdir on sdi.ID = sdir.SDI_ID inner join BargehDetail bd on sdir.BD_ID = bd.ID inner join StoreDocumentItemRefrenceID sdirPurchase on bd.BD_ID = sdirPurchase.BD_ID inner join StoreDocumentAccountItem sdai on sdirPurchase.sdi_ID = sdai.sdi_ID inner join StoreDocumentItem sdiSale on sdai.sdi_ID = sdiSale.ID inner join storeDocument sdSale on sdiSale.SD_ID = sdSale.ID inner join OtherProperties p on sdSale.Pro_ID_DocType = p.ID where sdi.ID = @ID and p.Dom_ID_Detail = 891 -- حواله فروش ),0) if(@temp_price > 0) -- اگر قیمت دار شده باشد بزرگتر از صفر است begin insert into StoreDocumentAccountItem(SDA_ID,SDI_ID,Dom_ID_PriceType,Price)values(@SDA_ID,@ID,918 /*قيمت صادره از انبار*/,@temp_price) end --else --begin -- print('رسید برگشت از فروش قیمت دار نشده است'); --end end end else -- 887 -- کاهشی begin if(@Dom_ID_Detail in (891)) /*حواله فروش*/ begin set @temp_price = (select isnull(dbo.F_S_GetAvgPrice(30,0,0,@kalId, @domIdRestoration,@Tarikh,@Saat),0)); insert into StoreDocumentAccountItem(SDA_ID,SDI_ID,Dom_ID_PriceType,Price)values(@SDA_ID,@ID,909 /*قيمت ميانگين*/,@temp_price) end else if(@Dom_ID_Detail in (894)) /*حواله اموالي*/ begin print ('asdf'); end else if(@Dom_ID_Detail in (892)) /*حواله انتقال*/ begin set @temp_price = (select isnull(dbo.F_S_GetAvgPrice(30,0,0,@kalId, @domIdRestoration,@Tarikh,@Saat),0)); insert into StoreDocumentAccountItem(SDA_ID,SDI_ID,Dom_ID_PriceType,Price)values(@SDA_ID,@ID,909 /*قيمت ميانگين*/,@temp_price) end else if(@Dom_ID_Detail in (893)) /*حواله مونتاژ*/ begin set @temp_price = (select isnull(dbo.F_S_GetAvgPrice(30,0,0,@kalId, @domIdRestoration,@Tarikh,@Saat),0)); insert into StoreDocumentAccountItem(SDA_ID,SDI_ID,Dom_ID_PriceType,Price)values(@SDA_ID,@ID,909 /*قيمت ميانگين*/,@temp_price) end else if(@Dom_ID_Detail in (905)) /*حواله برگشت از خرید*/ begin -- بررسی می کنیم که رسید خرید در گردشی شرکت کرده است یا نه set @temp_price = isnull(( select sdai.Price from storeDocument sd inner join StoreDocumentItem sdi on sd.ID = sdi.SD_ID inner join StoreDocumentItemRefrenceID sdir on sdi.ID = sdir.SDI_ID inner join BargehDetail bd on sdir.BD_ID = bd.ID inner join StoreDocumentItemRefrenceID sdirPurchase on bd.BD_ID = sdirPurchase.BD_ID inner join StoreDocumentAccountItem sdai on sdirPurchase.sdi_ID = sdai.sdi_ID inner join StoreDocumentItem sdiPurchase on sdai.sdi_ID = sdiPurchase.ID inner join storeDocument sdPurchase on sdiPurchase.SD_ID = sdPurchase.ID inner join OtherProperties p on sdPurchase.Pro_ID_DocType = p.ID where sdi.ID = @ID and p.Dom_ID_Detail = 897 -- رسید خرید ),0) if(@temp_price > 0) -- اگر شرکت کرده باشد بزرگتر از صفر است begin insert into StoreDocumentAccountItem(SDA_ID,SDI_ID,Dom_ID_PriceType,Price)values(@SDA_ID,@ID,919 /*قيمت وارده به انبار*/,@temp_price) end --else --begin -- print('حواله برگشت از خرید قیمت دار نشده است'); --end end end --print('@Dom_ID => ' + CAST(@Dom_ID AS NVARCHAR(MAX))) FETCH NEXT FROM lstKala_Cursor INTO @RowNumber,@Tarikh, @Saat, @Dom_ID, @Dom_ID_Detail,@ID, @Kal_ID, @Pro_ID_Unit, @Dom_ID_Restoration, @Quantity, @Price; -- تخصیص کالای بعدی به حلقه END; CLOSE lstKala_Cursor; DEALLOCATE lstKala_Cursor; FETCH NEXT FROM SDI_Cursor INTO @kalId, @domIdRestoration; -- تخصیص کالای بعدی به حلقه END; CLOSE SDI_Cursor; DEALLOCATE SDI_Cursor; end