ایجاد دوره زمانی و بازه زمانی دلخواه بر اساس تاریخ شمسی در Power BI

در طراحی داشبورد یکی از بعد های تحلیل بعد زمان است .و یکی از چالشهایی که با آن روبه رو هستیم بازه های زمانی است در این مقاله قصد داریم نحوه پیاده سازی داشبورد با ابعاد مختلف زمانی و همچنین با فاصله زمانی دلخواه را بررسی کنیم

مدت زمان مطالعه :۲۰ دقیقه

فایل اکسل داده ها :Special Range Date Slicer with Default Value

فایل نهایی :DynamicDateAndSlicerPBI

پیش نیاز  :

  1. جدول زمان (Dimdate)
  2. 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  ایجاد شده درمرحله ۴ نمایش داده شود

 

 

 

 

 

7 پاسخ
  1. محمد
    محمد گفته:

    سلام بی زحمت بگین که راهی هست دوره بازه زمانی رو مثل تقویم خارجی داخل data picker بیاریم اما تقویم شمسی نمایش بده؟

    پاسخ
  2. حسنی
    حسنی گفته:

    با سلام
    مطالب خیلی خوب و جالبی بود. متشکرم
    در مورد مقایسه فروش هر ماه با ماه قبل نیز اگر مثال یا راهنمایی دارید لطفا در سایت قرار بدهید ممنون میشوم

    پاسخ
  3. محمد سیفی
    محمد سیفی گفته:

    سلام وقتتون بخیر
    رفرنس، نمونه یا آموزش برای ساخت date_picker فارسی دارید؟
    آیا منظورتون ساخت تقویم شمسی در قالب یک visual هست یا تغییر در تنظیمات تقویم فعلی؟

    پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.