今回はバッチマクロを効果的に使う方法をご紹介します。バッチマクロが真価を発揮するのは、グループ化して処理することです。つまり、データをある項目に対してグループごとに分割して処理を行うような場合です。
例えば、データに対して集計などを行って以下のようなレポートを作ったとします。
内容としては、以下のような感じです。
- レポートは県ごとに作成
- データ全体の売上と総販売数を集計
- 月ごとの売上を棒グラフで表示
- 店舗ごとに売上をマップにプロット(色で売上を表現)
- 店舗ごとの各月の売上合計をテーブル化
これを実現するワークフローは以下のような形になります。
このワークフロー自体は、もらったデータを県ごとに処理してレポートにした、というイメージで作成しています。
しかし、データを見てみると、実は3年分のデータが入っており、各年ごとにレポートが必要だった、とします。この場合、せっかく作ったロジックを各年ごとにレポートを出すように改造する、というのもなかなか手間です。
このような場合にこのレポート作成部分をバッチマクロ化することで、年ごとにグループ化して実行するのも非常に簡単に改造することができます。
バッチマクロ化してみる
バッチマクロ化の手順としては、以下のとおりです。
- グループ化するためのフィルターツールを追加する
- マクロ用の入力データを保存
- 新しいワークフローを作成し、2で作ったデータと元のワークフローから1以降の部分を移植
- コントロールパラメータでフィルタと出力ファイル名を書き換えるように設定
- 元のワークフローにマクロを組み込む
1.グループ化するためのフィルターツールを追加する
まず、グループごとに実行させるためにフィルターツールを追加しましょう。位置としては赤枠の部分がレポートを作成する部分となるので、その直前のところに追加します。
設定としては、例えば2017年のデータのみで処理を行いたければ、基本フィルターで2017年のみにしぼります。
2.マクロ用の入力データを保存
フィルターツールの出力アンカーのデータを保存しましょう。今回はそれなりにデータが大きいので、データ出力ツールでyxdb形式で保存してからマクロの入力として使います。テキスト入力ツールを使って貼り付けるとマクロファイル(yxmc)のサイズも大きくなりますし、貼り付け時に非常に時間がかかります。
ちなみに、今回はマクロ内に来るデータは変わらないという前提としているため、データを保存する時にそのまま保存しています。汎用的に作るのであれば、マクロ内部で使っていないフィールドはセレクトツールで外しておき、フィールドマップの機能を使うことで汎用性が高くなります。
3.新しいワークフローを作成し、2で作ったデータと元のワークフローから1以降の部分を移植
新しくマクロ用のワークフローを作成し、2で作ったマクロ用のyxdbファイルを貼り付け、1の赤枠内のツールをコピーして貼り付けます。
4.コントロールパラメータでフィルタと出力ファイル名を書き換えるように設定
コントロールパラメータツールを追加し、フィルターツールの設定と出力ファイル名を書き換えるようにしましょう。下の赤矢印のフィルターツールとレンダリングツールのアクション入力に、コントロールパラメータツールのQ出力からドラッグしてください。自動的に間にアクションツールが追加されます。
これにより、コントロールパラメータ入力に入力された内容で、フィルターツールのフィルタ設定とレンダリングツールの出力ファイル名を書き換えます。
それぞれ設定を見ていきましょう。
フィルターツールに接続しているアクションツール
フィルターツールに接続されているアクションツールは以下のように設定します。フィルターの値を書き換えるイメージです。
「アクションタイプを選択」は「値を更新」、「更新する値または属性」は「Operand – value=”2017″」を選択します。今回は基本フィルタで設定している値が2017なので2017となっています。
レンダリングツールに接続しているアクションツール
レンダリングツールに接続しているアクションツールの設定は以下のとおりです。イメージとしては、出力ファイル名を書き換えるイメージです。つまり「売上レポート.pdf」というファイルを「売上レポート_2017.pdf」などとして出力するといったことになります。
「アクションタイプを選択」は「フォーミュラで値を更新」、「更新する値または属性」は、「OutputFile – value = “・・・”」、「フォーミュラ」は以下のとおりです。
"売上レポート_"+[#1]+".pdf"
ここで出てきている[#1]というのは、コントロールパラメータ入力とアクションツールの間の接続の名前が「#1」だからです。
あとは、名前を付けて保存でバッチマクロとして保存しましょう(コントロールパラメータツールを追加した時点で、バッチマクロとして自動的に認識されています)。
5.元のワークフローにマクロを組み込む
あとは、元のワークフローに戻り、赤枠内(とフィルターツール)をばっさり削除して先程作成したマクロを追加します。
ところで、バッチマクロには2つ入力がありますが、コントロールパラメータ入力側には、グループ化したい値を入れるので、今回であれば「Year」をユニーク化して入力することになります。
上のように接続しますが、集計ツールの設定は以下のようになります。
バッチマクロ側にも設定が必要ですが、今回は非常にシンプルです。その代わり、入力データは決め打ちなのでマクロ入力ツールで読み込んでいるファイルのフィールド構成と同じである必要があります(その代わりどのフィールドがどれに対応しているか、といったフィールドマップの設定は不要となっています)。
ですので、現時点では指定するフィールドは、コントロールパラメータ入力に接続しているフィールドから選ぶだけです。今回は「Year」です。
次に、グループ化タブも設定しましょう。ちなみに、今回は内部にフィルタを組み込んでおり、コントロールパラメータ入力で書き換えているので必ずしも設定しなくても動きますが、データ量が多い場合などは処理速度向上に貢献するので設定しておきましょう。
Control GroupByフィールドも、Input 1 GroupByフィールドともに「Year」でグループ化するので「Year」を選択しましょう。
これで完成です。
これを実行すると、
- 売上レポート_2017.pdf
- 売上レポート_2018.pdf
- 売上レポート_2019.pdf
の3ファイルが作成されます。
ちょっとおさらいですが、ワークフローとしては以下のような形になります。
マクロは以下のとおりです。
バッチマクロを使わない場合
ちなみに、元のワークフローをグループ化オプションを駆使して改造すると、以下のようになります。変更が必要なところはピンク色のコメントが入っています。14箇所の変更とそのうち1つはツール自体を追加しています。
今回は14箇所でしたが、複雑なワークフローであればあるほど改造するのは大変です。このよう場合は間違いなくバッチマクロ化で対応した方が圧倒的に楽かと思います。バッチマクロ化は、慣れると標準マクロで汎用的なマクロを作るより圧倒的に楽です。
コメント