Питання стосувалося того, як змінити нумерацію 1-го дня тижня з 0 на 1 . Зауважте, що це не змінює фактичний початок робочого дня. У цій таблиці дат початком тижня завжди буде понеділок. Йдеться лише про те, щоб називати понеділок Днем 1 замість Дня 0.
Цей процес не обов’язково складний, але вам потрібне базове розуміння структури мови M. Якщо ви є учасником LuckyTemplates, ви можете перевірити. Вступ торкається теми.
Дозвольте мені почати з переходу до Power Query . Я вже скопіював сюди функцію M таблиці дат .
Я отримав функцію M із категорії M Code Showcase на форумі LuckyTemplates . Код знаходиться під темою.
Якщо я відкрию розширений редактор , це код.
Там багато коду M, який може відволікати.
Створення тестового запиту
Оскільки у функції M відбувається занадто багато, я почну з нового порожнього запиту .
Я збираюся назвати цей тестовий запит .
Далі я збираюся відкрити розширений редактор .
Оскільки я збираюся створити функцію, я додам пару дужок і видалю там увесь стандартний код.
Щоб запустити функцію, я збираюся оголосити необов’язковий параметр .
Далі я додам змінну. Я назву цю змінну WDStartNum , оскільки вона буде означати початковий номер дня тижня. Мені також потрібно оголосити його тип, тому я введу число .
Я оголошую тип, щоб запобігти помилкам. Якщо я просто залишу його як будь-який тип, це означатиме, що він може передавати таблицю чи значення дати замість просто передачі чисел.
Наступним кроком буде додавання пропозиції let і пропозиції in .
У пропозиції let мені потрібна назва змінної. Тож я назву цю змінну WDStart .
Тепер мені потрібно перевірити, чи було передано WDStartNum . Якщо він пройде, він не прирівнюватиметься до null . Тож я збираюся оголосити, що якщо WDStartNum не дорівнює null, я хочу, щоб було повернуто значення .
Що стосується пункту in, я хочу, щоб той самий крок було виконано. Тож я просто поміс��ю туди WDStart , яку ми назвали змінною раніше в пропозиції let.
Як тільки я натисну «Готово», функція буде створена. Тому я спробую передати значення через цю функцію.
Я спробую ввести літеру «а».
Пам’ятайте, що раніше я оголосив, що значення має бути числом. Оскільки він розпізнає, що введене мною значення не відповідає цій вимозі, він не дозволить мені ввести цей параметр.
Тож я збираюся видалити це та просто залишу місце порожнім.
Щойно я натискаю Invoke, воно повертає значення 0.
Повертаючись до мого початкового запиту, у ньому сказано, що якщо значення не дорівнює null, потрібно повернути WDStartNum. Якщо він дорівнює null, тоді має бути повернуто 0.
Отже, 0 правильний.
Цього разу я спробую передати значення, змінивши число в TestQuery. Щоправда, він повертає «1», коли я натискаю Enter.
Тепер дозвольте мені спробувати пройти 2020 рік у TestQuery. Коли я натискаю Enter, також повертається 2020 рік.
Очевидно, я не хочу, щоб це сталося. Оскільки мені потрібно значення, яке представляє початок тижня, я хочу, щоб з’являлося або 0, або 1. Це означає, що мені потрібно створити інший тест, щоб побачити, чи введене число є 0 чи 1. Для цього я можу використати функцію List.Contains .
Використання List.Contains
Я створив порожній запит і ввів List.Contains без використання дужок.
Коли я натискаю клавішу enter, я бачу документацію щодо цієї функції.
List.Contains вказує, чи список містить значення.
Отже, першим параметром потрібен список, а потім додається значення. Якщо це значення знайдено в списку, воно повертає true. В іншому випадку він поверне false.
Я знову відкрию розширений редактор , щоб внести необхідні зміни у свій запит.
Замість того, щоб перевіряти, чи значення не дорівнює null, я збираюся використовувати List.Contains .
Тепер я наведу список значень, які будуть застосовані до цієї функції.
Я буду використовувати фігурні дужки як ініціалізатор списку. У цих фігурних дужках я поставлю 0, 1. Я додам кому після закриття цієї дужки.
Для другого параметра я збираюся використовувати WDStartNum. Потім я додам закриваючу дужку.
Якщо це на місці, це означає, що 0 або 1 повинні дати мені WDStartNumber. Якщо поставлено щось інше, ніж 0 або 1, я повинен отримати результат 0.
Дозвольте мені перевірити це, поставивши 2020 у TestQuery. Як і очікувалося, це повертає «0» (нуль).
Це тому, що значення 2020 немає в списку.
Додавання параметра до функції M
Тепер, коли я впевнений, що код працює, я нарешті можу помістити його в фактичну таблицю дат і функцію M. Я відкрию розширений редактор і скопіюю логіку .
Потім я перейду до запиту таблиці дат.
Я відкрию оригінальну функцію M за допомогою розширеного редактора .
Потім я збираюся вставити туди свій код. Переконаємося, що в кінці рядка стоїть кома.
Далі я збираюся виділити та скопіювати назву свого параметра .
Потім я додам цей параметр сюди .
Зауважте, що спочатку я маю додати кому в кінці існуючого рядка, а потім оголосити цей параметр необов’язковим . Тоді я можу розмістити WDStartNum і додати тип .
Я додав параметр, а також вставив логіку. Але мені також потрібно переконатися, що я отримаю очікувані результати. Тож я збираюся шукати рядок коду, який охоплює день тижня.
Потім я додам + WDStart .
Я клацну «Готово» , щоб закрити редактор. Потім я викличу запит.
Для StartDate я вставлю 1 січня 2020 року, а потім використаю 31 грудня 2020 як EndDate.
Я використовую «7» як місяць початку фінансового року, потім я вставлю «0» як WDStartNum.
Я клацну Виклик. Тепер у мене є таблиця дат.
Я перейменую його, щоб його можна було легко ідентифікувати.
Зараз я перевірю результати.
Це моя колонка DayOfWeek .
Це показує, що понеділок повернувся як 0.
Повертаючись до запитання на форумі, мені потрібно змінити число початку тижня на 1 замість 0. Тому я просто зміню це в мірі.
Коли я натискаю Enter, понеділок тепер буде днем 1 замість дня 0.
Дивлячись на діапазон чисел, тепер він працює від 1 до 7 замість 0 до 6.
Що станеться, якщо я передам нульове значення?
Тоді DayOfWeek для понеділка просто повертається до 0.
Висновок
Ось як ви можете додати додатковий параметр прямо у функцію M у запиті таблиці дат. Процес зовсім не складний, як я вже згадував раніше. Поки у вас є джерело для коду M, звідти все досить легко.
Знову ж таки, ви завжди можете переглянути курс Advanced Data Transformations & Modeling уОнлайн, якщо ви не знаєте, як працюють коди M.