PDA

View Full Version : سوال: امتیاز بندی واریزی و رنکینگ



amirali111
چهارشنبه 01 خرداد 1398, 11:21 صبح
با سلام خدمت اساتید.
در فایل پیوست امتیاز بندی را بر اساس واریزی انجام داده ام، ولیکن می خواهم که امتیاز بندی برای واریزی هایی که نهایتا تا سقف واریزی مبنا است انجام بشود و اضافه واریزی ها در امتیاز بندی در نظر گرفته نشود. ایده خودم نوشتن کدی برای پر کردن یک کویری از رکوردهای واریزی اشخاص هست تا اینکه مجموع واریزی به سقف مبنا برسد. ولیکن در عمل و اجرای آن قاصرم و از دوستان و اساتید مدد می خواهم .
لطفا کمک کنید.

با تشکر

amirali111
یک شنبه 05 خرداد 1398, 10:18 صبح
لطفا اگه کسی می تونه کمکم کنه.

mazoolagh
یک شنبه 05 خرداد 1398, 18:02 عصر
شرح مسئله بقدر کافی گویا نیست، یک مورد اینکه سقف واریزی انباشته در نظر گرفته میشه یا نه؟
خروجی مورد نظر بر اساس دیتا نمونه رو بصورت جدول یا تصویر پیوست کنین

amirali111
سه شنبه 07 خرداد 1398, 11:39 صبح
ممنون از توجه شما.
سقف واریزی بر اساس جدول مبنای واریزی (TbVariziMabna) مد نظر است ، که تا تاریخهای مشخص مبالغی تعیین شده است. بطور خلاصه می توانیم میزان واریزی را برای 6 ماه اول و دوم هر سال ، یا حتی سالانه در نظر گرفت. ولی مساله اصلی بنده این هست که از زودترین تاریخ واریزی شروع کند و امتیاز بدهد تا جاییکه کمتر از سقف تعیین شده باشد و در واقع اضافه واریزی امتیازی در بر نداشته باشد.
در واقع می توان از طریق Append Query واریزی هایی که باید در امتیاز بندی باشند را به یک جدول جدید اضافه و سپس از آن استفاده کرد ، ولی مشکل اینجاست که باید یکی یکی واریزی های هر فرد را بر اساس زودترین تاریخ انتخاب کند و چنانچه از سقف واریزی کمتر بود امتیازش را محاسبه نماید و بهمین ترتیب برای واریزی بعدی هم اگر چنانچه انباشته واریزی از انباشته واریزی مبنا کمتر بود به آن جدول موقت اضافه گردد .... تا آخر و نهایتا برای واریزی هایی که از سقف واریزی تعیین شده بیشترند امتیاز لحاظ نگردد.

amirali111
چهارشنبه 08 خرداد 1398, 17:01 عصر
لطفا کمک بفرمایید. من توضیحات را در پست قبل کامل تر کردم.
شاید بهتر است سوالم را این طور مطرح کنم که چه کدی بنویسم تا بتواند رکوردهای یک جدول (TbVarizi) برای هر فرد را یکی یکی به جدولی موقت (TbVariziTemp) اضافه کند و در هر بار اضافه کردن مقایسه کند که به سقف واریزی رسیده است یا خیر؟ اگر رسیده بود مابقی واریزی های فرد را Append یا اضافه نکند.

ariayekta
جمعه 10 خرداد 1398, 14:19 عصر
تو مبنا برا هر شخص سقف مشخص میکنی ؟ یا تاریخ بعنوان مبنا قرار داره الان تو جدول مبنا تاریخه تکرای و شش ماه یا سالیانه که گفتید نیست
تو جدول واریزی شخص وارد کننده رو چطوری شناسایی میشه اون کد حساب کد شخصه یا مرکز هزینه یا ...

همونظور که آقای mazoolagh (http://barnamenevis.org/member.php?9893-mazoolagh)
گفتن شرح مسله و نمونه اصلا گویا نیست اگر میخوای به نتیچه برسی یه نمونه کاملتر بذازین هدف این سایت و کاربران اشتراک گداری و کمک هست وکسانی که کمک میکنن دنبال کش رفتن برنامه کسی نیستن

sadegh1944
جمعه 10 خرداد 1398, 16:08 عصر
با سلام خدمت اساتید.
در فایل پیوست امتیاز بندی را بر اساس واریزی انجام داده ام، ولیکن می خواهم که امتیاز بندی برای واریزی هایی که نهایتا تا سقف واریزی مبنا است انجام بشود و اضافه واریزی ها در امتیاز بندی در نظر گرفته نشود. ایده خودم نوشتن کدی برای پر کردن یک کویری از رکوردهای واریزی اشخاص هست تا اینکه مجموع واریزی به سقف مبنا برسد. ولیکن در عمل و اجرای آن قاصرم و از دوستان و اساتید مدد می خواهم .
لطفا کمک کنید.

با تشکر

با سلام
من هم یه طرحی مثل این برای امتیاز بندی واریزیها از طریق کوئری داشتم، و تا حدودی هم پیش رفتم ولی الان فایلش رو دم دست ندارم بزارم، پیشنهاد میکنم شما کلیه امتیاز واریزیها رو حساب کنید و بالاترین امتیاز رو درنظر بگیرید. یه سری پیشنهاد دارم که شاید در طراحی کوئری بدرد بخوره:
1- حتما تو جدول یک فیلد منحصر بفرد از نوع Auto Number مثلا [ID] و یک فیلد تاریخ بصورت 8 رقمی [Tarikh] داشته باشید.
2- روش امتیاز دهی رو میشه مثل بانکها استفاده کرد مثلا هر 100000 تومان هر روز یک امتیاز با توجه به تاریخ واریز.
3- یک کوئری از جدول واریزی با فیلتر کد شخص بسازید و علاوه بر فیلدهای جدول مثل id و تاریخ و مبلغ واریز ،یک فیلد ترکیبی [ID] & [Tarikh] با فرمت تعداد کارکتر یکسان برای همه رکوردها داشته باشید. البته از ID هم میشه به تنهایی استفاده کرد ولی اگه اولش تاریخ باشه شما اگه واریزیهای رو جلو عقب ثبت کنید در موقع sort کردن به ترتیب تاریخ مرتب میشه
4- توابع تاریخ شمسی رو هم داشته باشید و در کوئری یک فیلد تفاوت تعداد روز تاریخ واریز با تاریخ فعلی رو ایجاد کنید.
5- یک فیلد امتیاز هم در کوئری بسازید و در اون میتونید فیلد تعداد روز را در مبلغ واریز با توجه به هر 100 تومن یک امتیاز ضرب کنید مثلا اگه واریزی 1 خرداد 200000 تومن بوده و 5 خرداد 150000 واریز شده . امتیاز این تا 10 خرداد بصورت زیر محاسبه میشه: برای رکورد 1 خرداد 200000/100000 ضرب تعداد 10 روز، 20 امتیاز و برای رکورد 5 خرداد، 7.5 امتیاز محاسبه میشه که اگه ازین جمع بگیریم جمعا 27.5 امتیاز خواهد شد. و شما بعدا میتونید بر مبنای بالاترین امتیاز هر شخص عمل کنید
6- گاهی شما باید از چندین کوئری استفاده کنید که هر کدوم بر مبنای کوئری قبلی ساخته شده
حالا نمدونم چقدر تونستم منظورم را برسونم

amirali111
شنبه 11 خرداد 1398, 10:05 صبح
تو مبنا برا هر شخص سقف مشخص میکنی ؟ یا تاریخ بعنوان مبنا قرار داره الان تو جدول مبنا تاریخه تکرای و شش ماه یا سالیانه که گفتید نیست
تو جدول واریزی شخص وارد کننده رو چطوری شناسایی میشه اون کد حساب کد شخصه یا مرکز هزینه یا ...

همونظور که آقای mazoolagh (http://barnamenevis.org/member.php?9893-mazoolagh)
گفتن شرح مسله و نمونه اصلا گویا نیست اگر میخوای به نتیچه برسی یه نمونه کاملتر بذازین هدف این سایت و کاربران اشتراک گداری و کمک هست وکسانی که کمک میکنن دنبال کش رفتن برنامه کسی نیستن


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

amirali111
شنبه 11 خرداد 1398, 10:11 صبح
با سلام
من هم یه طرحی مثل این برای امتیاز بندی واریزیها از طریق کوئری داشتم، و تا حدودی هم پیش رفتم ولی الان فایلش رو دم دست ندارم بزارم، پیشنهاد میکنم شما کلیه امتیاز واریزیها رو حساب کنید و بالاترین امتیاز رو درنظر بگیرید. یه سری پیشنهاد دارم که شاید در طراحی کوئری بدرد بخوره:
1- حتما تو جدول یک فیلد منحصر بفرد از نوع Auto Number مثلا [ID] و یک فیلد تاریخ بصورت 8 رقمی [Tarikh] داشته باشید.
2- روش امتیاز دهی رو میشه مثل بانکها استفاده کرد مثلا هر 100000 تومان هر روز یک امتیاز با توجه به تاریخ واریز.
3- یک کوئری از جدول واریزی با فیلتر کد شخص بسازید و علاوه بر فیلدهای جدول مثل id و تاریخ و مبلغ واریز ،یک فیلد ترکیبی [ID] & [Tarikh] با فرمت تعداد کارکتر یکسان برای همه رکوردها داشته باشید. البته از ID هم میشه به تنهایی استفاده کرد ولی اگه اولش تاریخ باشه شما اگه واریزیهای رو جلو عقب ثبت کنید در موقع sort کردن به ترتیب تاریخ مرتب میشه
4- توابع تاریخ شمسی رو هم داشته باشید و در کوئری یک فیلد تفاوت تعداد روز تاریخ واریز با تاریخ فعلی رو ایجاد کنید.
5- یک فیلد امتیاز هم در کوئری بسازید و در اون میتونید فیلد تعداد روز را در مبلغ واریز با توجه به هر 100 تومن یک امتیاز ضرب کنید مثلا اگه واریزی 1 خرداد 200000 تومن بوده و 5 خرداد 150000 واریز شده . امتیاز این تا 10 خرداد بصورت زیر محاسبه میشه: برای رکورد 1 خرداد 200000/100000 ضرب تعداد 10 روز، 20 امتیاز و برای رکورد 5 خرداد، 7.5 امتیاز محاسبه میشه که اگه ازین جمع بگیریم جمعا 27.5 امتیاز خواهد شد. و شما بعدا میتونید بر مبنای بالاترین امتیاز هر شخص عمل کنید
6- گاهی شما باید از چندین کوئری استفاده کنید که هر کدوم بر مبنای کوئری قبلی ساخته شده
حالا نمدونم چقدر تونستم منظورم را برسونم
ممنون از کمکتون. من بابت امتیاز دهی به هر واریزی افراد و نهایتا تجمیع آن و حتی رنکینگ مشکلی ندارم. مشکل من این است که می خواهم به واریزی های بالاتر از سقف تعیین شده امتیاز تعلق نگیرد. مثلا در فایل نمونه ای که گذاشتم سقف 60 میلیون تومان است. حال اگر بخواهیم در آخر به نرم افزار بگوییم که از واریزهای فرد با سورت تاریخ استفاده کند و آنها را در امتیاز بندی شرکت دهد و این کار را تا جایی انجام دهد که به سقف تعیین شده برسد چگونه قابل انجام است؟

amirali111
شنبه 18 خرداد 1398, 12:33 عصر
اساتید محترم لطفا در کد نویسی موضوع مطرح شده و یا سایر راهکار حل آن کمک بفرمایید.

mazoolagh
شنبه 18 خرداد 1398, 13:12 عصر
شاید اگر یک رکوردست باز کنین و رکوردها رو تک تک بخونین و پردازش کنین راحتتر باشه.

amirali111
یک شنبه 19 خرداد 1398, 23:23 عصر
شاید اگر یک رکوردست باز کنین و رکوردها رو تک تک بخونین و پردازش کنین راحتتر باشه.
لطفا اگه امکان داره کدش رو توی فایل برنامه ضمیمه اوایل گذاشتم قرار بدهید.

amirali111
دوشنبه 20 خرداد 1398, 16:25 عصر
دارم سعی میکنم از طریق رکوردست به جواب سوالم برسم ولی در گام اول به مشکل برخوردم. لطفا راهنمایی بفرمایید چرا ایرور میده.
موضوع سوالم این هست که می خوام از جدول Tb-varizi واریزی افراد را یکی یکی به ترتیب تاریخ واریزی بخونه و با جمع سقف واریزی از جدول مبنا واریزی مقایسه کنه و اگر کمتر از سقف بود به کویری مربوطه اضافه کنه و اگر بیشتر بود خیر. و این کار برای تک تک افراد انجام بشه.
حالا با یک فانکشن جهت محاسبه جمع واریزی شروع کردم که در کویری QSumMablagh از اون استفاده کنم ولی ایرور زیر رو داد! نمی تونم دلیلش رو پیدا کنم.

mazoolagh
سه شنبه 21 خرداد 1398, 13:51 عصر
چند مورد هست که باید دقت کنین:
1- در این تابع که نوشتین id رو بعنوان آرگومان ارسال میکنین ولی در اصل از codehesab حساب میکنین که مقدار نداره چون تعریف نشده.
همیشه یک option explicit در ماژول ها بگذارین تا متوجه متغییرهای تعریف نشده بشین.
2- کد حساب اگر عدد هست در جدول هم عدد معرفی کنین.
3- در اسم جدول از - استفاده کردین. بجاش _ بگذارین تا با اپراتور تفریق اشتباه نشه.
حداقل اینکه اسم های اینچنینی رو درون [] بگذارین.
4- در جدول tbname خود codehesab کلید هست و نیاز به فیلد id ندارین. در واقع در جدول واریزی هم نیازی به id ندارین.
البته اگر قرار هست دیتابیس خارج از اکسس استفاده بشه (مثلا یک اپلیکیشن دات نت) برای عملیات update/insert/delete همیشه یک کلید یکتا نیاز هست.

من یک سری تغییرات رو براتون انجام میدم و دوباره پیوست میکنم.

mazoolagh
سه شنبه 21 خرداد 1398, 14:34 عصر
150345

150346

150347

mazoolagh
سه شنبه 21 خرداد 1398, 14:35 عصر
Option Compare Database
Option Explicit
Public Function Sum_Deposits(AccountID As Long) As Currency
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("SELECT * FROM Deposits WHERE AccountID=" & AccountID & " ORDER BY DepositDate")
Do While Not rst.EOF
Sum_Deposits = Sum_Deposits + rst!Amount
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
End Function

mazoolagh
سه شنبه 21 خرداد 1398, 14:39 عصر
پس از این پاسخ ها رو از روی همین نمونه که پیوست میکنم بگیرین

amirali111
چهارشنبه 22 خرداد 1398, 00:11 صبح
پس از این پاسخ ها رو از روی همین نمونه که پیوست میکنم بگیرین
ممنون از وقت و حوصله ای که صرف کردبد. بله کاملا درست به ایرادات من اشاره کردید و مشکل رفع شد. بی نهایت سپاسگزارم.

amirali111
شنبه 25 خرداد 1398, 16:10 عصر
اگر بخواهم در کد ارایه شده کنترل کنم که جمع واریزی ها را تا جمع کل مبنا (مثلا 600 میلیون ریال) برای هر عضو انجام دهد چگونه بنویسم.

mazoolagh
دوشنبه 27 خرداد 1398, 11:45 صبح
البته من هنوز آلگوریتم محاسبه رنک رو نمیدونم ولی یک چیزی شبیه زیر میشه:

Public Function Rank(AccountID As Long, BaseAmount As Currency) As ???
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("SELECT * FROM Deposits WHERE AccountID=" & AccountID & " ORDER BY DepositDate")
Dim Sum_Deposits As Currency
Do While Not rst.EOF
Sum_Deposits = Sum_Deposits + rst!Amount
If Sum_Deposits <= BaseAmount Then
Rank = ......
Else
Rank = ......
Exit Do
End If
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
End Function

amirali111
سه شنبه 28 خرداد 1398, 16:46 عصر
با استفاده از کد فوق که لطف فرمودید تقریبا جواب اخذ شد. حتی محاسبه امتیاز واریز هم انجام میشه. و برای رتبه بندی از هم از تابع Dcount استفاده می کنم.