ورود

View Full Version : اشکال در کوئري محاسبه باقيمانده فاکتور بعد از پرداخت هر قسط به صورت مجزا



valentine093
پنج شنبه 01 بهمن 1394, 22:31 عصر
با سلام و خسته نباشید خدمت اساتید
من برای فرم پرداخت اقساط یک برنامه حسابداری کوئری نیاز دارم که باقیمانده بدهی رو بعد از هر پرداخت قسط نشون بده یعنی اگه مشتری 100 هزار بدهی داره بعد از پرداخت قسط اول باقیمانده این ردیف رو نشون بده و برای پرداخت های بعدی باقیمانده هر ردیف رو به صورت مجزا نشون بده ولی با هر کوئری که مینویسم یا برا همه پرداختها آخرین باقیمانده رو نشون میده(به طور یکسان) یا با with که نوشته بودم یکی یا دو مورد رو درست آورد:ناراحت:

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

valentine093
شنبه 03 بهمن 1394, 00:09 صبح
yani engadr shakte moshkele man?????

ham3d1988
دوشنبه 05 بهمن 1394, 23:45 عصر
سلام این احتمالا جواب میده البته شاید بشه کاراتر نوشت
فقط کاش تاریخ ها datetime ذخیره می شد

select
si.invoicecode,
si.invoices_price,
tp.tick_id,
tp.pay_date,
tp.pay_time,
tp.pay_value,
si.invoices_price- ReceiptToDate.pay_value CurrentRemainder
from tbl_tick_pay tp with(nolock)
join tbl_sell_invoices si with(nolock) on si.invoices_code = tp.invoice_code
outer apply
( select isnull(sum(pay_value),0) pay_value from tbl_tick_pay tp1 with(nolock)
where ((tp1.pay_date<tp.pay_date) or(tp1.pay_date=tp.pay_date and tp1.pay_time<=tp.pay_time)) and tp1.invoicecode=tp.invoicecode
)ReceiptToDate

order by invoicecode,tick_id,pay_date,pay_time

valentine093
سه شنبه 06 بهمن 1394, 23:27 عصر
سلام .ممنون مهندس ولی این اخطار رو میده138673

valentine093
سه شنبه 06 بهمن 1394, 23:38 عصر
سلام از شما هم ممنونم مهندس
ham3d1988 (http://barnamenevis.org/member.php?175070-ham3d1988) ولی یرای کد شما هم برای فاکتور 5536 برای هر چهار پرداخت مقدار باقیمانده یکسان دارد و کد منم هم این اشکال رو داره که آخرین باقیمانده رو برای پرداخت بعدی نگه نمیداره یعنی پرداخت جدید رو بدون در نظر داشتن پرداخت های قبلی از کل باقیمانده فاکتور کم میکند؟!138672

ham3d1988
چهارشنبه 07 بهمن 1394, 08:04 صبح
سلام چون برای فاکتورهای دیگه داره درست محاسبه می کنه فکر میکنم مشکل توی فاکتور 5536 و برابر بودن تاریخ و ساعت پرداخت همه اقساط می باشد و اگه بخوایم به ساعت و تاریخ استناد کنیم نمیشه گفت کدوم زودتر پرداخت شده ولی با اعمال اصلاحات روی کوئری میشه به نتیجه درست رسید.
البته چون فرمت ذخیره شده برای فیلد Pay_time دارای فرمت یکسانی نیست(به رکورد یک و دو توجه کنید) در ادامه ی پروژه براتون مشکل ایجاد میکنه بنابراین بهتره یه فکری به حال این معضل بکنید و دوتا فیلد رو تبدیلش کنید به نوع datetime


select
si.invoicecode,
si.invoices_price,
tp.tick_id,
tp.pay_date,
tp.pay_time,
tp.pay_value,
si.invoices_price- ReceiptToDate.pay_value CurrentRemainder
from tbl_tick_pay tp with(nolock)
join tbl_sell_invoices si with(nolock) on si.invoices_code = tp.invoice_code
outer apply
( select isnull(sum(pay_value),0) pay_value from tbl_tick_pay tp1 with(nolock)
where ((tp1.pay_date<tp.pay_date) or(tp1.pay_date=tp.pay_date and tp1.pay_time<tp.pay_time) OR (tp1.pay_date=tp.pay_date and tp1.pay_time=tp.pay_time and tp1.tick_id<=tp.tick_id)) and tp1.invoicecode=tp.invoicecode
)ReceiptToDate

order by invoicecode,tick_id,pay_date,pay_time

مهدی نان شکری
چهارشنبه 07 بهمن 1394, 12:20 عصر
با سلام
کد صحیح است ولی باید ورژن
دیتابیستان ۲۰۱۲ به بعد باشد

valentine093
چهارشنبه 07 بهمن 1394, 23:05 عصر
شرمنده زحمت دادم ولی من 2014 دارم

valentine093
چهارشنبه 07 بهمن 1394, 23:19 عصر
سلام چون برای فاکتورهای دیگه داره درست محاسبه می کنه فکر میکنم مشکل توی فاکتور 5536 و برابر بودن تاریخ و ساعت پرداخت همه اقساط می باشد و اگه بخوایم به ساعت و تاریخ استناد کنیم نمیشه گفت کدوم زودتر پرداخت شده ولی با اعمال اصلاحات روی کوئری میشه به نتیجه درست رسید.
البته چون فرمت ذخیره شده برای فیلد Pay_time دارای فرمت یکسانی نیست(به رکورد یک و دو توجه کنید) در ادامه ی پروژه براتون مشکل ایجاد میکنه بنابراین بهتره یه فکری به حال این معضل بکنید و دوتا فیلد رو تبدیلش کنید به نوع datetime


select
si.invoicecode,
si.invoices_price,
tp.tick_id,
tp.pay_date,
tp.pay_time,
tp.pay_value,
si.invoices_price- ReceiptToDate.pay_value CurrentRemainder
from tbl_tick_pay tp with(nolock)
join tbl_sell_invoices si with(nolock) on si.invoices_code = tp.invoice_code
outer apply
( select isnull(sum(pay_value),0) pay_value from tbl_tick_pay tp1 with(nolock)
where ((tp1.pay_date<tp.pay_date) or(tp1.pay_date=tp.pay_date and tp1.pay_time<tp.pay_time) OR (tp1.pay_date=tp.pay_date and tp1.pay_time=tp.pay_time and tp1.tick_id<=tp.tick_id)) and tp1.invoicecode=tp.invoicecode
)ReceiptToDate

order by invoicecode,tick_id,pay_date,pay_time

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

ham3d1988
یک شنبه 11 بهمن 1394, 13:06 عصر
سلام فکر میکنم کوئری آقای نان شکری باید جواب بده توی نسخه 2014 و همچنین کوئری بهتری هستش

در مورد کوئری خودم: کار خاصی انجام نمیده فقط میاد به ازای هر قسط پرداختی، مجموع پرداختی تا قبل و خود اون تاریخ و ساعت رو جمع میکنه
البته به جای apply از Sub Query هم میتونید استفاده کنید.