شیرپوینت فارسی: تقویم شمسی در فیلدهای محاسباتی
این مطلب به توضیحات فنی در خصوص چگونگی پیادهسازی تقویم شمسی در فیلدهای محاسباتی شیرپوینت اختصاص دارد.
یکی از امکانات شیرپوینت تعریف فیلدهای محاسباتی است. مقدار این فیلدها به صورت خودکار و توسط فرمولهایی بر اساس سایر فیلدها محاسبه میشود. مثلا میشود فیلدی را به صورت حاصلضرب دو فیلد دیگر محاسبه کرد. فرمولهای مربوط به این محاسباتی خیلی شبیه فرمولهایی است که در صفحه گستر اکسل استفاده میشود، با این تفاوت که در شیرپوینت به جای نام سلولها بایستی از نام فیلدها استفاده کرد.
در فرمولهای محاسباتی میشود از برخی توابع از پیش تعیین شده استفاده کرد. برای مثال تابع Sin، سینوس مثلثاتی مقدار ورودی را محاسبه میکند. برخی از این توابع به تقویم مربوط میشوند. برای مثال تابع Month، عدد ماه تاریخ ورودی را نمایش میدهد. این توابع میتوانند در مواقعی بسیار سودمند باشند. برای مثال فرض کنید بخواهیم یک لیست را بر اساس ماه گروهبندی یا فیلتر کنیم. برای اینکار میشود یک فیلد محاسباتی ماه ایجاد کرد و فیلتر را بر اساس مقدار آن تنظیم کرد. متاسفانه این توابع فقط با تقویم میلادی کار میکنند، برای مثال تابع Month عدد ماه را فقط بر اسای تقویم میلادی محاسبه میکند. فارسیساز پرنیان برای شیرپوینت این مشکل را حل میکند. با این امکان محاسبات تقویم بر اساس تقویم هجری شمسی انجام میشود. و مثلا تابع Year، عدد سال بر مبنای تقویم شمسی را برمیگرداند.
محاسبات توابع محاسباتی تقویم در شیرپوینت در ماژول "owssrv.dll" پیادهسازی شده است. با کمی بررسی معلوم شد که محاسبات اصلی تقویم در این ماژول با استفاده از تابع VarUDateFromDate انجام میشود. این تابع که در کتابخانهی استاندارد OleAut32.dll قرار دارد، اطلاعات سال، ماه، روز برای یک عدد تاریخ محاسبه میکند. بنابراین مثلا تابع Year با استفاده از این تابع عدد سال را برمیگرداند. تنها کاری که باقی میماند رونویسی این تابع به هنگام اجرا است که اینکار هم به خوبی توسط پرنیان انجام میشود. کافیست یک تابع جدید نوشته شود که اعداد سال، ماه، روز را بر اساس تقویم شمسی محاسبه کند. اما این پایان ماجرا نبود. یکی از توابع مرتبط با تقویم تابع TEXT است. این تابع میتواند یک تاریخ را به شکل دلخواه فرمت (قالب بندی) کند. و در این قالببندی میتواند اسامی ماهها و یا روزهای هفته را نشان دهد. برای مثال TEXT(date,"mmm")، نام ماه را برای تاریخ ورودی برمیگرداند و طبیعتا نسخهی اصلی نام ماه میلادی را محاسبه میکند. برای پشتیبانی از نامهای فارسی ناگزیر شدیم توابعی که نام ماه و همچنین نام هفته را محاسبه میکنند را پیدا کنیم. اینبار این توابع از نوع توابع داخلی بودند که ورودیهای اکسپورت شدهای نداشتند. یعنی درواقع از API شناخته شدهای نبودند. پس اجبارا آنها را در کدهای ماشین پیدا کردیم: به این ترتیب توابع GetMonthName و GetWeekDayName شناسایی شد. با رونویسی این توابع، مشکل اسامی ماهها و روزهای هفته حل میشود: به این ترتیب مشکل تقویم شمسی در فیلدهای محاسباتی شیرپوینت با رونویسی سه تابع زیر انجام شد:
VarUDateFromDate : که اعداد سال، ماه و روز را محاسبه میکند.
GetMonthName: که نام ماه را محاسبه میکند
GetWeekDayName: که نام روز هفته را برمیگرداند.