週次カレンダー(Weekly Calendar / 4-4-5カレンダーなど)は、小売業やサプライチェーン管理(SCM)のプロジェクトで頻繁に使用されますが、月次カレンダーとは少し異なるアプローチが必要です。
特に、「週」と「月」の親子関係を正しく扱うことがポイントになります。
以下に、ブログ記事の続編として**「週次カレンダー編」**の原稿を作成しました。
前回の記事では、一般的な「月次(Monthly)」カレンダーのフィルター作成方法を紹介しました。
しかし、小売業やメーカーの需給調整でよく使われる**週次カレンダー(4-4-5カレンダーなど)**の場合、「今月」や「来月」という概念を週単位にどう落とし込むかで悩む方が多いようです。
今回は、週次モデル特有のTimeフィルターの作り方を、**「Lookup(参照)」**テクニックを使って解説します。
週次カレンダーの落とし穴
Anaplanの CURRENTPERIOD() 関数は、モデル設定にもよりますが、基本的には「現在の月(例:Oct 24)」を返します。「現在の週(Week 1 FY24)」ではありません。
そのため、「今月の週だけを表示したい」といった場合、週(Week)から親である月(Month)を参照するロジックが必要になります。
Step 1. 月次モジュール(SYS Month)を準備する
まず、週の親となる「月(Month)」単位のシステムモジュールで、現在の月を判定するフラグを作ります。
(※前回の記事で作成したものでOKです)
- Module:
SYS01 Time Settings (Month) - Applies To:
Time (Month)
| Line Item Name | Format | Formula |
| Current Period? | Boolean | ITEM(Time) = CURRENTPERIOD() |
Step 2. 週次モジュール(SYS Week)で親を参照する
次に、週単位のシステムモジュールを作成し、そこから「その週がどの月に属しているか」を確認してフィルターを作ります。
- Module:
SYS02 Time Settings (Week) - Applies To:
Time (Week)
ここで重要なのが、PARENT関数 と LOOKUP の組み合わせです。
パターンA:当月の週のみ表示 (Weeks in Current Month)
「今が10月なら、10月に含まれるすべての週(Week 1〜Week 4)を表示する」という設定です。
| Line Item Name | Format | Formula |
| Parent Month | Time (Month) | PARENT(ITEM(Time)) |
| Filter: Current Month’s Weeks? | Boolean | SYS01 Time Settings (Month).'Current Period?'[LOOKUP: Parent Month] |
- 解説:
Parent Monthで、その週の親(月)を取得します。- その月が
Current Periodかどうかを、月次モジュール(SYS01)から LOOKUP で引っ張ってきます。
- Pro Tip: 直接
PARENT(ITEM(Time)) = CURRENTPERIOD()と書くこともできますが、システムモジュール間をLOOKUPで繋ぐ方が、計算効率(パフォーマンス)が良いとされています。
パターンB:ローリング〇〇週 (Rolling Weeks)
「今週を基準に、向こう13週(約3ヶ月分)を表示したい」というケースです。
週次カレンダーの場合、ADDMONTHS ではなく、単純に 日数(7の倍数) で計算するのが最も確実です。
| Line Item Name | Format | Formula |
| Filter: Next 13 Weeks? | Boolean | START() >= START(CURRENTPERIOD()) AND START() < START(CURRENTPERIOD()) + (13 * 7) |
- 注意点:
CURRENTPERIOD()が月を指している場合、START(CURRENTPERIOD())は「その月の1日」になります。 - より厳密に「今週」基準にする場合:もし「今日が含まれる週」を基準にしたい場合は、別途「Current Date」を入力する設定モジュールを用意し、START() >= ‘SYS Global Settings’.Current Date のように判定させるのが一般的です。
パターンC:過去週と未来週 (Historical vs Future Weeks)
実績データ入力用と、フォーキャスト入力用でビューを分けたい場合です。
| Line Item Name | Format | Formula |
| Filter: Historical Weeks? | Boolean | START() < START(CURRENTPERIOD()) |
| Filter: Future Weeks? | Boolean | NOT Filter: Historical Weeks? |
【上級編】53週目の罠に注意
週次カレンダー(4-4-5など)を採用している場合、数年に一度「53週目」が発生する年があります。
- ハードコーディングは厳禁:
WEEKVALUE(TIME) <= 52のような式を書くと、53週目がある年にデータが表示されなくなってしまいます。 - 解決策: 上記の「パターンA(親の月を見る)」や「パターンB(日付で判定する)」の方法であれば、53週目があっても自動的に判定されるため、メンテナンスフリーで運用できます。
まとめ
週次カレンダーのTimeフィルター作成のポイントは以下の通りです。
- **月次(Month)**側で
Current Periodフラグを作る。 - **週次(Week)**側から
PARENT関数で親の月を特定し、LOOKUPする。 - ローリング計算は
7(日数) を掛けて計算する。
特に小売・流通業のプロジェクトでは必須の知識ですので、ぜひテンプレートとして活用してください。
