ایجاد دوره زمانی و بازه زمانی دلخواه بر اساس تاریخ شمسی در Power BI
کارگاه تقویم شمسی در پاور بی آی
تقویم فارسی در پاور بی آی برای فیلتر کردن اطلاعات
یکی از چالش هایی که طراحان داشبورد مخصوصا در ابزارهای Self Service BI همچون کلیک ویو ، کلیک سنس ، پاور بی آی و تبلو با آن روبرو هستند استفاده از تقویم شمسی در داشبورد برای فیلتر کردن اطلاعات می باشد .
برای دیدن جزییات و لینک ثبت نام به لینک زیر رجوع کنید
در طراحی داشبورد یکی از بعد های تحلیل بعد زمان است .و یکی از چالشهایی که با آن روبه رو هستیم بازه های زمانی است در این مقاله قصد داریم نحوه پیاده سازی داشبورد با ابعاد مختلف زمانی و همچنین با فاصله زمانی دلخواه را بررسی کنیم
مدت زمان مطالعه :۲۰ دقیقه
فایل اکسل داده ها :Special Range Date Slicer with Default Value
فایل نهایی :DynamicDateAndSlicerPBI
پیش نیاز :
- جدول زمان (Dimdate)
- Fact در اینجا فروش بررسی میگردد
مرحله ۱ : اضافه کردن Measure های مرتبط با تاریخ شمسی
- روز جاری
M_CurrentDay = LOOKUPVALUE(DateTable[PersianStr],DateTable[GregorianDate].[Date],TODAY())
- ماه جاری
M_CurrentMonth = LOOKUPVALUE(DateTable[PersianMonthNo],DateTable[GregorianDate].[Date],TODAY())
- سال جاری
M_CurrentYear = LOOKUPVALUE(DateTable[PersianYearInt],DateTable[GregorianDate].[Date],TODAY())
- ماه جاری
M_CurrentYearMonth = LOOKUPVALUE(DateTable[PersianYearMonthStr],DateTable[GregorianDate].[Date],TODAY())
- اولین روز ماه
M_FirstDayCurrentMonth = CALCULATE(Min(DateTable[GregorianDate].[Date]),FILTER(DateTable,DateTable[PersianYearMonthStr]= LOOKUPVALUE(DateTable[PersianYearMonthStr],DateTable[GregorianDate].[Date],TODAY())))
- اولین روز فصل
M_FirstDayCurrentSeason = CALCULATE(Min(DateTable[GregorianDate].[Date]),FILTER(DateTable,DateTable[PersianYearSeason]= LOOKUPVALUE(DateTable[PersianYearSeason],DateTable[GregorianDate].[Date],TODAY())))
- اولین روز سال
M_FirstDayCurrentYear = CALCULATE(Min(DateTable[GregorianDate].[Date]),FILTER(DateTable,DateTable[PersianYearInt]= LOOKUPVALUE(DateTable[PersianYearInt],DateTable[GregorianDate].[Date],TODAY())))
مرحله ۲:
ایجاد یک Calculated Table ، جدول بازه های زمانی دلخواه که بتوان بر اساس آن مقادیر را برای امروز،دیروز،سال جاری،ماه جاری و … در اختیار داشت .با توجه به تقویم فارسی این موارد پیچیده به نظر میرسد کد های زیر این کار را برای شما آسانتر میکند و میتوانید به راحتی از آنها استفاده نمایید
-
SpecialDates = VAR _datetable = DateTable VAR _today = TODAY() VAR _month = [M_CurrentMonth] VAR _year = [M_CurrentYear] VAR _thismonthstart = [M_FirstDayCurrentMonth] VAR _thisyearstart = [M_FirstDayCurrentYear] VAR _lastmonthstart = EDATE(_thismonthstart,-1) VAR _thisquarterstart = [M_FirstDayCurrentSeason] RETURN UNION( ADDCOLUMNS(FILTER(_datetable,[GregorianDate]=_today),"Period","امروز","Order",1), ADDCOLUMNS(FILTER(_datetable,[GregorianDate]=_today-1),"Period","دیروز","Order",2), ADDCOLUMNS(FILTER(_datetable,[GregorianDate]>_today-7),"Period","هفت روز گذشته","Order",3), ADDCOLUMNS(FILTER(_datetable,[GregorianDate]>=_thismonthstart),"Period","ماه جاری","Order",4), ADDCOLUMNS(FILTER(_datetable,[GregorianDate]>=_thisquarterstart),"Period","فصل جاری","Order",5), ADDCOLUMNS(FILTER(_datetable,[GregorianDate]>=_thisyearstart),"Period","سال جاری","Order",6), ADDCOLUMNS(FILTER(_datetable,[GregorianDate]>_today-30),"Period","سی روز گذشته","Order",7), ADDCOLUMNS(_datetable,"Period","بازه دلخواه","Order",8) )
مرحله ۳: تنظیم Data Model است
در این مرحله باید دقت داشته باشید که ارتباط بین datetable و CrossDatetable حتما از نوع Both باشد
بسیار خوب در این مرحله جداول و ارتباط بین آنها ایجاد شده است حالا فقط باید داشبورد را طراحی کرد
مرحله۴ :
ایجاد یک Layout جدید
افزودن یک Slicer بر روی Period از جدول Special Date که در مرحله یک ایجاد شده بود
در مرحله بعد به قسمت تنظیمات Slicer بروید و از قسمت selection Control گزینه Singel Select را فعال نمایید
مرحله ۵
اضافه کردن یک Button با تکه کد زیر
ButtonLabel = VAR _selectedperiod = SELECTEDVALUE(SpecialDates[Period]) VAR _start = MIN(SpecialDates[PersianStr]) VAR _end = MAX(SpecialDates[PersianStr]) RETURN SWITCH(true, _selectedperiod = "Custom...",FORMAT(_start,"d mmm")&" - "&FORMAT(_end,"d mmm")&" ✎", _selectedperiod = "Today", FORMAT(_start,"d mmm yyyy") , _selectedperiod = "Yesterday", FORMAT(_start,"d mmm yyyy") , FORMAT(_start,"d mmm")&" - "&FORMAT(_end,"d mmm") )
تا اینجا همه بازه های زمانی به جز بازه زمانی دلخواه به درستی پیاده سازی شده اند
قدم ۵ : پیاده سازی بازه زمانی دلخواه
در این مرحله نیاز است یک slicer دیگر بر روی فیلد PersianInt اضافه گردد که بتوان محدوده زمانی را انتخاب کرد و همین طور یک دکمه Reset از قسمت Button اضافه گردد
و حالا در قسمت section تنظیمات را Show و hide را به گونه ای تنظیم نمایید که با کیلیک بر روی دکمه ایجاد شده در مرحله۵ Slicer دوم و دکمه reset نمایش داده شوند و با کلیک بر روی دکمه reset Slicer ایجاد شده درمرحله ۴ نمایش داده شود
جالب بود به خصوص نحوه محاسبه اولین روز ماه ترفند خوبی بود ممنون
سلام بی زحمت بگین که راهی هست دوره بازه زمانی رو مثل تقویم خارجی داخل data picker بیاریم اما تقویم شمسی نمایش بده؟
برای نمایش تقویم فارسی باید کدهای سمت سرور تغییر کنند ، قابل انجام است اما پیچیده
https://rypitech.com/product/powerbi_persian_calendar/
با سلام
مطالب خیلی خوب و جالبی بود. متشکرم
در مورد مقایسه فروش هر ماه با ماه قبل نیز اگر مثال یا راهنمایی دارید لطفا در سایت قرار بدهید ممنون میشوم
کد button را کجای نرم افزار باید بنویسیم؟
سلام وقتتون بخیر
رفرنس، نمونه یا آموزش برای ساخت date_picker فارسی دارید؟
آیا منظورتون ساخت تقویم شمسی در قالب یک visual هست یا تغییر در تنظیمات تقویم فعلی؟
تغییر در تنظیمات تقویم فعلی و تغییر بر رویه کدهای سمت سور
https://rypitech.com/product/powerbi_persian_calendar/
جناب پیروز
شما بی نظیرید
نه تنها این آموزشتون فوق العاده بود، بلکه همیشه بی چشم داشت دانشتون رو در اختیار سایرین قرار می دین و همیشه پاسخگوی سوالات هستین
خدا به شما سلامتی و به زندگیتون برکت بده
سپاس گذارم از لطف و محبتتون
سلام وخسته نباشید .وقت بخیر.فرص کنید ما یه جدول کالا داریم و یک جدول از موجودی کالا که این موجودی لحظه ای وبدون تاریخ هست.حالا میخام بطور مثال هرشب تویه ساعت مشخصی موجودی اون لحظه جلوش بیاد.دوباره فردا شب تو همان ساعت موجودی لحظه ای و….درواقع موجودی هر کالامون رو تو هر روز داشته باشیم.یعنی بطور مثال یکم ماه درستون اول، در ساعت ده شب چقدر موجودی داشته،دوباره دوم ماه در ستون بعدی ساعت ده شب چقدر موجودی داشته و الی آخر(در واقع مرور تعدادی انبار در روز های مختلف)اینکارو چجوری و از چه روشی تو bi داشته باشیم؟؟؟با فرض اینکه ما کوئری sql رو در زمبنه مرور تعدادی نداریم وفقط یک جدول کالا و یک جدول موجودی در لحظه و بدون هیچ تاریخی داشته باشیم.ممنونم از لطفتون
سلام اگر درست متوجه شده باشم ، شما در کوئریتون تاریخ و ساعت ندارید و هربار کویری را صدا کنید موجودی همان لحظه هست ، منظقا برای چنین کاری باید دیتا را به صورت تاریخی (Historical) در جایی ذخیره کرد ، می تونید در ساده ترین حالت اون کویری را در SQL جاب کنید و بگید هر روز به طور مثال ساعت ۱۰ شب اجرا کن و داخل یک جدولی بریزید و تاریخ و ساعت آن لحظه را هم درج کنید و از طریق مثلا Power Bi یا هر ابزار دیگر دیتایه آن جدول را نمایش دهید