指定した日付範囲の昨年対比レポートを作成する方法

2024年3月23日テクニカルメモ

本記事では App Studio を利用した昨年対比レポートを作成する手順を紹介します。

App Studio の最大の強みである変数処理を利用して、ユーザが入力するFROM-TOも日付に対して昨年を求める計算を行うことができます。

ゴールイメージ

①任意の年月「yyyy/mm」を FROM-TO の形で入力する。
②入力年月範囲を当年として抽出する。
③前年範囲のデータと比率も算出する。

作成手順は、以下の通りです。

シノニムを編集して年月項目を作成する

日付(年月日)から年月の要素を抜き出す仮想項目(DEFINE)を作成します。
日付の要素を抜き出す仮想項目は、シノニム編集画面から簡単に作成が可能です。

シノニムの編集画面を起動

アプリケーションディレクトリメニューから、日付項目を持つシノニムを編集していきます。
本記事では「sales_2022」というデータを利用します。

※上記「sales_2022」データは、本記事の下部よりダウンロードいただけます

日付の分解(年月日から年月項目を作成)

日付の分解とは日付の要素(年/月/日/時/分/秒)を切り出した一時項目を作成する機能です。

対象の日付項目の右クリックメニューから「日付の分解」を選択します。

分解可能な日付項目が表示されます。ここでは、年月表示のフォーマットである「YYMDm」を選択します。

OKで閉じたらシノニムを保存します。

App Studio からレポートを作成する

新規作成からプロシジャを選択します。

日付用の変数を準備する

FROM-TOの年月を代入する変数と、
その年月から1年前の年月を代入する変数を作成します。

年月変数の計算式サンプル

変数に指定している 2022/10 と 2022/12 は任意の初期値です。
前年月を求めるために3つの関数を利用しています。

関数名説明
DT文字列を日付として扱います。「yyyy/mm ⇒ yyyy/mm/01」
DTADD日付の加算減算を行います。(今回は年要素YEARを-1年)
DT_FORMAT日付を文字列に変換します。(今回はHYYM型[yyyy/mm]に変換)
各関数の使い方は「変数で日付の計算をする方法」を参照
-DEFAULTS &TOU_YYM_FR = '2022/10';
-DEFAULTS &TOU_YYM_TO = '2022/12';
-SET &ZEN_YYM_FR = DT_FORMAT(DTADD(DT(&TOU_YYM_FR),YEAR,-1),'HYYM');
-SET &ZEN_YYM_TO = DT_FORMAT(DTADD(DT(&TOU_YYM_TO),YEAR,-1),'HYYM');

各関数の使い方は「変数で日付の計算をする方法」を参照

コメントを閉じます。

「オプションパラメータ」と「ダイアログマネージャ」が表示されます。

新規レポートを作成する

プロシジャビューの新規作成メニューから、レポートを選択します。

レポートで利用するシノニムを選択します。

仮想項目として、FROM-TOの日付範囲を判断するためのフラグ項目を作成する

一時項目(DEFINE)の新規作成を選択します。

フラグ項目(項目名はFLG)を作成します。
今回は整数型(I4)として、IF文の処理は、
・当年範囲は1
・前年範囲は2
・それ以外は0
とします。

演算式のコードイメージ

     IF 年月項目 FROM '&TOU_YYM_FR' TO '&TOU_YYM_TO' THEN 1
ELSE IF 年月項目 FROM '&ZEN_YYM_FR' TO '&ZEN_YYM_TO' THEN 2
ELSE 0

今回指定した演算式

     IF SALES_DATE_YEAR_M FROM '&TOU_YYM_FR' TO '&TOU_YYM_TO' THEN 1
ELSE IF SALES_DATE_YEAR_M FROM '&ZEN_YYM_FR' TO '&ZEN_YYM_TO' THEN 2
ELSE 0

仮想項目として、当年用項目と前年用項目を作成する

DEFINE項目の追加は「新規作成」ボタンから行います。

当年用項目を作成します。

今回は整数型(D12)として、IF文の処理は、
当年(FLG=1)の時に対象の数値項目の値
それ以外は0とします。

前年用項目を作成します。

今回は整数型(D12)として、IF文の処理は、
前年(FLG=2)の時に対象の数値項目の値
それ以外は0とします。

設定後のコードイメージ

当年用項目/D12=IF FLG EQ 1 THEN 数値項目 ELSE 0;
前年用項目/D12=IF FLG EQ 2 THEN 数値項目 ELSE 0;

DEFINE処理の全体イメージ

今回の手順だと、以下のような式が出来上がります。

DEFINE FILE SALES_2022
FLG/I4=
     IF SALES_DATE_YEAR_M FROM '&TOU_YYM_FR' TO '&TOU_YYM_TO' THEN 1
ELSE IF SALES_DATE_YEAR_M FROM '&ZEN_YYM_FR' TO '&ZEN_YYM_TO' THEN 2
ELSE 0;
当年数量/D12=IF FLG EQ 1 THEN AMOUNT ELSE 0;
前年数量/D12=IF FLG EQ 2 THEN AMOUNT ELSE 0;
END

日付処理の動作確認

以下のようなレポートを作成して、データが正しく取得できているかどうか確認します。
BY:「年月」「FLG」
SUM:「当年用項目」「前年用項目」「元の数値項目」
WHERE:「FLG=1 OR 2」

日付範囲を入力して実行し、当年と前年のデータが正しく取得されているかどうか確認します。

レポートの作成

FLG項目等、レポート上には不要な項目を削除して、レポートを作成します。
今回は地区別の数量比を計算してみます。

BY:「地区番号」「地区名」
SUM:「当年数量」「前年数量」

計算項目の作成(前年比項目の作成)

一時項目(COMPUTE)を作成します。

名前:数量比
フォーマット:D12.2p
計算式:当年数量 / 前年数量

実行結果イメージ

ダウンロード

テスト用データ

上記テスト用データは、有効なアプリケーションディレクトリに配置してください。
・sales_2022.mas
・sales_2022.foc


サンプルコンテンツの利用における注意事項

株式会社アシストおよび開発元メーカーは、本サンプルコンテンツの動作に関していかなる保証もいたしません。
また、本サンプルコンテンツの利用によって起因する問題についても責任を負いかねます。
本サンプルコンテンツに記載の技術情報およびプログラムは、特定の環境下において動作し、初期動作のみ確認をしております。
すべての個別環境にて動作することを想定していませんので、実装する実環境において、十分な動作確認をいただくことを推奨します。
また、システム環境の設定変更や導入製品のバージョンアップを実施した場合などの非互換については考慮されていません。
初期動作確認後、システム環境変更後の動作については、保証いたしませんので、ご了承ください。
サンプルコンテンツに含まれるプログラムなどの改変は、自由に実施していただいて問題ありませんが、新規要件やバグ修正などが発生した場合には、ご利用者様の責任範囲内での修正を実施いただくようお願いします。
サンプルコンテンツに含まれる、JavaScript,CSS,HTML,バッチファイル、シェルスクリプトなど、WebFOCUS製品サポートに関わらない箇所に関してのお問い合わせは、株式会社アシストの技術者、サポートセンターおよび開発元メーカーで受け付けることができません。WebFOCUSの動作に関するお問い合わせに限らせていただきます。