مایکروسافت سی آر ام فارسی: تقویم شمسی در فیلتر “این ماه”
یکی از ویژگیهای جالب داینامیکس سی آر ام توانایی آن در فیلترهای تاریخ است. مثلا اینکه بتوانید صورتحسابهای "ماه قبل" را فیلتر کنید: مانند بخشهای دیگر سی آر ام این عملیات بر اساس تقویم میلادی انجام میشود و ما ناگزیر هستیم برای پشتیبانی از تقویم شمسی، کدهای اجرایی را تغییر دهیم. خوشبختانه کدهای مربوط به جستارها (Queries) در سی آر ام خیلی خوب و ساختار یافته هستند. به ترتیبی که امکان انجام این تغییر را به شکلی ساده و مطمئن امکانپذیر میکنند. کلاس "Microsoft.Crm.Query.CrmSqlSelectCommandStrategy" در سی.آر.ام وظیفهی ساخت دستورهای جستار برای SQL را بر عهده دارد. این کلاس توابع مختلفی برای تنظیم جستارها دارد. سی.آر.ام برای ساخت جستارهای SQL از این توابع استفاده میکند. تابعی که برای فیلترهایی نظیر "این ماه"، "امسال" و... استفاده میشود،GetDateRangeConditionStartAndEnd است. این تابع بر اساس شرط مورد نظر و همچنین تاریخ ورودی، تاریخهای شروع و انتها را برای دورهی مورد نظر انتخاب میکند. برای مثال برای فیلتر این ماه، تاریخ شروع این ماه و همچنین انتهای آنرا محاسبه میکند. این تابع در شکل زیر نشان داده شده است. دقت کنید که در مورد فیلتر ماه، چگونه ابتدای ماه با DateTime(Year,Month,1) محاسبه میشود و پس از آن با تابع AddMonth، تارخ خاتمه محاسبه میشود: برای تصحیح این کد به ترتیبی که بتواند با تقویم شمسی کار کند، لازم است این محاسبات به جای اینکه توسط کلاس DateTime اجرا شوند، از کلاس کلندر (Calendar) درستی (در مثال ما PersianCalendar) استفاده شود. برای مثال کد زیر
calendar.ToDateTime(calendar.GetYear(contextDateTime), calendar.GetMonth(contextDateTime), 1, 0, 0, 0, 0);
تاریخ شروع یک ماه برای تقویم مورد نظر را محاسبه میکند. و یا تابع Calendar.AddMonth، بر اساس تقویم انتخاب شده محاسبات افزایش ماه را انجام میدهد. به این ترتیب کافیست در ابتدای تایع و بر اساس انتخاب کاربر کلندر (Calendar) مناسب را انتخاب کنیم و در محاسبات از آن استفاده کنیم. شکل ریز تابع تغییر یافته در پرنیان را نشان میدهد: دقت کنید که چگونه محاسبات از کلاس DateTime به کلاس Calendar منتقل شدهاند. همچنین لازم است توجه داشته باشید که پرنیان در جای دیگری Culture را تصحیح میکند. یعنی اگر کالچر فارسی باشد، تقویم آن بدرستی PersianCalendar خواهد بود و به این ترتیب دستور
Var calendar = culture.Calendar تقویم صحیحی را انتخاب میکند. در صورتیکه کالچر کاربر فارسی نباشد، این کلندر همان GregorianCalendar خواهد بود و محاسبات دقیقا به شکل اصلی آن و با تقویم میلادی انجام خواهد شد. تابع دیگری هم در این رابطه وجود دارد. این تابع با نام " GetDateDifferenceConditionStartAndEnd" برای فیلترهایی نظیر "چند ماه بعد" یا "چند ماه قبل" بکار برده میشود. روش کار این تابع خیلی شبیه به تابع اول است. و برای تصحیح آن، میشود از همان روش استفاده کرد. چیزی که در این تابع کمی عجیب و دور از انتظار است، آنست که برخلاف تابع قبل محاسبات محدود به محدودههای تاریخی نمیشود. برای مثال برای "سه ماه بعد" تاریخ شروع فیلتر امروز و تاریخ انتهای آن سه ماه بعد از امروز گرفته میشود. شاید انتظار کاربر این باشد که در این حالت محدوده از اول این ماه تا آخر سه ماه بعد محاسبه شود. به هرحال این روش محاسبهی استاندارد سی.آر.ام، تنها کاری که ما انجام میدهیم آنست که محاسبات تقویم را با تقویم شمسی انجام دهیم. شکل زیر تایع تغییر یافته را نشان میدهد. دقت کنید که محاسبات با استفاده از کلاس Calendar چگونه تصحیح شده است. خلاصه:
پرنیان امکان استفاده از فیلترهای خاص تاریخ بر اساس تقویم شمسی را ارائه میکند. برای اینکار دو تابع " GetDateRangeConditionStartAndEnd" و " GetDateDifferenceConditionStartAndEnd" از کلاس " Microsoft.Crm.Query.CrmSqlSelectCommandStrategy" تغییر داده شده و برای استفاده از PersianCalendar تصحیح شده است. به این ترتیب اگر کاربر تقویم شمسی را انتخاب کرده باشد وقتی فیلتری نظیر "این ماه" را انتخاب کند، اطلاعات به شکل صحیح و برحسب تقویم شمسی فیلتر میشود.