PDA

مشاهده نسخه کامل : جمع و نمایش اقساط



ABC.ABC
05-08-18, 13:58
سلام دوستان
دارم ی برنامه برای کارای حسابداری مینویسم که ی جا به مشکل خوردم و نمیدونم به چه صورت برم جلو ، که ممنون میشم راهنمایی کنید
یک جدول اعضا هست و یک جدول اقساط
در جدول اقساط مبلغ قسط ماهانه ، مبلغ کل ، تعداد قسط و تاریخ شروع قسط زده شده
حالا برای جستجو و نمایش اقساط ، با استفاده از تاریخ میشه جستجو کرد ، اما چون فقط تاریخ شروع قسط رو گذاشتم فقط هم می تونم روی تاریخ شروع قسط جسجو بزنم و راه خوبی به نظرم نرسیده که بتونم اگه یک فرد 10 ماه باید قسط بده وسط قسطش تاریخ جستجو کرد قسط مربوط به اون تاریخ رو نمایش بده
مثلا من باید از تاریخ 20 تیر تا 20 اسفند قسط بدم اما فقط 20 تیر در جدول هست و اگر اقساط ماه بهمن رو جستجو کنیم دیگه این قسط رو نمایش نمیده
ی حالت که فک کردم میشه یک جدول دیگه هم گذاشت و اگه ده ماه قسط هست برای یک فرد ده تا قسط با ماه های پی در پی داخل جدول بزنه بره جلو اما در حالت الکی سنگین شده و به دنبال راه مناسبتری هستم
:11():

ravegoat
06-08-18, 10:17
سلام دوست عزیز،

صرفا برای یک امکان سنجی می پرسم: آیا به جای ستون تعداد ماه های پرداخت قسط، می شه ستون تاریخ اتمام قسط داشت؟

ABC.ABC
06-08-18, 17:31
سلام دوست عزیز،

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

ravegoat
06-08-18, 19:33
در مقدمه خدمتتون عرض کنم:
شیوه ی بهینه ی ذخیره ی متغیر ها در جدول وابسته به نحوه ی واکشی داده از اون جدول هستش. به عنوان مثال اگر در کوئری های شما بیش تر با مدت زمان پرداخت اقساط سر و کار دارید، شاید بهترین حالت ذخیره ی همین مقدار در جدول باشه. در سمت مقابل اگر کوئری ها بیش تر به تاریخ اتمام اقساط بر می گرده، بهتره به جای طول مدت اقساط، تاریخ اتمام اقساط رو جایگزین کنید. حتی شاید بهتر باشه صرف نظر از بروز افزونگی، هر دو مقدار طول مدت اقساط و هم تاریخ اتمام اقساط رو ذخیره بفرمایید.

اگر تاریخ رو به شکل میلادی در جدول ذخیره فرمودید و ستون متناظر اون نیز در جدول از نوع datetime انتخاب شده، امکان بهره گیری از عملگر های مقایسه وجود دارد. به عنوان مثال کوئری زیر:


SELECT * FROM Installment WHERE InstallmentStart < '2018-06-08' AND InstallmentEnd > '2018-06-08'


تمام رکورد های جدول Installment رو بر می گردونه به شکلی که مقدار ستون InstallmentStart (تاریخ شروع اقساط) اون ها کم تر از 8ام آگوست 2018 و مقدار ستون InstallmentEnd (تاریخ اتمام اقساط) اون ها بیش تر از تاریخ مذکور باشه. به عبارتی این کوئری اطلاعات اقساطی رو بر می گردونه که تا به امروز در جریان هستند.

شاد باشید
آرمین:give_rose:

ABC.ABC
06-08-18, 23:05
در مقدمه خدمتتون عرض کنم:
شیوه ی بهینه ی ذخیره ی متغیر ها در جدول وابسته به نحوه ی واکشی داده از اون جدول هستش. به عنوان مثال اگر در کوئری های شما بیش تر با مدت زمان پرداخت اقساط سر و کار دارید، شاید بهترین حالت ذخیره ی همین مقدار در جدول باشه. در سمت مقابل اگر کوئری ها بیش تر به تاریخ اتمام اقساط بر می گرده، بهتره به جای طول مدت اقساط، تاریخ اتمام اقساط رو جایگزین کنید. حتی شاید بهتر باشه صرف نظر از بروز افزونگی، هر دو مقدار طول مدت اقساط و هم تاریخ اتمام اقساط رو ذخیره بفرمایید.

اگر تاریخ رو به شکل میلادی در جدول ذخیره فرمودید و ستون متناظر اون نیز در جدول از نوع datetime انتخاب شده، امکان بهره گیری از عملگر های مقایسه وجود دارد. به عنوان مثال کوئری زیر:


SELECT * FROM Installment WHERE InstallmentStart < '2018-06-08' AND InstallmentEnd > '2018-06-08'


تمام رکورد های جدول Installment رو بر می گردونه به شکلی که مقدار ستون InstallmentStart (تاریخ شروع اقساط) اون ها کم تر از 8ام آگوست 2018 و مقدار ستون InstallmentEnd (تاریخ اتمام اقساط) اون ها بیش تر از تاریخ مذکور باشه. به عبارتی این کوئری اطلاعات اقساطی رو بر می گردونه که تا به امروز در جریان هستند.

شاد باشید
آرمین:give_rose:
ممنونم
اما مشکلی که این کوِءری داره بین تاریخ های انتخاب شده شروع و پابان یک نفر قسطش تمام شده باشه رو نمیاره و مورد بعدی که بهش نیاز دارم اگر دو ماه انتخاب شده بود و یک نفر دو قسط داره باید دو دفعه آورده بشه (برای جمع اقساط انتخاب شده)
ی مقدار کاملتر این مورد رو توضیح میدم خدمتتون:
تاریخ شروع قسط ، تعداد قسط و تاریخ اتمام قسط داخل جدول اقساط موجوده
افرادی که ثبت شدن به این صورت هست
فرد اول - تاریخ شروع قسط 97/05/14 تاریخ اتمام قسط 97/12/14 مبلغ قسط 100
فرد دوم 97/05/15 تاریخ اتمام قسط 97/12/15 مبلغ قسط 1000
حالا برای لیست ، جستجو بر اساس تاریخ گذاشتم ، از تاریخ...... تا تاریخ.......
جستجو می کنیم : از تاریخ 97/07/01 تا تاریخ 97/09/01
حالا این جا باید فرد اول رو دو دفعه بیاره چون هم برای مهر و هم ابان قسط داره
فرد دوم هم به همین صورت
جمع اقساط = 2200
راهی به ذهنم نرسید که به سادگی بشه چنین کاری انجام داد جز اینکه بیام هر قسط رو تک تک داخل بانک اطلاعاتی ذخیره کنم
مثلا فرد اول به جای 1 رکورد 7 رکورد اشغال می کنه به این صورت:
97/05/14
97/06/14
97/07/14
.
.
.
97/12/14
حالا میتونم داخل همون جدول بزارمش یا ی جدول دیگه بزارم به جدول اقساط متصلش کنم و این رکورد های هر قسط رو اونجا بزارم که تمیز تر در بیاد
البته اینجا ی مشکل دیگه هم دارم و نمیدونم چطور باید به چنین حالتی ذخیره کنم ، در فرم ثبت اقساط ، تاریخ شروع قسط و تعداد قسط رو دارم ، اینجا باید تاریخ پایان قسط حساب شه ... و به همینصورت به تعداد ماه های قسط ، هر دفعه ماه + 1 شه و دوباره ذخیره شه ، نمیدونم به چه صورت میتونم به طور مثال 97/05/14 رو به 97/06/14 تبدیل کنم تا دوباره ذخیرش کنم
در بانک اطلاعاتی به صورت datetime2 و به صورت شمسی ذخیره می کنم
از وقتی که میگذارید ممنون:11():

ravegoat
07-08-18, 11:41
خواهش می کنم...

ببخشید، بنده متوجه نشده بودم که جست و جو در یک بازه صورت می گیره. در این حالت کوئری به شکل زیر قابل بازنویسی است:


SELECT * FROM Installment WHERE (InstallmentStart > FROMDate OR InstallmentEnd > FROMDate) AND (InstallmentStart < @toDate OR InstallmentEnd < @toDate)


که در اون پارامتر fromDate تاریخ شروع جست و جو و پارامتر toDate تاریخ پایان جست و جو هستش.

تاریخ عملا یک بردار تک بعدی هستش. وقتی ما تاریخ آغاز قسط و پایان قسط رو داریم، اختلاف این دو برداری هستش که بازه ی پرداخت قسط رو مشخص می کنه. به شکل مشابه اختلاف toDate و fromDate نیز برداری خواهد بود که بازه ی جست و جو رو مشخص می کنه. ما می تونیم با یک رابطه ی ریاضی، بازه ی هم پوشانی دو بردار تک بعدی رو به دست بیاریم. کد زیر بر همین اساس کار می کنه. شما به ازای هر ردیف حاصل شده از کوئری بالا می تونید این کد رو اجرا بفرمایید و در خروجی میزان پرداختی رو دریافت کنید.


private double computePayment(
DateTime installmentStart /*!< [in] Installment start date */,
DateTime installmentEnd /*!< [in] Installment end date */,
DateTime fromDate /*!< [in] Searching start date */,
DateTime toDate /*!< [in] Searching end date */,
double monthlyPayment /*!< [in] Monthly installment payment */)
{
//! \const Number of days in each month
const double _daysInMonth = 30;

long _lBound = Math.Max(installmentStart.Ticks, fromDate.Ticks);
long _uBound = Math.Min(installmentEnd.Ticks, toDate.Ticks);

TimeSpan _diff = TimeSpan.FromTicks(_uBound - _lBound);
double _totalMonth = Math.Truncate(_diff.Days / _daysInMonth);

double _totalPayment = monthlyPayment * _totalMonth;
return _totalPayment;
}


در نهایت اگر خروجی های تابع رو به ازای هر ردیف با هم جمع کنیم، جمع کل اقساط به دست خواهد آمد. تاریخ آغاز قسط، تاریخ پایان قسط و میزان پرداختی ماهانه ی قسط (monthlyPayment)، باید از جدول به تابع computePayment پاس داده بشه. همچنین جهت سادگی تعداد روز های ماه برابر 30 روز در نظر گرفته شده.

شاد باشید
آرمین:11():