PDA

View Full Version : نوشتن SP برای محاسبه موجودی کالا از طریق full join دو جدول کالا و فاکتور ؟



shahrzad87
یک شنبه 09 بهمن 1390, 20:12 عصر
سلام
من این SP رو نوشتم اما روی خط آخر END ارور می گیره

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetCountOfProduct
@code as int,
@parentID as int

AS
BEGIN
SET NOCOUNT ON;

SELECT SUM([count])
FROM (SELECT tbl_FactProduct.id
FROM tbl_FactProduct
FULL JOIN tbl_Product
ON tbl_FactProduct.id = tbl_Product.id
WHERE tbl_Product.code = @code AND tbl_FactProduct.parentID = @parentID)


END
GO

shahrzad87
یک شنبه 09 بهمن 1390, 20:35 عصر
این هم دیاگرام جدول های برنامم هست

81676

shahrzad87
یک شنبه 09 بهمن 1390, 20:48 عصر
این طوری تغییرش دادم اما بازم خطا داره

BEGIN
SET NOCOUNT ON;

DECLARE @PId as int
select @PId = id
from tbl_Product
where code = @code AND parentID = @parentID

SELECT id,(SUM([count])
FROM tbl_FactProduct
where id = @PId and BuyFactID = -1) -
(SUM([count])
FROM tbl_FactProduct
where id = @PId and SaleFactID = -1)
as [count]


END
GO

shahrzad87
یک شنبه 09 بهمن 1390, 21:01 عصر
الان این پیغام خطا رو می ده :
Msg 156, Level 15, State 1, Procedure GetCountOfProduct, Line 19
Incorrect syntax near the keyword 'as'.

tiphooo
یک شنبه 09 بهمن 1390, 21:12 عصر
SET NOCOUNT ON;

DECLARE @PId as int
select @PId = id
from tbl_Product
where code = @code AND parentID = @parentID

SELECT P.Id,P.SumCount1 - ISNULL(Q.SumCount2,0) AS [Count] FROM (
SELECT Id,SUM([Count]) SumCount1
FROM tbl_FactProduct
WHERE id = @PId and BuyFactID = -1
GROUP BY Id)P
LEFT OUTER JOIN
(SELECT Id,SUM([Count]) SumCount2
FROM tbl_FactProduct
WHERE id = @PId and SaleFactID = -1
GROUP BY Id)Q
ON P.Id=Q.Id

shahrzad87
یک شنبه 09 بهمن 1390, 21:23 عصر
SET NOCOUNT ON;

DECLARE @PId as int
select @PId = id
from tbl_Product
where code = @code AND parentID = @parentID

SELECT P.Id,P.SumCount1 - ISNULL(Q.SumCount2,0) AS [Count] FROM (
SELECT Id,SUM([Count]) SumCount1
FROM tbl_FactProduct
WHERE id = @PId and BuyFactID = -1
GROUP BY Id)P
LEFT OUTER JOIN
(SELECT Id,SUM([Count]) SumCount2
FROM tbl_FactProduct
WHERE id = @PId and SaleFactID = -1
GROUP BY Id)Q
ON P.Id=Q.Id

می شه یکم توضیح بدین ؟ ؟؟

tiphooo
یک شنبه 09 بهمن 1390, 21:51 عصر
در صورتی که شما از توابع SUM ، COUNT،MAX, ... با اسامی فیلدها (در این مثال ID) استفاده کنید تمامی آن فیلدها باید در GROUP BY شرکت کنند و اینکه این توابع می بایست درون یک SELECT استفاده شوند و به تنهایی نمی توانید استفاده کنید.
در جواب ارسال شده برای شما ابتدا بر اساس ID جمع تعدادی برای حالتی که BuyFactID = -1 است بدست آمده و تحت متغیری به نام P قرار گرفته و در سمت دیگر همین کار برای SaleFactID = -1 مقادیر بدست آمده تحت متغیری با نام Q جوین شده است با شرط ID حال اینکه P,Q مانند جداول مستقلی عمل می کنند که جمع مقادیر جدول دوم (Q) را برای به دست آوردن موجودی از جمع مقادیر جدول اول (P) کسر می کنیم و شرط ISNULL هم برای این است که ممکن است شما از کالایی موجودی داشته باشید و تاکنون از آن کالا چیزی فروش نرفته باشد در اینصورت چون تفریق انجام شده اگر از ISNULL استفاده نشود موجودی را NULL نمایش می دهد در حالی که آن کالا دارای موجودی است