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

کارگاه تقویم شمسی در پاور بی آی


تقویم فارسی در پاور بی آی برای فیلتر کردن اطلاعات

یکی از چالش هایی که طراحان داشبورد مخصوصا در ابزارهای Self Service 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  ایجاد شده درمرحله ۴ نمایش داده شود

 

 

 

 

 

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

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

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

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

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

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

    پاسخ
  4. حسین معماری
    حسین معماری گفته:

    جناب پیروز
    شما بی نظیرید
    نه تنها این آموزشتون فوق العاده بود، بلکه همیشه بی چشم داشت دانشتون رو در اختیار سایرین قرار می دین و همیشه پاسخگوی سوالات هستین
    خدا به شما سلامتی و به زندگیتون برکت بده

    پاسخ
  5. فرزین
    فرزین گفته:

    سلام وخسته نباشید .وقت بخیر.فرص کنید ما یه جدول کالا داریم و یک جدول از موجودی کالا که این موجودی لحظه ای وبدون تاریخ هست.حالا میخام بطور مثال هرشب تویه ساعت مشخصی موجودی اون لحظه جلوش بیاد.دوباره فردا شب تو همان ساعت موجودی لحظه ای و….درواقع موجودی هر کالامون رو تو هر روز داشته باشیم.یعنی بطور مثال یکم ماه درستون اول، در ساعت ده شب چقدر موجودی داشته،دوباره دوم ماه در ستون بعدی ساعت ده شب چقدر موجودی داشته و الی آخر(در واقع مرور تعدادی انبار در روز های مختلف)اینکارو چجوری و از چه روشی تو bi داشته باشیم؟؟؟با فرض اینکه ما کوئری sql رو در زمبنه مرور تعدادی نداریم وفقط یک جدول کالا و یک جدول موجودی در لحظه و بدون هیچ تاریخی داشته باشیم.ممنونم از لطفتون

    پاسخ
    • بابک پیروز
      بابک پیروز گفته:

      سلام اگر درست متوجه شده باشم ، شما در کوئریتون تاریخ و ساعت ندارید و هربار کویری را صدا کنید موجودی همان لحظه هست ، منظقا برای چنین کاری باید دیتا را به صورت تاریخی (Historical) در جایی ذخیره کرد ، می تونید در ساده ترین حالت اون کویری را در SQL جاب کنید و بگید هر روز به طور مثال ساعت ۱۰ شب اجرا کن و داخل یک جدولی بریزید و تاریخ و ساعت آن لحظه را هم درج کنید و از طریق مثلا Power Bi یا هر ابزار دیگر دیتایه آن جدول را نمایش دهید

      پاسخ

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

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

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *