序
今年もやってきました、Advent Calendar の季節です。
シリーズ2の日付にまだ空きがある様子だったので、当記事で塞いでしまおう…という記事です。よろしくお願いします。
実装したい機能
上のテーブルにある「単価」×「注文数」における「合計金額」の集計業務は、レコード単位であれば容易ですが、以下の画像のように、予算番号ごとの「合計金額」を算出したいという場合があると思います。
また、部署コードごとにそれを算出したい、というご要望も少なからずあると思います。本記事では、Power Apps 上でそういった処理を行いたい時の Tips を紹介します。
Special Thanks
今回の記事は、益森さんの以下の記事を参考にしてアレンジを加えているものです。基本は、こちらの記事を読んでいただければ理解は早いと思います。
いつもありがとうございます。今度はそちらへ遊びに行きますね(私事)
GroupBy関数
まずはフィルタリング
まずはテーブル全体から、特定の部署コードでフィルタリングしてコレクション(配列)化する必要があります。特定の部署コードは、動的に変更されることを見越して、ドロップダウンコントロール(drpCode)を配置します。
また、集計処理を実行するためのボタン(btnRun)を配置しておきます。drpCpde でフィルタリングした結果を、コレクションに格納する際の数式は次のとおりです。
btnRun.OnSelect =
ClearCollect(コレクション名, Filter(データソース名, 部署コード = drpCode.Selected.Value))
このフィルタリングの際、単価 × 注文数の合計金額も同時に算出していく必要があります。グループ集計の前に手順を踏むことが大事ですね。各レコードに対して計算を仕掛けていくことになりますので、繰り返し処理が必要な場面です。ForAll関数で囲っていきます。
btnRun.OnSelect =
ClearCollect(
コレクション名,
ForAll(
Filter(
データソース名,
部署コード = drpCode.Selected.Value //フィルタリングしたデータソースに対して
),
//以下、実行される数式
{
予算番号: ThisRecord.予算番号,
科目: ThisRecord.科目,
合計: 単価 * 注文数
}
)
);
新たに、元のデータソースに存在しない合計金額列をコレクション側で作成しています。そうしてできたコレクション(筆者は colTempSum と名付けました)は次の通りです。
部署コード "79032" でフィルタリングしたテーブルで、まずは各レコードの集計結果を得ることができました。ここから、共通する予算番号を基準にした合計金額を算出してみましょう。
グループ化して集計する
先ほど集計したテーブルを土台にして、グループ化を行います。上の数式に続けて、以下の数式を書きます。
ClearCollect(
colSum,
ForAll(
GroupBy(
colTempSum,
予算番号, 科目, // 「予算番号」と「科目」でグループ化
GroupedResults
),
{
予算番号: ThisRecord.予算番号,
科目: ThisRecord.科目,
合計: Sum(GroupedResults, 合計) // グループごとの合計を計算
}
)
);
複雑に感じる式ですが、最初に作成したコレクションを GroupBy関数で囲んでグループ化し、それをデータソースとして計算式を実行している感じです。今回は合計金額の集計なので、Sum関数で集計しています。
結
GroupBy関数は、便利な半面、普段イメージしているテーブルの構造を脳内で変換していく必要があってとっつきにくさを感じます(親の列に子の列が入っている…みたいなイメージ)
とはいえ、まずは基本のフィルタリングとコレクション作成に集中し、その後でグループ化することで、多少なりともその負担を軽減できると思います。
どの数式を書くにあたっても、基本文法に変化はありません。1つずつ連結することを意識していくと、今後の Power Apps ライフが多少なりとも捗っていくことでしょう(これは常に自分に言い聞かせています。求める結果を焦らない、これ大事)
それでは、また。