ورود

View Full Version : سوال: فیلد محاسباتی در After Update



arman2000
جمعه 11 مهر 1404, 02:57 صبح
با سلام

بعد از وارد کردن تاریخ قرارداد (t8)، تاریخ انقضای 6 ماهه، با کد زیر در فیلدش (m6) دیده می‌شه:


Private Sub t8_AfterUpdate()
m6 = DateAdd("m", 6, t8)
End Sub

نیاز دارم مهلت باقیمانده در فیلد مربوطه (mohlatm6) محاسبه و دیده بشه. (چون اول، تاریخ انقضا (m6) باید محاسبه بشه، کد زیر در خاصیت After Update فیلد قرارداد (t8)، جواب نمی‌ده)


mohlatm6 = TotalDiff (txtToday, m6)

mazoolagh
شنبه 12 مهر 1404, 12:25 عصر
سلام و روز خوش

1- مطمئن نیستم منظور شما رو درست گرفته باشم،
ولی همین باید درست باشه:
Private Sub t8_AfterUpdate()
m6 = DateAdd("m", 6, t8)
mohlatm6 = TotalDiff(txtToday, m6)
End Sub

2- اون default value برای mohlatm6 هم بنظر میاد لازم نیست.

arman2000
شنبه 12 مهر 1404, 17:17 عصر
سلام بزرگوار

- default value برای mohlatm6 رو هم برداشتم ولی جواب نگرفتم.

- چون اول، تاریخ انقضا (m6) باید محاسبه بشه، کد زیر در خاصیت After Update فیلد قرارداد (t8)، جواب نمی‌ده:

mohlatm6 = TotalDiff (txtToday, m6)

mazoolagh
دوشنبه 14 مهر 1404, 19:09 عصر
سلام دوباره

الان منظور شما از جواب ندادن در (چون اول، تاریخ انقضا (m6) باید محاسبه بشه، کد زیر در خاصیت After Update فیلد قرارداد (t8)، جواب نمی‌ده) مشخص نیست!

چون اون خط دوم کد پست 2 (محاسبه مهلت) مشکلی نداره و
بعد از خط اول (محاسبه تاریخ انقضا) اجرا میشه، و اگر مشکلی باشه باید در همون خط اول دیده بشه.

مشکل کد محاسبه تاریخ انقضا این هست که شما از تابع DateAdd که برای تاریخ میلادی (گرگوری) هست استفاده کردین؛
تعداد روزهای ماه های میلادی با تعداد روزهای ماه های ایرانی متناظر شون یکی نیست:
مثلا ماه های 7 و 8 میلادی (جولای و اگوست) 31 روزه ان ولی ماه های 7 و 8 ایرانی (مهر و آبان) 30 روزه
یا ماه 2 میلادی (فوریه) 28 یا 29 روزه است ولی ماه 2 ایرانی (اردیبهشت) همیشه 31 روزه است.

حالا اگر شما تاریخ قرارداد رو مثلا 30 اردیبهشت بذارین اون تابع DateAdd حتما خطا میگیره.

برای حل این مشکل 2 راه دارین:
1- در همین توابع کمکی تاریخ ایرانی که استفاده کردین بگردین ببینین تابع معادل داره یا نه و جایگزین کنین.
اگر نداشته باشه باید خودتون یکی بنویسین.

2- همون تابع DateAdd رو استفاده کنین، ولی تاریخ قرارداد رو بر اساس روز اول ماه بهش بدین
و بعد تاریخ بدست آمده رو با روز واقعی تاریخ قرارداد جمع کنین.

arman2000
دوشنبه 14 مهر 1404, 21:47 عصر
سلام دوست عزیز

ممنون می‌شم در رابطه با راه حل دوم (همون تابع DateAdd رو استفاده کنین، ولی تاریخ قرارداد رو بر اساس روز اول ماه بهش بدین
و بعد تاریخ بدست آمده رو با روز واقعی تاریخ قرارداد جمع کنین) یک مثال بزنید.

mazoolagh
چهارشنبه 16 مهر 1404, 11:03 صبح
سلام دوباره

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

ممکنه یکی دو روزی زمان ببره.

arman2000
پنج شنبه 17 مهر 1404, 17:02 عصر
سپاس بزرگوار


اگر تاریخ قرارداد رو مثلا 30 اردیبهشت بذارین اون تابع DateAdd حتما خطا میگیره.

اول ماه و کلا هر روزی رو هم خطا میده.

mazoolagh
پنج شنبه 17 مهر 1404, 20:20 عصر
خب من این روتین های ماژول DateShamsi رو بررسی کردم:
نه تنها بسیاری از توابع مورد نیاز رو نداره، بلکه نتایج محاسبات هم دارای اشتباه های بزرگی هست
و مطلقا غیرقابل اعتماده!

خود من هم تا خیلی سال پیش (یعنی پیش از پشتیبانی دات نت از Persian calendar)
توابع تبدیل تاریخ خودم رو داشتم (البته آلگوریتم محاسبات از رفرنس های علمی معتبر گرفته بودم)،
تو برنامه های قدیمی میگردم و اون رو براتون میذارم.

تا اون موقع تاپیک زیر رو هم ببینین (پست های 7 تا 13) :
حرفه ای: Mazoo Utils for VBA - کتابخانه ابزارهای سودمند برای VBA (https://barnamenevis.org/showthread.php?574336-Mazoo-Utils-for-VBA-%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C-%D8%B3%D9%88%D8%AF%D9%85%D9%86%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-VBA)