PDA

View Full Version : حرفه ای: الگوریتم محاسبه موجودی ریالی کالا به روش FIFO



Javad_raouf
چهارشنبه 20 خرداد 1394, 11:48 صبح
سلام دو تا Table داریم به این صورت:

132107

این جداول نیازی به توضیحات ندارن دیگه مشخصه کارشون چیه جدول اجناس یک رابطه یک به چند به جدول سند داره فقط یک نکته نه خیلی ضروری اینه که ستون های خاکستری رنگ (JensName و Mojudi) در جدول سند وجود ندارن بلکه همینجوری اینجا نوشتمشون تا اطلاعات خواناتر باشند
من نیاز دارم از این دو تاجدول برسم به یک همچین Viewی:


132109


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

در بهترین حالت اینه که با یک کوئری SQL به جواب برسیم و موجودی ریالی هر جنس نمایش داده بشه ولی اگر راهی بلدید که نیاز به تلفیق SQL با C#‎‎‎ داره هم خوبه فقط خواهشا سرعتش خوب باشه

Javad_raouf
چهارشنبه 20 خرداد 1394, 11:54 صبح
نحوه محاسبه ارزش ریالی اجناس موجود در انبار:
روش اول (مثال شلوار): اینجوری می ریم جلو که ما 5 تا شلوار خریدیم دونه ای 20 تومن که جمعش میشه 100، 3 عدد دیگه هم خریدیم به قیمت 30 که جمعش میشه 90 و وقتی با اون 100 قبلی جمعش کنیم جمعا میشن 190 تومن، 4 عدد فروختیم (مهم نیست چند فروختیم) که باید از موجودی ریالی کم کنیم ما 4 تا شلوار رو از اون 5 تاییه کم می کنیم چون فرضمون بر اینه که هر جنسی اول وارد میشه همون خارج میشه (First In First Out) پس 4 تا 20 تومن یعنی 80 تومن از 190 تومن کم می کنیم که نتیجه نهایی میشه 110
روش اول (مثال پیراهن): در ابتدا 3 تا پیراهن خریدیدم به قیمت 10 که جمعا میشه 30، بعد یک دونه از این پیراهنای 10 تومنی رو فروختیم(هیچوقت قیمت فروش در موجودی ریالی تاثیر ندارد) پس 10 تومن از 30 تومن کم می کنیم میشه 20، 4 تا پیراهن خریدیم این دفعه دونه ای 15 تومن که با قبلیا جمع کنیم میشه 80، در آخر 4 تا پیراهن فروختیم که دو تاش رو 10 تومنی حساب می کنیم و 2 تاش رو 15 تومنی (این محاسبه بر اساس موجودی انجام می شود چون ما 3 تا 10 تومنی داشتیم و 1 دونه فروختیم می مونه 2 تا 10 تومنی و 4 تا 15 تومنی و چون 10 تومنی ها رو زودتر خریدیم اول از 10 تومنی ها کم می کنیم و باقیمانده را از 15 تومنی ها کم می کنیم) که جمعا میشن 50 تومن و وقتی از 80 تومن کم کنیم می مونه 30 تومن


روش دوم (مثال شلوار): ابتدا بررسی می کنیم که شلوار چند تا موجودی نهایی داریم (نحوه محاسبه موجودی نهایی راحته و مهم نیست) و می بینیم که شلوار 4 عدد داریم، از آخر به اول میریم و فقط خرید ها رو بررسی می کنیم: آخرین خرید شلوار 3 تا بوده که دونه ای 30 خریدیم پس تا اینجا 90 داریم، خرید قبل ترش 5 تا بوده ولی ما 5 تاش رو نیاز نداریم بلکه 1 دونه خرید دیگه رو نیاز داریم (چون کلا 4 تا موجودی داریم و قیمت خرید 3 تاش مشخص شده و فقط قیمت خرید یکی آخری رو می خوایم بدونیم) پس یک دونه هم 20 تومنی خریدیم و در مجموع جواب میشه 110
روش دوم (مثال پیراهن): موجودی پیراهن 2 تاست از آخر به اول خرید ها رو بررسی می کنیم تا ببینیم این 2 تا رو چند خریدیم: آخرین بار 4 تا پیراهن خریدیم به قیمت 15 ولی ما فقط 2 تاش برامون مهمه یعنی 2 * 15 که میشه 30 به همین راحتی


روش دوم راحت تر و صحیح تره و الگوریتم ما بهتره طبق روش دوم عمل کنه چون هم راحت تره و هم اینکه نیاز به بررسی همه رکورد ها نداره و فقط چند رکورد آخر رو بررسی می کنه

hosseinbarnamenevis
چهارشنبه 20 خرداد 1394, 12:11 عصر
خب الان ما باید کد بهتون بدیم؟
شما که خودتون روش رو گفتین
کدش رو هم بنویسید دگ

hosseinbarnamenevis
چهارشنبه 20 خرداد 1394, 12:14 عصر
حالا پیشنهادم به شما اینه که شما یه جدول موجودی بر اساس کالا درست کنید
فرضا کالای شلوار رو در دو تاریخ مختلف به تعداد و قیمت های مختلف خریداری کردید
21/5/94 5 30.000
21/6/94 10 35.000

زمانی که عملیات فروش انجام میشه به ترتیب از اولین رکورد کم کنید
فرضا اگه 6 شلوار فروختین ابتدا اون 5 بشه صفر و 10 باید بشه 9
برای موجودی و میانگین هم کافیه تعداد با قیمت هر ردیف رو در خودش ضرب کنی
0*30.000
9*35.000

این عمل دقیقا روش FIFO هست
هرکس به یه شکلی میتونه انجام بده
شما هم میتونی بازم روش فکر کنی
اما جایی ذخیره بشه که مدام نخوای رکود ها رو بخونی بهتره

Javad_raouf
چهارشنبه 20 خرداد 1394, 13:03 عصر
خب الان ما باید کد بهتون بدیم؟
شما که خودتون روش رو گفتین
کدش رو هم بنویسید دگ
کدش رو قبلا نوشتم ولی سرعتش افتضاحه
شما فرض کن برا 1000 رکورد یک دقیقه زمان می بره:قهقهه:
و هر چی تعداد بالاتر بره تساعدی (شایدم تصاعدی) افت سرعت بیشتر میشه:افسرده:
می خواستم ببینم کسی از رفقا بلده یک کوئری مشتی بده تو ایکی ثانیه جواب برگرده:لبخند:


حالا پیشنهادم به شما اینه که شما یه جدول موجودی بر اساس کالا درست کنید
فرضا کالای شلوار رو در دو تاریخ مختلف به تعداد و قیمت های مختلف خریداری کردید
21/5/94 5 30.000
21/6/94 10 35.000

زمانی که عملیات فروش انجام میشه به ترتیب از اولین رکورد کم کنید
فرضا اگه 6 شلوار فروختین ابتدا اون 5 بشه صفر و 10 باید بشه 9
برای موجودی و میانگین هم کافیه تعداد با قیمت هر ردیف رو در خودش ضرب کنی
0*30.000
9*35.000

این عمل دقیقا روش FIFO هست
هرکس به یه شکلی میتونه انجام بده
شما هم میتونی بازم روش فکر کنی
اما جایی ذخیره بشه که مدام نخوای رکود ها رو بخونی بهتره
من با شما موافقم تقریبا به این نتیجه رسیدم که تنها راه افزونگی داده یا همون نگه داشتن اطلاعاته
ولی این روشی که شما میگی اگر کاربر یک رکورد جدول که مال یک سال پیش هست رو ویرایش کنه کلا همش باید از اول حساب بشه چون اینا همه به هم وابسته هستند:افسرده:
باید یک راه بهتری باشه

asman.abi
چهارشنبه 20 خرداد 1394, 14:33 عصر
سلام
یه سوال شما ستون sumbuyو ستون sumsell رو دارید تو جدولتون؟
اگه دارید سریع ترین روش ممکن که میشه رو بگم.

Javad_raouf
چهارشنبه 20 خرداد 1394, 17:48 عصر
سلام
یه سوال شما ستون sumbuyو ستون sumsell رو دارید تو جدولتون؟
اگه دارید سریع ترین روش ممکن که میشه رو بگم.
آره داداش دارم
ممنون میشم سریع ترین روش رو بگید:لبخند:

asman.abi
چهارشنبه 20 خرداد 1394, 19:39 عصر
و اما سریع ترین روش:لبخند: (واقعا)
چهار نوع جنس داریم. برای چهار نوع جنس روال یکی هست.
برای شلوار
کد sql مربوطه
select sum(SumBuy-SumSell) from table_kh&fo where Jens_ID=1

در اینجا table_kh&fo همون اسم جدول شماست. همچی اسمی گذاشتم:لبخند:
این موجودی دقیق انبار رو میده نه به صورت تقریبی که گفتید فروش کالا قیمتش مثل فروشش باشه .
برای کالای دیگه هم همین طور فقط Jens_ID تغییر می کنه.

مثلا برای پیراهن
select sum(SumBuy-SumSell) from table_kh&fo where Jens_ID=2

Javad_raouf
چهارشنبه 20 خرداد 1394, 20:28 عصر
مرسی رفیق از اینکه وقت گذاشتی
ولی این اصلا اون چیزی نیست که من می خوام
پست 2 رو مطالعه کنید تا متوجه بشید من دقیقا چی می خوام

asman.abi
چهارشنبه 20 خرداد 1394, 20:31 عصر
این کد جواب شما رو میده . یعنی موجودی ریالی (با سرعت مناسب)
چون لزومی به ساختار داده FIFO نبود. مسئله رو نپیچونید.

در کل تصمیم با شماست. شما امتحان کنید نتیجه رو بگید.

Javad_raouf
چهارشنبه 20 خرداد 1394, 21:17 عصر
این کد جواب شما رو میده . یعنی موجودی ریالی (با سرعت مناسب)
چون لزومی به ساختار داده FIFO نبود. مسئله رو نپیچونید.

در کل تصمیم با شماست. شما امتحان کنید نتیجه رو بگید.
نه داداشم به جان خودم جواب نمی ده شما رو همین داده هایی که گذاشتم تست کن جواب عجیب غریب در میاد
اصلا همین قدر به شما بگم که قیمت فروش جنس هیچ ربطی به موجودی ریالی اجناس
این کدی که شما گذاشتی وابسته است به قیمت فروش پس همین اثبات بسه که کدتون مشکل داری
موجودی ریالی بر اساس موجودی اجناس و اینکه هر کدوم رو چند خریدی در میاد و هیچ ربطی به قیمت فروش نداره
یعنی موجودی ریالی با تغییرات قیمت فروش نباید تغییر کنه
ولی طبق کوئری شما تغییر می کنه
بازم عرض می کنم اگر دوست داشتید پست شماره 2 رو با دقت بخونید بعد می بینید که در اشتباهید

hosseinbarnamenevis
چهارشنبه 20 خرداد 1394, 22:03 عصر
کدش رو قبلا نوشتم ولی سرعتش افتضاحه
شما فرض کن برا 1000 رکورد یک دقیقه زمان می بره:قهقهه:
و هر چی تعداد بالاتر بره تساعدی (شایدم تصاعدی) افت سرعت بیشتر میشه:افسرده:
می خواستم ببینم کسی از رفقا بلده یک کوئری مشتی بده تو ایکی ثانیه جواب برگرده:لبخند:

من با شما موافقم تقریبا به این نتیجه رسیدم که تنها راه افزونگی داده یا همون نگه داشتن اطلاعاته
ولی این روشی که شما میگی اگر کاربر یک رکورد جدول که مال یک سال پیش هست رو ویرایش کنه کلا همش باید از اول حساب بشه چون اینا همه به هم وابسته هستند:افسرده:
باید یک راه بهتری باشه

دوست عزیز هیچ توجیهی وجود نداره که بخواد فاکتورهایی که مدت زمان زیادی گذشته امکان ویرایش وجود داشته باشه

asman.abi
چهارشنبه 20 خرداد 1394, 22:34 عصر
نه داداشم به جان خودم جواب نمی ده شما رو همین داده هایی که گذاشتم تست کن جواب عجیب غریب در میاد
اصلا همین قدر به شما بگم که قیمت فروش جنس هیچ ربطی به موجودی ریالی اجناس
این کدی که شما گذاشتی وابسته است به قیمت فروش پس همین اثبات بسه که کدتون مشکل داری
موجودی ریالی بر اساس موجودی اجناس و اینکه هر کدوم رو چند خریدی در میاد و هیچ ربطی به قیمت فروش نداره
یعنی موجودی ریالی با تغییرات قیمت فروش نباید تغییر کنه
ولی طبق کوئری شما تغییر می کنه
بازم عرض می کنم اگر دوست داشتید پست شماره 2 رو با دقت بخونید بعد می بینید که در اشتباهید
انگار من منظورتون رو متوجه نشدم. پس کد من پاسخ نیازتون نیست.

pbm_soy
پنج شنبه 21 خرداد 1394, 01:41 صبح
یک سوال: از این برنامه شما در روز چند بار درخواست موجودی ریالی میکنند؟ نهایتش کاربر در روز 3 یا 4 دقیقه معطل میشه دیگه! (البته اگه کار خیلی زمانبر باشدشاید با قفل وکرش هم مواجه بشی! مگر اینکه این تیکه را MultiThread بنویسی!)

وقتی برای محاسبه از FIFO باید استفاده کنید ، کار نوشتن Query را دشوار میکند! (هرچند من خودم وقتی براش نذاشتم صرفا پابرهنه آمدم وسط حرف شما دوستان شرمنده!)

بنظر من همون کدی که خودتون نوشتید را کمی بهینه تر کنید! (البته نمیدونم چطوری نوشتنید کل کد با C# است یا ....) سعی کردید کل کار را بصورت یک Store Procedure بنویسید؟ (سرعت Store procedureها بالاست به شرطی که الگوریتم استفاده شده هم مناسب باشد) و یا زدن ایندکسهای مناسب هم میتواند در سرعت کار کمک کند (حدودا تعداد رکوردهای شما چقدر است؟)

* البته این نکته را هم بگم شما جائی گفتید برای 1000 رکورد یک دقیقه زمان میبرد! پس اینجا ایندکس فکر نمیکنم نتیجه ای داشته باشد چون دسترسی یا پیمایش کردن 1000 رکورد زمانبر نیست محاسباتی که انجام میدهید طولانی است! احتمالا برای محاسبه ارزش ریالی یک کلا چندین بار جستجوی مختلف انجام میدهی تا هر دفعه اولین مبلغ خرید (یا هرکدام که مناسبش باشد) را براش پیدا کنی!
بادیدن کد شاید دوستان بتونن بهتر نظر بدن!

* یک پیشنهاد ساده (البته شبیه پیشنهاد یک از دوستان است ولی فکر میکنم ساده تر و کوتاهتر منطقی تر باشد)
شما در همون جدول سند فیلدهای موجودی و ارزش ریالی موجودی را اضافه کنید و در هر بار فروش(خرید) همانطور که موجودی را ثبت میکنید ارزش ریالی را هم برای آن جنس محاسبه کنید و جلوی آن سند ثبت کنید
اضافه شدن یک فیلد فکر نمیکنم موضوع آنچنان مهمی برای برنامه ای اینچنینی باشد و یا اینکه برای محاسبه ارزش ریالی موجودی برنامه ات بخواد کند جواب بده یا قفل کنه و این وسط اعتبار برنامه و زحمات شما هدر برود!

Javad_raouf
پنج شنبه 21 خرداد 1394, 09:06 صبح
دقیقا با شما موافقم:لبخندساده:
اتفاقا دیشب دقیقا رو همین مطلب کار کردم البته جدول سند فیلد موجود نداره بلکه جدول جنس یک فیلد اضافه کردم براش برای موجودی ریالی
که هر وقت جدول سند ویرایش میشه رکورد متناظرش در جدول جنس آپدیت میشه
یکی از خوبیاشم اینه که همه چی سمت SQL انجام میشه

محمد آشتیانی
پنج شنبه 21 خرداد 1394, 13:37 عصر
سلام
این سوال بیشتر به بخش Sql مربوطه به نظرم ، به هر حال این sp رو تست کنید و نتیجه رو اعلام کنید - من تو این sp نام جدول جنس رو tblJens و جدول سند رو tblSanad در نظر گرفتم (از این لحاظ sp رو چک کنید)


CREATE PROC dbo.GetList
AS
DECLARE @currentitem INT = -1
DECLARE @output TABLE (
JensID INT,
JensName NVARCHAR(50),
Mojudi INT,
MojudiRiali INT
)
INSERT @output
SELECT j.jensid, j.JensName, (ISNULL((SELECT SUM([count]) FROM tblSanad WHERE jensID =j.JensID and SellORBuy ='Buy'),0) - ISNULL((SELECT SUM([count]) FROM tblSanad WHERE jensID =j.JensID and SellORBuy ='Sell'),0)),0 FROM tblJens AS j
WHILE (1=1)
BEGIN


SELECT TOP 1 @currentitem = jensid
FROM @output
WHERE JensID > @currentitem
ORDER BY JensID

IF @@ROWCOUNT = 0 BREAK;


DECLARE @TotalBuy INT = (SELECT SUM([Price] * [count]) FROM tblSanad WHERE jensID=@currentitem AND SellORBuy='Buy')
DECLARE @TotalSell INT = (SELECT SUM([count]) FROM tblSanad WHERE jensID=@currentitem AND SellORBuy='Sell')
DECLARE @SellItemsPrice INT = 0, @tmp int, @buyprice int, @rcount INT, @i INT


create table #TS (
RowID INT identity(1,1),
BCount INT,
BPrice INT
)
INSERT #TS
SELECT [COUNT], price FROM tblSanad WHERE jensID=@currentitem AND SellORBuy='Buy' ORDER BY sanadID


SET @rcount = @@ROWCOUNT
SET @i = 1


WHILE (@i <= @rcount)
BEGIN


SELECT @tmp = bcount FROM #TS WHERE RowID = @i
SELECT @buyprice = bprice FROM #TS WHERE RowID = @i


IF (@TotalSell > 0)
BEGIN


IF (@TotalSell <= @tmp)
BEGIN
SET @SellItemsPrice = @SellItemsPrice +( @TotalSell * @buyprice)
SET @TotalSell = @TotalSell - @tmp
END
ELSE
BEGIN
SET @SellItemsPrice = @SellItemsPrice + (@tmp * @buyprice)
SET @TotalSell = @TotalSell - @tmp
END
END


IF (@TotalSell <= 0) Break;
SET @i = @i +1
END


DROP TABLE #ts
UPDATE @output SET MojudiRiali = (@TotalBuy - @SellItemsPrice) WHERE JensID = @currentitem
END


SELECT * FROM @output
GO


موفق باشید.

Javad_raouf
پنج شنبه 21 خرداد 1394, 18:44 عصر
سلام داداش
مرسی کدت واقعا عالیه بدون خطا جواب میده سرعتشم از اون قدیمیه خودم بیشتره:تشویق:
ولی بازم خیلی کنده برای 2000 رکورد 1 دقیقه و خورده ای:افسرده:
بعضی مشتریان تا 50 هزار رکورد دارن:افسرده:
یعنی یک موجودی ریالی چیزی حول و حوش 25 دقیقه زمان می بره:کف:
بازم می گم واقعا خیلی لطف کردید و حسابی وقت گذاشتید:قلب:


دقیقا با شما موافقم:لبخندساده:

اتفاقا دیشب دقیقا رو همین مطلب کار کردم البته جدول سند فیلد موجود نداره بلکه جدول جنس یک فیلد اضافه کردم براش برای موجودی ریالی
که هر وقت جدول سند ویرایش میشه رکورد متناظرش در جدول جنس آپدیت میشه
یکی از خوبیاشم اینه که همه چی سمت SQL انجام میشه
آقا ما اینجوری قضیه رو تموم کردیم و چون موجودی ریالی از طریق Trigger و Function هنگام Insert و Update برای همون جنس توی جدول ذخیره میشه خیلی زمان نمی بره و هنگام گزارش گیری هم خیلی سریع جواب بر می گرده
ولی بازم مشکل دارم:گریه:
بعد از کلی کد نویسی تازه فهمیدم اینجوری به درد من نمی خوره چون به وسیله این روش من فقط می تونم گزارش موجودی ریالی همین الان رو بگیرم و اگر بخوام موجودی ریالی مثلا دیروز رو بگیرم یا یک تاریخ دیگه چی؟؟؟؟؟:عصبانی++:
شاید لازم باشه اینو بگم که توبرنامه حسابداری باید این امکان باشه که موجودی ریالی انبار در تاریخ مثلا یک ماهه پیش رو بگیریم:کف:
این یعنی نمیشه از Trigger استفاده کرد یعنی فقط و فقط باید یک کوئری یا کد بنویسم و در لحظه موجودی ریالی رو حساب کنم:متعجب:
الان یک ایده ای به ذهنم رسیده اینکه بیام کلا عملیات رو توی C# انجام بدم شاید سریعتر بشه چون اونجا دستمون باز تره خوب:افسرده:
حتما نتیجه رو اینجا می زارم
دوستان ضمن تشکر از همه اگر کسی ایده ای دیگه به ذهنش رسید یا قبلا این کار رو انجام داده ما رو به نصیب نزاره:قلب:

محمد آشتیانی
پنج شنبه 21 خرداد 1394, 18:59 عصر
سلام
ای کاش یک نمونه دیتابیس با حداقل همین دو جدول با دیتا اینجا میذاشتی تا امکان تست باشه و بشه با تعداد رکورد بیشتر sp رو تست کرد
من با همون تصویری که گذاشته بودی تیبل ها رو ساختم و تست کردم و از این جهت حق با شماست ، چون نمیشه سرعت رو واقعا دید

برای مشکل جدید هم به نظرم میرسه که یک فیلد تاریخ باید به جدول سند اضافه کنی (اصولا برای ثبت این تیپ اطلاعات تاریخ و ساعت هم مهمه) ، به این ترتیب میشه با یک sp شبیه به چیزی که بالاتر گذاشتم + فیلد تاریخ ، برای هر تاریخی مقدار مورد نظر رو بدست آورد.


موفق باشید.

Javad_raouf
پنج شنبه 21 خرداد 1394, 22:46 عصر
سلام
ای کاش یک نمونه دیتابیس با حداقل همین دو جدول با دیتا اینجا میذاشتی تا امکان تست باشه و بشه با تعداد رکورد بیشتر sp رو تست کرد
من با همون تصویری که گذاشته بودی تیبل ها رو ساختم و تست کردم و از این جهت حق با شماست ، چون نمیشه سرعت رو واقعا دید

سلام داداش ان شا الله شنبه می زارم


رای مشکل جدید هم به نظرم میرسه که یک فیلد تاریخ باید به جدول سند اضافه کنی (اصولا برای ثبت این تیپ اطلاعات تاریخ و ساعت هم مهمه) ، به این ترتیب میشه با یک sp شبیه به چیزی که بالاتر گذاشتم + فیلد تاریخ ، برای هر تاریخی مقدار مورد نظر رو بدست آورد.


با کد شما میشه برای هر تاریخ به دست آورد من منظورم این بود که از روش ذخیره کردن اطلاعات نمیشه استفاده کرد چون جواب نسبت به ورودی متغیره:لبخندساده: ولی کد شما چون همون لحظه داره محاسبه می کنه که با هر ورودی دیگه ای هم میشه نوشتش
ضمنا تو جدول من تاریخ هست هزار تا فیلد دیگه هست:لبخند: توی مثال تاریخ نیست که خیلی هم مهم نیست شما مثلا فرض کنید می خوایم موجودی ریالی رو تا قبل از سند شماره 5 داشته باشیم مهم اینه که الگوریتممون هم ورودی پذیر باشه هم سریع
------------------------------------------------


الان یک ایده ای به ذهنم رسیده اینکه بیام کلا عملیات رو توی C#‎‎‎‎‎‎‎‎‎‎ انجام بدم شاید سریعتر بشه چون اونجا دستمون باز تره خوب
:افسرده:

حتما نتیجه رو اینجا می زارم

و اما بعد
ضمن قدر دانی از همه دوستان عزیز که زحمت کشیدن مخصوصا اقای آشتیانی که برای نوشتن SP شون مسلما وقت بسیار زیادی گذاشتن
به اطلاع می رسانم خدا رو شکر با استفاده از پیاده سازی الگوریتم در محیط سی شارپ به سرعت فوق العاده ای به نتیجه رسیدم:لبخند:
دریافت خروجی برای 2000 جنس و 36000 سند خرید و فروش در عرض کمتر 1 ثانیه:متعجب:
الان که شدیدا مخم تعطیل شده و خستم چون تازه تمومش کردم ان شا الله شنبه کدش رو می زارم

pbm_soy
جمعه 22 خرداد 1394, 00:36 صبح
در صورت امکان کد یا الگوریتمی که در سی شارپ نوشتید را هم با به اشتراک بگذارید

Javad_raouf
یک شنبه 24 خرداد 1394, 19:36 عصر
سلام دوستان
ببخشید یکم دیر شد
پیاده سازی الگوریتم توی محیط سی شارپ:
این کد کامل متد مورد نظر توی سی شارپ:
public long poolJensInProgramFIFO(long tariz)
{
SqlConnection con = new SqlConnection("ConectionString");
#region Declare Query
string TarizWhere = "";
if (tariz > -1)
{
TarizWhere = "tariz <= " + tariz;
TarizWhere = " AND (" + TarizWhere + ") ";
}
string queryJensMojudi = @"
Select JensID,Sum(SellOrBuy * Count) As Mojudi From tblSanad
Where (SellOrBuy = '+1' Or SellOrBuy = '-1') " + TarizWhere + @"
Group by JensID
having Sum(SellOrBuy * Count) > 0
Order by JensID";


string queryJensBuy = @"Select SanadID,tariz,SellOrBuy,JensID,Count,Price,SumSell ,SumBuy From tblSanad
Where SellOrBuy ='+1' " + TarizWhere + @"
Order by JensID, Tariz desc, SanadID Desc";


#endregion
try
{
SqlDataAdapter daJens = new SqlDataAdapter(queryJensMojudi, con);
DataSet dsJens = new DataSet();
daJens.Fill(dsJens);
DataTable dtJens = dsJens.Tables[0];


SqlDataAdapter daBuy = new SqlDataAdapter(queryJensBuy, con);
DataSet dsBuy = new DataSet();
daBuy.Fill(dsBuy);
DataTable dtBuy = dsBuy.Tables[0];
long CurJensID = 0;
long TotalRiali = 0;
long JensRiali = 0;
double jensMojudi = 0;
double BuyCount = 0;
int conterBuy = 0;
for (int i = 0; i < dtJens.Rows.Count; i++)
{
JensRiali = 0;
DataRow JensRow = dtJens.Rows[i];
CurJensID = (long)JensRow["JensID"];
jensMojudi = (double)JensRow["Mojudi"];
if (jensMojudi <= 0)//موجودی جنس کمتر یا مساوی صفر است
continue;
while (dtBuy.Rows.Count > conterBuy && (long)dtBuy.Rows[conterBuy]["JensID"] != CurJensID)
conterBuy++;
while (jensMojudi > 0 && dtBuy.Rows.Count > conterBuy)
{
DataRow BuyRow = dtBuy.Rows[conterBuy];
BuyCount = (double)BuyRow["Count"];
JensRiali += (long)(Math.Min(BuyCount, jensMojudi) * (long)BuyRow["Price"]);
jensMojudi -= BuyCount;
conterBuy++;
}
TotalRiali += JensRiali;
}
return TotalRiali;
}
catch (Exception err) { MessageBox.Show(err.Message); ; return -1; }
finally { }


}
نکته: این متد یک خروجی از نوع long داره که مجموع ارزش ریالی اجناس رو محاسبه می کنه. چون من اینجوری نیاز داشتم و تکی تکی نمی خواستم ولی هر کسی که بخواد می تونه با اندکی تغییرات کدی بنویسه که یک DataTable برگردونه و موجودی ریالی هر جنس رو جدا جدا برگردونه
ایشالا به زودی کد رو توضیح می دم

Mahmoud Zaad
یک شنبه 24 خرداد 1394, 20:21 عصر
سلام و تشکر که نتیجه کار رو اینجا پست کردید
فقط به قول فلاسفه یه مساله ی ماهوی! هست اونم اینکه من شنیدم اگه نرم افزار قراره به دارایی هم خروجی بده دارایی fifo رو قبول نمی کنه مگر برای شرکتهایی که کالاشون به شدت فساد پذیره مثل لبنیاتی ها. برای سایر شرکتها روش میانگین رو قبول می کنند.

hbs2480
شنبه 04 آذر 1396, 12:15 عصر
روش Lifo هست که مورد قبول نیست دوست عزیز