سادهترین روش تبدیل تاریخ میلادی به شمسی در اکسس
اگه تا حالا با دیتابیسهای فارسی سر و کله زده باشید، حتماً میدونید که تبدیل تاریخ میلادی به شمسی در اکسس یکی از اون چالشهاییه که دیر یا زود سراغتون میاد. راستش اکسس به صورت پیشفرض با تقویم میلادی کار میکنه و خبری از تاریخ خورشیدی توی تنظیمات داخلیش نیست. اما نگران نباشید، چون اصلاً کار سخت یا عجیبی نیست و با چند تا ترفند ساده میشه این مشکل رو برای همیشه حل کرد.
توی این مطلب میخوایم با هم ببینیم چطوری میشه این تبدیل رو انجام داد تا هم گزارشهامون خوشگلتر بشه و هم کاربرهایی که با دیتابیس کار میکنن، گیج نشن. از کدهای VBA گرفته تا استفاده از توابع آماده، همه رو با زبون ساده بررسی میکنیم.
چرا اکسس خودش تاریخ شمسی نداره؟
خب، واقعیت اینه که مایکروسافت اکسس برای بازار جهانی ساخته شده و تقویم پیشفرض اکثر نرمافزارهای دنیا میلادیه. با اینکه توی نسخههای جدید ویندوز، پشتیبانی از تقویم شمسی خیلی بهتر شده، اما اکسس هنوز اونقدری که ما دلمون میخواد با تاریخ جلالی رفیق نشده.
شاید بپرسید خب چرا از همون فیلد متنی (Text) برای ذخیره تاریخ استفاده نکنیم؟ این دقیقاً همون اشتباهیه که خیلیها مرتکب میشن. اگه تاریخ رو به صورت "۱۴۰۲/۰۵/۱۰" توی یه فیلد متنی ذخیره کنید، دیگه نمیتونید از قابلیتهای محاسباتی اکسس استفاده کنید. مثلاً نمیتونید به سادگی بفهمید فاصله بین دو تاریخ چند روزه یا گزارشهاتون رو بر اساس زمان مرتب کنید. پس راه درست چیه؟ راه درست اینه که تاریخ رو میلادی ذخیره کنیم ولی موقع نمایش، اون رو به شمسی تبدیل کنیم.
قدم اول: استفاده از کدهای VBA
برای اینکه تبدیل تاریخ میلادی به شمسی در اکسس رو به بهترین شکل انجام بدیم، بهترین راه استفاده از یک "ماژول" (Module) هست. ماژول در واقع یه محیطیه که توش کدهای برنامهنویسی مینویسیم تا اکسس کارهای جدیدی یاد بگیره.
اصلاً نترسید، لازم نیست خودتون برنامهنویس حرفهای باشید. کدهای آماده زیادی برای این کار وجود داره که سالهاست توسط برنامهنویسهای ایرانی تست شده و بدون نقص کار میکنه. فقط کافیه این مراحل رو برید:
- دیتابیس اکسس خودتون رو باز کنید.
- کلیدهای ترکیبی
Alt + F11رو بزنید تا محیط VBA باز بشه. - از منوی بالا، گزینه
Insertو بعدModuleرو انتخاب کنید. - حالا کدهایی که برای تبدیل تاریخ هست رو اینجا کپی کنید.
این کدها معمولاً تابعی به اسم GregorianToSolar یا چیزی شبیه به این دارن که یه تاریخ میلادی میگیره و یه رشته متنی شمسی پس میده.
چطوری از این تابع توی پرسوجوها (Query) استفاده کنیم؟
بعد از اینکه کد رو توی ماژول کپی کردید، حالا نوبت استفادهاش میرسه. فرض کنید یه جدول دارید که اسامی مشتریها و تاریخ تولدشون (به میلادی) توش هست. حالا میخواید یه کوئری بسازید که تاریخ تولد رو به شمسی نشون بده.
توی محیط طراحی کوئری (Query Design)، یه ستون جدید ایجاد کنید و اینطوری بنویسید: تاریخ_شمسی: ShamiDate([BirthDate])
اینجا ShamsiDate اسم همون تابعی هست که توی ماژول تعریف کردید و BirthDate اسم فیلد تاریخ میلادی شماست. به همین راحتی، وقتی کوئری رو اجرا کنید، اکسس به صورت خودکار تمام تاریخها رو براتون به شمسی برمیگردونه.
نمایش تاریخ شمسی در فرمها و گزارشها
کاربر نهایی دیتابیس شما قرار نیست با کوئریها سر و کله بزنه؛ اونها فرمها و گزارشها رو میبینن. برای تبدیل تاریخ میلادی به شمسی در اکسس توی محیط فرم، فقط کافیه یه TextBox بسازید.
توی تنظیمات این تکستباکس، برید سراغ بخش Control Source و همون فرمول بالا رو بنویسید. یعنی بنویسید =ShamsiDate([MyDate]) . حالا هر وقت فرم باز بشه، تاریخ میلادی که توی دیتابیس ذخیره شده، به صورت شمسی و شیک به کاربر نمایش داده میشه. این روش باعث میشه دیتابیس شما هم استاندارد بمونه و هم کاربرپسند باشه.
یه نکته مهم درباره سرعت دیتابیس
اگه دیتابیس شما خیلی بزرگ بشه (مثلاً بالای ۱۰۰ هزار رکورد)، استفاده مداوم از توابع VBA توی کوئریها ممکنه یه مقدار سرعت رو بیاره پایین. توی این شرایط، بعضیها ترجیح میدن یه فیلد اضافه برای تاریخ شمسی توی خودِ جدول داشته باشن. اما پیشنهاد من اینه که تا جایی که ممکنه از همون توابع استفاده کنید چون دقت کار خیلی بالاتره و از ناهماهنگی دادهها جلوگیری میکنه.
مرتبسازی بر اساس تاریخ شمسی
یکی از سوالاتی که همیشه پرسیده میشه اینه که: "چطوری تاریخهای شمسی رو مرتب (Sort) کنیم؟". اگه شما تاریخ رو به صورت متنی (مثلاً ۱۴۰۲/۰۱/۰۵) ذخیره کرده باشید، اکسس اونها رو مثل کلمات مرتب میکنه. خوشبختانه توی تاریخ شمسی، چون سال اول میآد، بعد ماه و بعد روز، مرتبسازی متنی هم درست از آب درمیآد.
اما راه حرفهایتر اینه که مرتبسازی رو همیشه روی همون فیلد اصلی میلادی انجام بدید و فقط برای نمایش از فیلد شمسی استفاده کنید. اینطوری خیالتون راحته که حتی اگه توی تبدیل تاریخ یه اشتباه کوچیک رخ بده، ترتیب رکوردها توی دیتابیس بهم نمیریزه.
حل مشکل سالهای کبیسه
توی فرآیند تبدیل تاریخ میلادی به شمسی در اکسس ، بحث سالهای کبیسه خیلی حیاتیه. تقویم شمسی و میلادی هر دو سال کبیسه دارن اما زمانبندیشون با هم فرق میکنه. اگه از کدهای قدیمی یا ناقص استفاده کنید، ممکنه توی روزهای آخر اسفند یا اول فروردین، تاریخها یک روز جابهجا بشن.
حتماً از کدهایی استفاده کنید که الگوریتم "خیام" رو پیادهسازی کردن. این الگوریتم دقیقترین راه برای محاسبه تقویم جلالیه و تا صدها سال آینده هم هیچ خطایی نداره.
استفاده از توابع آماده در اینترنت
لازم نیست چرخ رو از اول اختراع کنید! برنامهنویسهای زیادی ماژولهای رایگان برای تبدیل تاریخ میلادی به شمسی در اکسس منتشر کردن. کافیه توی گوگل جستجو کنید "ماژول تاریخ شمسی برای اکسس". معمولاً یه فایل با پسوند . bas پیدا میکنید که خیلی راحت میتونید توی پروژهتون Import کنید.
این ماژولها علاوه بر تبدیل تاریخ، معمولاً امکانات دیگهای هم دارن؛ مثلاً: - تبدیل عدد به حروف (برای فاکتورها) - تشخیص روز هفته (شنبه، یکشنبه و) -- اضافه کردن تعداد روز مشخص به یک تاریخ شمسی - محاسبه اختلاف بین دو تاریخ شمسی
جمعبندی؛ کدوم روش بهتره؟
اگه بخوام خلاصه بگم، بهترین استراتژی برای مدیریت تاریخ در اکسس اینه: ۱. دادهها رو همیشه به صورت Date/Time (میلادی) در جداول ذخیره کنید. ۲. یک ماژول استاندارد VBA برای تبدیل تاریخ میلادی به شمسی در اکسس به دیتابیس اضافه کنید. ۳. در هر جایی که نیاز به نمایش تاریخ دارید (فرم یا گزارش)، از تابع تبدیل استفاده کنید.
با این روش، شما هم قدرت محاسباتی اکسس رو حفظ کردید و هم یه محیط کاملاً فارسی و بومی برای کاربرهاتون ساختید. شاید اولش یه کم براتون عجیب به نظر بیاد که چرا مستقیم شمسی ذخیره نمیکنیم، اما بعد از یه مدت که بخواید گزارشهای پیچیده بگیرید، متوجه میشید که این روش چقدر به نفعتونه.
امیدوارم این مطلب بهتون کمک کرده باشه تا بتونید به راحتی از پس مدیریت تاریخها توی اکسس بربیاید. اگه سوالی داشتید یا جایی گیر کردید، یادتون نره که اکسس یه دنیای بزرگه و همیشه راهی برای حل مشکلاتش وجود داره!