ورودی و خروجی تابع NETWORKDAYS
تابع دارای چهار پارامتر ورودی (دو پارامتر اجباری و دو پارامتر اختیاری) است،
NETWORKDAYS(, , [, ])
دو پارامتر <start_date>, <end_date> اجباری و دو پارامتر <weekend>, <holidays> اختیاری هستند. اگر بخواهید مقدار پارامتر <holidays> را به تابع بدهید، آنگاه بایستی مقدار پارامتر <weekend> نیز مشخص گردد و این پارامتر نیز اجباری خواهد بود.
خروجی تابع NETWORKDAYS یک عدد صحیح است که عبارت است از روزهای کاری بین دو تاریخ (تاریخ شروع و پایان).
استفاده از تابع NETWORKDAYS
واضح است که، محاسبهی روزهای کاری مستلزم حذف تعطیلات آخر هفته و سایر تعطیلات در طول سال(تعطیلات عمومی، مناسبتهای خاص و غیره) میباشد. بنابراین برای محاسبهی دقیق تعداد روز کاری در یک بازه ی مشخص، به جدولی از تعطیلات آخر هفته و سایر تعطیلات (بر اساس تعطیلات مشخص شدهی هر کشور ) نیاز خواهیم داشت. حال با یک مثال ساده نحوهی استفاده از این تابع را شرح خواهیم داد:
- ابتدا با استفاده از تابع calendar() یک جدول تاریخ ایجاد میکنیم.
- یک جدول جداگانه از تعطیلات (به جز آخر هفته ها) را ایجاد مینماییم.
- بر اساس قوانین و ضوابط سازمان و کسب و کار خود روزهایی تعطیلات آخر هفته را مشخص مینماییم (پنج شنبه و جمعه در برخی سازمانها و جمعه در برخی دیگر، شنبه و یکشنبه در کشورهای اروپایی و غیره).
- یک ستون برای کل روزهای کاری ایجاد میکنیم.
- یک Measure برای محاسبهی کل روزهای کاری خواهیم ساخت.
گام 1 : ایجاد جدول تاریخ بر اساس دو تاریخ شروع و پایان بازه
برای این کارکافیست از تابع calendar() استفاده نموده و تاریخ شروع و پایان بازه ی مورد نظرتان را وارد نمایید. تا تمامی تاریخ های بین این دو نقطهی زمانی در جدول درج شود. در مثال فعلی تاریخ شروع یک ژانویه 2023 و تاریخ پایان 29 ژوئن 2023 لحاظ شده است.
در اغلب کسب و کارها ، بسیاری از شاخصهای کسب و کار بر مبنای تعداد روزهای کاری محاسبه میشوند، برای مثال:
- تعداد روزهای کاری که طول کشیده است تا یک سفارش به مشتری نهایی تحویل گردد
- تعداد کل روزهای کاری برای محاسبهی نحوهی عملکرد و سایر شاخصهای مربوط به ساعات کاری کارمندان
- میزان ظرفیت تولید و…
از طرفی علاوه بر متغیر بودن تاریخ تعطیلات مناسبتی در تقویم جلالی در سالهای مختلف، تعطیلات آخر هفته نیز در سازمانهای مختلف ممکن است متفاوت باشد. همین مسأله محاسبهی تعداد روزهای کاری در یک بازهی زمانی مشخص را به یک چالش تبدیل میکند.
خوشبختانه مایکروسافت اخیراً یک تابع DAX جدید به نام NETWORKDAYS منتشر کرده است که عملکردی شبیه توابع اکسل NETWORKDAYS.INTL و NETWORKDAYS دارد.
در این مقاله مروری بر این تابع و نحوه استفاده از آن خواهیم داشت.
دانلود فایلهای این مقاله:
فایل اکسل UK Holidays.xlsx
فایل اکسل SampleDate.xlsx
فایل Power BI: NetworkDays.pbix
SampleDate = CALENDAR(DATE(2023,01,01), DATE(2023,06,29))
گام 2: ایجاد جدول تعطیلات(به جز تعطیلات آخر هفته)
جدول تعطیلات رسمی را به شیوه های مختلفی میتوان ایجاد نمود، تنها باید به این نکته توجه داشته باشید که این جدول حتما باید شامل یک ستون، و آن هم تاریخ تعطیلات باشد.
برای مثال فعلی از سایت Gov.UK تعطیلات رسمی انگلستان در سال 2023 را استخراج کرده ایم.
در صورتیکه جدول شما شامل ستونهای دیگری غیر از تاریخ تعطیلات است، با استفاده کد زیر میتوانید یک جدول تک ستونی از تاریخ ها ایجاد کنید.
HolidayTable = SUMMARIZECOLUMNS('UK Holidays'[Date].[Date])
گام 3: مشخص نمودن تعطیلات آخر هفته
این مرحله کاملا به قوانین کسب و کار و سازمان شما بستگی دارد. در مثال فعلی، روزهای آخر هفته شامل شنبه و یکشنبه است.
برای مشخص کردن روزهای تعطیلات آخر هفته ( آرگومان سوم تابع NETWORKDAYS ) باید بر اساس جدول زیر اقدام نمایید:
آرگومان weekend، یا تعطیلات آخر هفته: یک عدد از 1 تا 17 است که مشخص می کند تعطیلات آخر هفته چه روزهایی هستند.
به عبارتی هر عدد، روزهایی از هفته را نشان میدهد که براساس قوانین آن کسب و کار، تعطیلات آخر هفته محسوب میشوند و در تعداد کل روزهای کاری بین start_date و end_date لحاظ نمیشوند.
مقدار | روز |
1 | شنبه و یکشنبه |
2 | یکشنبه و دوشنبه |
3 | دوشنبه و سه شنبه |
4 | سه شنبه و چهار شنبه |
5 | چهارشنبه و پنج شنبه |
6 | پنج شنبه و جمعه |
7 | جمعه و شنبه |
11 | یکشنبه |
12 | دوشنبه |
13 | سه شنبه |
14 | چهارشنبه |
15 | پنج شنبه |
16 | جمعه |
17 | شنبه |
در مثال فعلی، عدد “1” را به عنوان آرگومان سوم لحاظ میکنیم که نشان میدهد روزهای شنبه و یکشنبه به عنوان تعطیلات آخر هفته لحاظ شده اند.
گام 4: ایجاد یک ستون به عنوان روزهای کاری
ایجاد یک ستون محاسباتی(Calculated Column) و یک Measure با استفاده از تابع NETWORKDAYS متفاوت است. برای ایجاد یک ستون محاسباتی، به صورت زیر اقدام مینماییم. از تب new column یک ستون جدید در جدول sampleDate به روش زیر ایجاد میکنیم،
Working Days (Column) = NETWORKDAYS(SampleDate[StartDate],TODAY(), 1, 'UK Holidays')
با استفاده از دستور فوق، در ستون جدید، در هر ردیف تعداد روزهای کاری از تاریخ، StartDate تا تاریخ روز جاری محاسبه میگردد.
برای درک بهتر، روزهای هفته نمایش داده شده اند، به عنوان مثال ردیف اول تا سوم را ملاحظه نمایید، ردیف اول روز یکشنبه است که جزء تعطیلات آخر هفته است، ردیف دوم دوشنبه 2 ژانویه حزء تعطیلات رسمی در جدول UK Holidays میباشد، به همین دلیل تعداد روزهای کاری در سه ردیف اول همچنان 182 باقی مانده است. پس از سپری شدن هر روز، تعداد روزهای کاری کاهش مییابد تا تاریخ 7 و 8 ژانویه که مجددا روزهای شنبه و یکشنبه میباشند که به عنوان تعطیلات آخر هفته به تابع معرفی شدهاند.
گام 5 : ایجاد یک Measure بر اساس تعداد روز کاری
همانطور که قبلا ذکر شد، ایجاد یک Measure با استفاده از تابع NETWORKDAYS DAX با نحوه انجام همان کار برای ستونهای محاسباتی متفاوت است. برای ایجاد یک Measure ، بهتر است از تعریف متغیر استفاده شود،
Working Days (Measure) =
VAR _StartDate = SELECTEDVALUE(SampleDate[StartDate])
VAR _EndDate =TODAY()
RETURN
NETWORKDAYS(_StartDate, _EndDate, 1, 'UK Holidays')
با انتخاب هر ردیف از جدول SampleDate تعداد روز کاری از ردیف انتخاب شده ، تا روز جاری محاسبه میگردد.