PDA

View Full Version : حرفه ای: بدست آوردن موجودي كالا با سه جدول تعداد اوليه و خريد و فروش



hossein_sh2008
دوشنبه 09 اردیبهشت 1392, 16:14 عصر
با سلام و خسته نباشيد
من در حال انجام يك برنامه حسابداري هستم كه به مشكلي در قسمت نمايش موجودي فعلي كالا بر خوردم به اين صورت كه من با سه تا از جداول زير و فرمول ارائه شده مي خوام اين كار رو انجام بدم
1-جدول gheymat: در اين جدول اطلاعات كالا ها ، مشخصات و تعداد موجودي اول دوره را نگهداري مي كنم
2-جدول zir_factor_kh: در اين جدول اطلاعات فاكتور خريد مثلا شماره فاكتور خريد كد كالا خريداري شده و تعداد آن را ذخيره مي كنم مثلا"
كد فاكتور=1 كد كالا =2 تعداد=10 خريداري شده
3-جدول zir_factor_fo: در اين جدول اطلاعات فاكتور فروش مثلا شماره فاكتور فروش كد كالا فروخته شده و تعداد آن را ذخيره مي كنم مثلا"
كد فاكتور=1 كد كالا =2 تعداد=10 فروخته شده
به شكل زير:


103468


و با فرمول زير موجودي بدست مي آيد:
موجودي فعلي=(تعداد موجودي اول دوره كالا + تعداد خريداري شده از همان كالا) - تعداد فروخته شده از همان كالا
يا به عبارتي فرمول زير به ازاي هر كد كالا:
dbo.gheymat.tedad + dbo.zir_facktor_kh.tedad - dbo.zir_facktor_fo.tedad

اين فرمول براي هر كالا بايد مجزا باشد بر حسب كد كالا كه با توجه به جداول بالا ما يك view داشته باشيم كه با نوشتن يك query بتوانيم تعداد موجودي فعلي با توجه به فرمول بالا براي هر كالا را نمايش دهيم

از دوستان كسي هست من رو كمك كنه و زحمت راهنماي در انجام اين كار رو متحمل بشه


با تشكر

FastCode
دوشنبه 09 اردیبهشت 1392, 16:18 عصر
۱.در جداول detail نباید نام کالا نگهداری شود.
۲.برگشت از خرید و فروش رو هم در نظر نگرفتید.

hossein_sh2008
دوشنبه 09 اردیبهشت 1392, 17:26 عصر
با سلام
ممنون از اين كه پاسخ دادين البته دوست عزيز اين كل جداول من نيست و من يه نمونه ساختم براي پيدا كردن مشكل
در كل خود بانك اصلي همه اينها در نظر گرفته شده و بهيته تر و فاكتور هاي برگشتي و مرجوعي در نظر گرفته شده و در كل دليل استفاده اين فرمول براي همين مرجوعي هات و ..

مهدی هادیان2
دوشنبه 09 اردیبهشت 1392, 20:46 عصر
بسم الله الرحمن الرحیم
با سلام
یه تابع مثل تابع زیر درست کنید. ان شاالله مسئله تون مرتفع میشه.
CREATE FUNCTION [dbo].[FnCommodityStock]
(
/*
@parameter1 int = 5,
@parameter2 datatype
*/
@codekala bigint
)
RETURNS /* datatype */ bigint
AS
BEGIN

DECLARE @ExportCount bigint

SELECT @ExportCount=ISNULL(SUM(zir_faktor_fo.Number),0)
FROM zir_faktor_fo
WHERE (zir_faktor_fo.codekala = @codekala)

/*va hamintor @ImportCountInitialStock,@ImportRecieve */

RETURN /* value */ISNULL(@ImportCountInitialStock,0)
+ISNULL(@ImportRecieve,0)
-isnull(@ExportCount,0)
END

موفق باشید.

hossein_sh2008
سه شنبه 10 اردیبهشت 1392, 08:12 صبح
سلام دوست عزيز ممنون از اينكه پاسخ دادين
ميشه يه كم توضيح بيشتر بدين و اينكه من زياد SP كار نكردم و فكر كنم شما فقط از جدول zir_faktor_fo جمع كالا را بدست مياريد
اگر زحمت يك مثال كامل كه با جداول بالا باشه و با رعايت توضيحات بالا ممنون ميشم

مهدی هادیان2
سه شنبه 10 اردیبهشت 1392, 08:18 صبح
بسم الله الرحمن الرحیم
با سلام

ميشه يه كم توضيح بيشتر بدين و اينكه من زياد SP كار نكردم
موردی که براتون نوشتم یه تابع اسکالره. هر جا خواستید ازش استفاده کنید مثل تابع هایی که تو SQL وجود دارند صداش بزنید.

و فكر كنم شما فقط از جدول zir_faktor_fo جمع كالا را بدست مياريد
تو کامنتی که تو تابع بود موردی که فرمودید رو براتون نوشته بودم.
/*va hamintor @ImportCountInitialStock,@ImportRecieve */


اگر زحمت يك مثال كامل كه با جداول بالا باشه و با رعايت توضيحات بالا ممنون ميشم
موارد دیگه هم مثل همینه.
موفق باشید.

hossein_sh2008
سه شنبه 10 اردیبهشت 1392, 08:25 صبح
ممنون از اينكه خيلي سريع پاسخ مي دين
منظورم از SP توابعي كه در خود sql مي نويسند و اجرا مي كنند

در مورد بالا بابد با توجه به جزژيات زير بدست بياد موجودي

فرمول موجودي :
موجودي فعلي=(تعداد موجودي اول دوره كالا + تعداد خريداري شده از همان كالا) - تعداد فروخته شده از همان كالا
يا به عبارتي فرمول زير به ازاي هر كد كالا:
dbo.gheymat.tedad + dbo.zir_facktor_kh.tedad - dbo.zir_facktor_fo.tedad

اين فرمول براي هر كالا بايد مجزا باشد بر حسب كد كالا كه با توجه به جداول بالا ما يك view داشته باشيم كه با نوشتن يك query بتوانيم تعداد موجودي فعلي با توجه به فرمول بالا براي هر كالا را نمايش دهيم

مهدی هادیان2
سه شنبه 10 اردیبهشت 1392, 09:53 صبح
بسم الله الرحمن الرحیم
با سلام

فرمول موجودي :
موجودي فعلي=(تعداد موجودي اول دوره كالا + تعداد خريداري شده از همان كالا) - تعداد فروخته شده از همان كالا
يا به عبارتي فرمول زير به ازاي هر كد كالا:
dbo.gheymat.tedad + dbo.zir_facktor_kh.tedad - dbo.zir_facktor_fo.tedad
این موردی که فرمودید رو تو تابعی که براتون گذاشتم نوشتم:
RETURN /* value */ISNULL(@ImportCountInitialStock,0)
+ISNULL(@ImportRecieve,0)
-isnull(@ExportCount,0)



اين فرمول براي هر كالا بايد مجزا باشد بر حسب كد كالا كه با توجه به جداول بالا ما يك view داشته باشيم كه با نوشتن يك query بتوانيم تعداد موجودي فعلي با توجه به فرمول بالا براي هر كالا را نمايش دهيم
ورودی تابع مذکور کد کالاست.
CREATE FUNCTION [dbo].[FnCommodityStock]
(
/*
@parameter1 int = 5,
@parameter2 datatype
*/
@codekala bigint
)

تقریبا تابع رو براتون کامل نوشتم؛ شما فقط کافی ست کد زیر رو برای 2 جدول دیگه که فرمودید در همین تابع بنویسید و تمام .
DECLARE @ExportCount bigint

SELECT @ExportCount=ISNULL(SUM(zir_faktor_fo.Number),0)
FROM zir_faktor_fo
WHERE (zir_faktor_fo.codekala = @codekala)


ImportRecieve
ImportCountInitialStockو
بیانگر همین مطلب است.
موفق باشید.

ali_habibi1384
سه شنبه 10 اردیبهشت 1392, 11:25 صبح
تحليلت خوبه فقط نيازي نبود واسه خريد و فروش 2 تا جدول مجزا در نظر بگيري.هر دو رو توي يك جدول بدار و يك فيلد كه خريد يا فروش رو مشخص كنه براش بذار براي خريد 1 و براي فروش -1 بذار واسه برگشت از خريد و فروش هم ميتوني يك فيلد ديگه به جدول اضافه كني كه با 1 و -1 كردن اون بفهمي فاكتور برگشتي هست يا نه.
دوم اينكه فرمول محاسبه موجوديت هم اشتباه هست فرمول درستش اينه:
موجودي = مقدار خريد - مقدار فروش + موجودي اول دوره
در فرمول شما مقدار فروش و اول دوره داخل پرانتز بود كه باعث ميشد موجودي هميشه منفي بدست بياد

ali_habibi1384
سه شنبه 10 اردیبهشت 1392, 11:55 صبح
واسه روشن شدن مطلب يه مثال عملي براتون ميزنم. جدول رو بصورت زير طراحي كنيد

حالا به راحتي با كد زير ميتونيد يه سلكت ساده از جدول بگيريد تا موجودي همه كالا ها رو ببينيد

فايل اسكريپت ديتا بيس رو هم ضميمه كردم

hossein_sh2008
سه شنبه 10 اردیبهشت 1392, 12:02 عصر
سلام
ممنون از اينكه جواب ميدن
راه حل مناسبي ارائه ميديد ولي من 90 درصد پروژه رو درست كردم و برگشت اون از ابتدا مشكل هستش و خيلي چيزها بايد تغيير كنه
ولي به نظر من موجودي كالا اول دوره +تعدا خريد كالا-تعداد فروش محاسبه ميشه


فقط مي خوام از سه تا جدول بالا يك كوئري بگيره و موجودي رو در يك جدول نمايش بده موجودي همه كالا ها نه موجودي تك تك كه ما نخوايم كد كالا را به صورت دستي وارد كنيم

FastCode
سه شنبه 10 اردیبهشت 1392, 16:05 عصر
ISNULL(SUM(zir_faktor_fo.Number),0)
بهتر هست که بشه(کاملا سلیقه ای هست)

SUM(ISNULL(zir_faktor_fo.Number,0))

hossein_sh2008
سه شنبه 10 اردیبهشت 1392, 20:41 عصر
با اين سه جدول من آيا راهي براي نمايش موجودي با فرمول بالا هست؟

مهدی هادیان2
چهارشنبه 11 اردیبهشت 1392, 06:41 صبح
بسم الله الرحمن الرحیم

سلام
فقط مي خوام از سه تا جدول بالا يك كوئري بگيره و موجودي رو در يك جدول نمايش بده موجودي همه كالا ها نه موجودي تك تك كه ما نخوايم كد كالا را به صورت دستي وارد كنيم
با سلام
هر جا خواستید موجودی کالا رو بگیرید تابعی رو که ساختید؛فراخوانی کنید.
تکه کد زیر اطلاعات تمام کالاها به همراه موجودی را نمایش می دهد.
SELECT *,
dbo.FnProductStock(Product.ProductCode)AS ProductStock
FROM Product

موفق باشید.

hossein_sh2008
چهارشنبه 11 اردیبهشت 1392, 08:31 صبح
بسم الله الرحمن الرحیم

با سلام
هر جا خواستید موجودی کالا رو بگیرید تابعی رو که ساختید؛فراخوانی کنید.
تکه کد زیر اطلاعات تمام کالاها به همراه موجودی را نمایش می دهد.
SELECT *,
dbo.FnProductStock(Product.ProductCode)AS ProductStock
FROM Product

موفق باشید.
با سلام
جناب آقاي هاديان ممنون از اينكه سعي مي كنيد مشكل من حل بشه ولي آيا امكانش هست توابعي كه خودتون نوشتيد رو در يك sample بذاريد تا من متوجه بشم آخه توابع زياد كار نكردم و زياد متوجه نمي شم

باتشكر

مهدی هادیان2
چهارشنبه 11 اردیبهشت 1392, 11:56 صبح
بسم الله الرحمن الرحیم

با سلام
جناب آقاي هاديان ممنون از اينكه سعي مي كنيد مشكل من حل بشه ولي آيا امكانش هست توابعي كه خودتون نوشتيد رو در يك sample بذاريد تا من متوجه بشم آخه توابع زياد كار نكردم و زياد متوجه نمي شم

باتشكر
با سلام
تابع FnProductStockدر کد SELECT *, dbo.FnProductStock(Product.ProductCode)AS ProductStock
FROM Product همون تابعی ست که بالا براتون نوشتم و راجع بهش صحبت کردیم.
موفق باشید.

hossein_sh2008
پنج شنبه 12 اردیبهشت 1392, 16:00 عصر
با سلام و تشکر خدمت دوستان از راهنمایی هاتون


بلاخره کوئری رو که می خواستم نوشتم ولی یه مشکل کوچیک داره که اگر دوستان حلش کنن ممنون می شم



SELECT code, name_kala, tedad, tedad +
(SELECT SUM(tedad) AS Expr1
FROM zir_facktor_kh
WHERE (code_kala = gheymat.code)) -
(SELECT SUM(tedad) AS Expr1
FROM zir_facktor_fo
WHERE (code_kala = gheymat.code)) AS mojody
FROM gheymat



در قسمت select ها اگر خروجی هر کدومشون چیزی بر نگرده اون کالا حساب نمیشه و جواب select دیگری رو هم در نظر نمی گیره مثلا در قسمت زیر فاکتور فروش یا خرید ها ما از این کالا نخریده و یا نفروخته باشیم اون موقع هست که جواب جمع یا منهای کالا را اشتباه بر می گردونه
یعنی در کوئری زیر اگر از کالا نخریده باشیم (یعنی آی دی کالا در لیست نباشه) جمع اشتباه بر می گردونه



(SELECT SUM(tedad) AS Expr1
FROM zir_facktor_kh
WHERE (code_kala = gheymat.code))


یا

(SELECT SUM(tedad) AS Expr1
FROM zir_facktor_fo
WHERE (code_kala = gheymat.code))



خودم حدس می زنم SQL نمی تونه جمع کالا اولیه رو با یه مقدار null جمع کنه منهای یک عدد دیگه کنه ٰاگر می شد خروجی سلکتها رو اول به int تبدیل می کردیم که اگر چیزی بر نمی گشت صفر رو بر می گردوند جمع ها درست می شد



با تشکر

مهدی هادیان2
پنج شنبه 12 اردیبهشت 1392, 17:15 عصر
بسم الله الرحمن الرحیم
با سلام
خدا رو شکر که مسئله تون مرتفع شد.
مسئله شما با یه ISNULL حل میشه.
کد زیر رو امتحان کنید:
SELECT code, name_kala, tedad, tedad +
(SELECT ISNULL(SUM(tedad),0)) AS Expr1
FROM zir_facktor_kh
WHERE (code_kala = gheymat.code)) -
(SELECT SUM(ISNULL(tedad,0)) AS Expr1
FROM zir_facktor_fo
WHERE (code_kala = gheymat.code)) AS mojody
FROM gheymat

موفق باشید.

hossein_sh2008
شنبه 14 اردیبهشت 1392, 08:25 صبح
سلام
ممنون از راهنماییتون با یه خورده دست کاری بلاخره کارم شد

اینم کدش


SELECT code, name_kala, tedad, tedad +
(SELECT ISNULL(SUM(tedad), 0) AS Expr1
FROM zir_facktor_kh
WHERE (code_kala = gheymat.code)) -
(SELECT ISNULL(SUM(tedad), 0) AS Expr1
FROM zir_facktor_fo
WHERE (code_kala = gheymat.code)) AS mojody
FROM gheymat

مهدی هادیان2
شنبه 14 اردیبهشت 1392, 09:43 صبح
خواهش میکنم؛ خداروشکر
موفق باشید.