PDA

View Full Version : مبتدی: محاسبات تاریخ



reza2371
پنج شنبه 28 آبان 1394, 05:51 صبح
سلام
با استفاده از توابع تاریخ سایت فارساران تعداد روز های بین دو تاریخ را محاسبه کردم و میخوام بر اساس تعداد روزهای بدست آمده تعداد ماه و روز بین این دو تاریخ را بدست بیارم.
برای محاسبه ماه به این صورت زیر نوشتم ولی اشتباه حساب میکنه:گریه:

roz1 = تعداد روزهای بدست آمده



mah= int (roz1/30)



و برای محاسبه روز:



roz = roz1 mid 30


نمونه: 136888

reza2371
شنبه 30 آبان 1394, 19:12 عصر
سلام بر اساتید بزرگوار
کسی هست بتونه مشکل منو حل کنه؟

Rasool-GH
شنبه 30 آبان 1394, 19:41 عصر
برای این محاسبات هم توابع کاملی باید بنویسید . برای مثال شش ماه اول 31 روزه و پنج ماه دوم 30 روزه . ماه اخر بسته به کبیسه بودن سال 29 روزه است . برای این کار از توابع خود ماژول استفاده کنید . در ایت تاپیک هم ماژولهای کاملی معرفی شده

ماژولهای تاریخ شمسی (http://barnamenevis.org/showthread.php?322266-%D9%85%D8%A7%DA%98%D9%88%D9%84-%DA%A9%D8%A7%D9%85%D9%84-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%B4%D9%85%D8%B3%DB%8C-%D8%AF%D8%B1-%D8%A7%DA%A9%D8%B3%D8%B3-%D8%A8%D8%A7-VBA)

reza2371
شنبه 30 آبان 1394, 19:50 عصر
دوست عزیز شما میتونید این کار را برام انجام بدید
جبران میکنم براتون

reza2371
یک شنبه 01 آذر 1394, 21:57 عصر
اساتید محترم کسی هست مشکل منو حل کنه؟
یه تابع , فرمول و ... که بتونه فاصله بین دو تا تاریخ را محاسبه و به صورت ماه و روز به من نشان بده

reza2371
یک شنبه 01 آذر 1394, 21:59 عصر
اساتید محترم کسی هست بتونه مشکل منو حل کنه؟
یه تابع , فرمول و ... که بتونه فاصله بین دو تا تاریخ را محاسبه و به صورت ماه و روز به من نشان بده

Rasool-GH
یک شنبه 01 آذر 1394, 22:27 عصر
سلام . لینک براتون قرار دادم . مطالعه بفرمایید
در صورتی که نیاز دارید تعداد روز و ماه بین دو تاریخ مشخص بشه توابع اماده ای در همون ماژولها موجوده .
ضمنا اگر مقصود مشخص کردن اختلاف به روز و ماه باشه ماژول هم لازم نیست

reza2371
یک شنبه 01 آذر 1394, 22:36 عصر
بدون ماژول به چه صورت میشه این کار را انجام داد؟

Rasool-GH
دوشنبه 02 آذر 1394, 00:15 صبح
سلام فرصت نکردم خطاها رو بگیرم تست کنید ببینید درسته یا نه
البته کدها باید اصلاح بشه . اگر بشه سر فرصت انجام میدم

reza2371
دوشنبه 02 آذر 1394, 05:07 صبح
سلام مهندس
تشکر ویژه
مشکلی که فعلا نداشته انشاالله که هم نداره
فقط اگر به جای یک تاریخ چند تاریخ بود میشه فرومل کلی نوشت یا باید به صورت دیگری عمل نمود؟
بازم تشکر میکنم بابت زحماتتون

Rasool-GH
دوشنبه 02 آذر 1394, 07:54 صبح
سلام این کد برای نمونه بود جهت اشنایی با روش کار . قطعا ایراد داره در تاریخهای بزرگ . و فاصله های زیاد . بدلیل اینکه کبیسه بودن سالها لحاظ نشده . اگر فرصتی بود کاملش میکنم

mohammadsaleh
دوشنبه 02 آذر 1394, 08:20 صبح
ميتوني ابتدا تاريخ شمسي رو به ميلادي تبديل كني و براي محاسبات از تابع datediff كه دقيق هست استفاده كني

Rasool-GH
دوشنبه 02 آذر 1394, 09:39 صبح
سلام . مشکل در تعداد روز نیست . مشکل در تبدیل تعداد روز به سال و ماه و روز هست که باید کبیسه بودن سالها لحاظ بشه

Rasool-GH
سه شنبه 03 آذر 1394, 02:04 صبح
سلام
این نسخه خطاهاش گرفته شده و محاسبات با درنظر گرفتن کبیسه بودن سالها انجام میشه . البته نسخه قبلی هم خطای زیادی نداشت و نهایتا 2 روز اشتباه محاسبه میشد ولیکن باید به این موضوع هم توجه کرد که وقتی فاصله دو تاریخ رو با تفکیک سال و ماه و روز میخوایم بدست بیاریم قاعدتا باید تعداد روز رو در این فرمت 60 روز در نظر بگیریم (بدلیل نداشتن معیاری برای تعیین تعداد روز مربوط به ماه).

مثلا به تاریخ 1393/12/01 تا 1394/01/31 توجه کنید . این دو تاریخ با هم 59 روز فاصله دارند نه 1 ماه و 30 روز و همچنین 2 تاریخ 1391/12/01 تا 1392/01/31 با هم 60 روز اختلاف دارند نه 1 ماه و 30 روز .

در واقع به نظر من دو تاریخ 1393/12/01 تا 1394/02/31 با هم 1 ماه و 59 روز فاصله دارند نه 2 ماه و 30 روز .

البته جای جناب پیروزمهر خالی هست . ایشون در این زمینه صاحب نظر و پیش کسوت هستند .

reza2371
سه شنبه 03 آذر 1394, 09:51 صبح
سلام
بابت زحمت هایی که کشیدید ممنونم انشالله بتونم جبران کنم
یه سوال دیگه:
با توجه به اینکه توی فرمی که من دارم تعداد 8 تاریخ برای محاسبه وجود دارد. برای اینکه تعداد ماهها و روز های بدست آمده باهم جمع بشه چه راهکاری پیشنهاد میدین؟

Rasool-GH
سه شنبه 03 آذر 1394, 10:25 صبح
سلام
نمونه رو قرار بدید بهتره .به نظرم برای این کار باید خروجی تابع تغییر کنه که به راحتی قابل تفکیک و مانور باشه . مثلا خروجی به شکل 14y10m20 باشه که نشاندهنده 14 سال و 10 ماه و 20 روز هست . اینجوری میتونید اعداد رو تفکیک کنید و به دلخواه با اونها رفتار کنید .

ضمنا استفاده از تابع DDiffToTexِt از اکتیویکس PDC کاملا کار شما رو راه میندازه . اگر کد نویسی مورد نظرتون نیست پیشنهاد میکنم از اکتیوایکس جناب پیروزمهر استفاده کنید .

reza2371
سه شنبه 03 آذر 1394, 12:25 عصر
نمونه
137021

Rasool-GH
سه شنبه 03 آذر 1394, 22:18 عصر
سلام
این نمونه رو ببینید برای هر تعداد باکس تاریخ که دارید باید عدد مقابل For تنظیم بشه . برای این نمونه که 8 ردیف هست عدد 8 رو قرار دادم

Rasool-GH
سه شنبه 03 آذر 1394, 22:34 عصر
یه اصلاحیه کوچیک زدم برای اینکه در صورت خالی بودن فیلدها هم خطا تولید نشه

reza2371
چهارشنبه 04 آذر 1394, 20:32 عصر
سلام مهندس
بابت زحمات ممنون
یک کار دیگه هم میخوام انجام بدید شرمنده
و ان اینکه به جای سال هر تعداد از این تاریخ ها ( از تاریخ __ تا تاریخ ) تکمیل شد به عنوان یک مرحله حساب کنه (جمعا 8 تا مرحله میشه)

Rasool-GH
چهارشنبه 04 آذر 1394, 22:28 عصر
سلام داخل همون If داخل For این کد رو بنویسید

TextBoxName =TextBoxName+1

reza2371
پنج شنبه 05 آذر 1394, 12:20 عصر
سلام مهندس جان
تشکر میکنم از وقتی که برام گذاشتید
توی فرمی که خدمتتون دادم میزان سال اهمیت ندارد فقط میزان ماه و روز باید محاسبه بشه
همچنین اگر تاریخ اول و تاریخ دوم یکسان بود یک روز به حساب بیاره.
میشه تاریخ به صورت 8 رقمی وارد بشه؟ مثل: 94/09/05
اگه امکانش هست تاریخ ها به ترتیب ( کمترین تا بیشترین) از بالا به پایین قرار بگیرن

Rasool-GH
پنج شنبه 05 آذر 1394, 13:44 عصر
سلام
برای یکسان بودن یک شرط داخل حلقه اضافه کنید که در صورت برابر بودن دو تاریخ 1 واحد به روز اضافه بشه .
برای 8 رقمی کردن باید ماسک رو به صورت 1300/00/00 وارد کنید ضمنا برای 8 رقمی کردن به طور کامل باید توابع اصلاح بشه
در مورد ترتیب تاریخها هم که خود اپراتور باید رعایت کنه و مرتب وارد کنه . اگر میخواید که برنامه مرتبشون کنه یک مقدار کد نویسیش زیاد میشه

reza2371
پنج شنبه 05 آذر 1394, 18:39 عصر
سلام مهندس
اگه امکان داره توی محاسبه میزان سال اهمیت نداره فقط میزان ماه و روز باید محاسبه بشه

reza2371
جمعه 06 آذر 1394, 18:38 عصر
سلام آقای مهندس
یک اشکالی پیدا شده و آن اینکه هر تاریخ را جداگانه محاسبه میکنه یعنی اگرتاریخ اول 3 ماه و 20 روز باشه و تاریخ دوم 2 ماه و 27 روز باشه جمعا میشه 5 ماه و 47 روز.
مثال:تاریخ اول 1394/02/01 تا 1394/03/31 و تاریخ دوم: 1394/05/12 تا 1394/08/12

همچنین میزان سال در نمونه اهمیت نداره و مقدار آن به ماه اضافه بشه

Rasool-GH
شنبه 07 آذر 1394, 08:52 صبح
سلام
برنامه به همین شکل هست که روز ها با هم جمع میشه و ماهها با هم . در صورتی که در نظر دارید روزها تبدیل به ماه بشه . هر ماه رو چند روز در نظر میگیرید ؟
اگر جواب شما برای محدوده ماه 30 روز باشه و ماه 31 روزه و 29 روزه براتون مهم نیست کلا میتونید از ماژول استفاده نکنید و محاسبات رو بر اساس همون 30 روز انجام بدید همون نمونه اولیه خودتون درست کار میکنه .
مشکل بعدی هم در مورد 6 رقمی کردن تاریخ اینه که برنامه شما 5 سال بیشتر کار نمیکنه در سال 1400 مشکل پیدا میکنید و از سال بعدش دوباره کار خواهد کرد

reza2371
شنبه 07 آذر 1394, 16:11 عصر
سلام مهندس جان
بابت زحماتتون خیلی ممنون
در برنامه خودم کل روز ها را 30 روزه محاسبه میکرد و متاسفانه اگر فاصله دو تاریخ زیاد میشد به تعداد ماه اضافه مینمود که محاسبه دقیق نبود
در مورد 6 رقمی کردن برنامه هم بگم که جهت تسهیل در ورود اطلاعات و همچنین تاریخ هایی که وارد میشه همه مربوط به یک دهه است و نیازی به سال 1400 ندارد.
بازهم بابت زحماتتون تقدیر و تشکر ویژه دارم

یه اشکال کوچولو داره اگه رفعش کنید ممنون میشم
1394/02/12 تا 1394/03/11 میشه یک ماه تمام ، اگه یک یا دو روز به آن اضافه بشه یک روز محاسبه میکنه

درخواست:
اگر دو تاریخ (سال،ماه،روز) مثل هم باشه میخوام یک روز به حساب بیاره

Rasool-GH
شنبه 07 آذر 1394, 21:26 عصر
نمونه 5 رو که در پست قبل قرار دادم کنترل کنید همه این موارد که مورد نظرتون بود حل شده و در مورد این اشکالی که در مورد تاریخ
1394/02/12 تا 1394/03/11
فرمودید باید کدها رو بررسی کنم .

این ایراد دقیقا به این دلیل پیش میاد که ماه 31 روزه 30 روز فرض شده . در پست قبل هم عرض کردم ماه رو چند روزه در نظر میگیرید

این کاری که شما قصد انجامش رو دارید از لحاظ منطق بنامه با ایراد مواجه هست . اگر ماه رو 30 روزه فرض کنید سالی 5 روز خطا خواهید داشت اگر بخواید ماه 29 و 30 و 31 روزه لحاظ بشه به ایراد دیگه ای بر میخورید و اون اینه که به طور مثال 25 روز از ماه 29 روزه با 10 روز از ماه 31 روزه با هم میشه 35 روز حالا این 35 روز رو چند ماه و چند روز محاسبه میکنید ؟ ( 1 ماه و 6 روز یا 1 ماه و 4 روز )
یک راه دیگه هم به نظرم میرسه که میشه از اون استفاده کنید . ولی در صورتی که از این برنامه برای محاسبه کارکرد و پرداخت صورت وضعیت مالی بخواید استفاده کنید با مشکلاتی مواجه خواهید شد . به هر حال اول جواب سوال بالا باید مشخص بشه .

reza2371
یک شنبه 08 آذر 1394, 08:44 صبح
ببینید میزان ماه بر اساس همان چیزی که هست محاسبه بشه یعنی 30 ، 31 و 29 روزه دقیق حساب شود. باقیمانده ما که بشه روز ، 30 روزه حساب شود
یعنی اگر تاریخ اول ما بشه 3 ماه و 19 روز و تاریخ دوم بشه 5 ماه و 16 روز جمع ماه 8 میشه و جمع روز 35. حالا این 35 روز بر اساس 30 روز حساب بشه

Rasool-GH
یک شنبه 08 آذر 1394, 09:30 صبح
سلام . دقیقا همین اتفاق داره میوفته و خطایی که اشاره کردید هم از همینجا ناشی میشه .
به هر حال در این نمونه جدید شرط تبدیل روز به ماه 31 روزه فرض شده ( بدلیل اینکه ماه 30 روزه خطا میکنه ) ولی خود ماه 30 روزه حساب میشه . دلیلش رو اگر مایل بودید توضیح میدم

reza2371
یک شنبه 08 آذر 1394, 10:40 صبح
مهندس جان تشکر ویژه
خیلی عالی بود
بابت تمام وقت هایی که برام گذاشتید ممنونم