Power Appsでアプリを開発していると、複数のマスターデータを組み合わせて新しい結合キーを作成したいシーンってありますよね。例えば、部門マスターと管理マスターがあって、これらを全て組み合わせた4つの結合キーを一度に作りたい、なんて場面です。
実は、PowerFxのAddColumns関数とUngroup関数を上手く組み合わせることで、こういった複雑な結合キーの作成も簡単に実現することが可能です。
Power Appsでのクロス結合の基本的な仕組み
今回は部門マスターと管理マスターという2つのコレクションをクロス結合して、4つの新たな結合キーを作成する方法をご紹介します。
ClearCollect(DeptMaster,
{部門コード: "01"},
{部門コード: "02"}
);
ClearCollect(MgmtMaster,
{管理コード: "A03"},
{管理コード: "B01"}
);
まずは、それらを格納する新たなコレクションを作成しましょう。今回はNestedTableというコレクションを新たに作成します。
ClearCollect(
NestedTable, ここに値を入れていきます
)
AddColumns関数とUngroup関数の組み合わせ
Power Appsでクロス結合を行うには、AddColumns関数とUngroup関数の2つのPowerFx関数をうまく組み合わせて実現します。
ステップ1: コレクションの連結
まずはAddColumns関数に対して、DEPTマスターを指定し、管理コード一覧列を新たに作成します。その値にはMGMTマスターを指定しましょう。
powerfx
ClearCollect(
NestedTable,AddColumns(
DeptMaster,管理コード一覧,MgmtMaster
))
この時点でのコレクションの状態を確認したいので、一度数式を実行してコレクションを作成し、データの中身をチェックしてみます。
Power Appsの変数メニューから詳細を確認すると、このように部門コードごとに管理データが連結した形になっているのが分かります。


ステップ2: Ungroupで展開
続いて、この管理コード一覧という新たに作成した列をUngroup関数で展開します。
展開する前に、少し見やすくなるように整えておきましょう。AddColumns関数の上から、Ungroup関数を記載します。
powerfx
ClearCollect(
NestedTable,Ungroup(
AddColumns(DeptMaster,管理コード一覧,MgmtMaster),
管理コード一覧
))
Ungroup関数に指定する列は、先ほど作成した管理コード一覧になります。
これでどのようになっているか、数式を実行して再度コレクションを確認してみましょう。
このような形で管理コード一覧が展開され、4行になっていることが確認できますね。


ステップ3: 結合コードの作成
あとは2つの列を連結した結合コード列を作成するだけなので、Ungroup関数の上からさらにAddColumns関数で囲みます。
powerfx
ClearCollect(
NestedTable,AddColumns(
Ungroup(
AddColumns(
DeptMaster,
管理コード一覧,
MgmtMaster
),
管理コード一覧
),
結合コード, 部門コード & "_" & 管理コード
))
作成する列名は「結合コード」として、欲しい形になるように文字列の連結でコードを作成します。今回は部門コード_管理コードとなるようにPowerFxの文字列結合演算子を使用しましょう。

ここまで記載できたら、もう一度数式を実行して、コレクションの中身を確認してみます。

正しく結合コードが四つ作成できていることが確認できますね!
3つ以上のコレクションでも応用可能
今回の方法は二つ以上のコレクションでも作成でき、例えばこのように3つ目のコレクションがあったとします。
この場合も、結局連結したコレクションが最初に指定したDeptMasterと同じ扱いになるだけなので、同じようにAddColumns関数でMgmtMaster2コレクションを連結します。
ClearCollect(MgmtMaster2,
{管理コード: "DX"},
{管理コード: "AX"}
);
powerfx
ClearCollect(
NestedTable,
Ungroup(
AddColumns(
AddColumns(
Ungroup(
AddColumns(
DeptMaster,
管理コード一覧,
MgmtMaster
),
管理コード一覧
),
結合コード,
部門コード & "_" & 管理コード
),
管理コード一覧2,
MgmtMaster2
),
管理コード一覧2
)
)
形が一緒なので、上からUngroup関数で追加した列管理コード一覧2を展開します。
エラーが発生した場合の対処法
ところが、先ほどとは異なりエラーとなることが確認できます。これはすでに管理コードという列がコレクションにあるためで、同じ名前の列を作成できないからです。MgmtMaster2 の列名を変更します。

ClearCollect(MgmtMaster2,
{管理コード2: "DX"},
{管理コード2: "AX"}
);
今回は直接列名を変更しますが、実際にはPowerFxのRenameColumns関数やDropColumns関数を使って、既存の列名を変更したり削除したりする方法がよいでしょう。
powerfx
// 列名を変更する場合
RenameColumns(元のコレクション, "管理コード", "管理コード1")
// 不要な列を削除する場合
DropColumns(元のコレクション, "管理コード")
正しく列が展開できているので、あとはAddColumns関数を使って、結合コード用に列を新たに作成するだけです。
今回は結合コード2という列を作成して、「部門コード_管理コード_管理コード2」となるようにテキストの連結をします。
最終的に以下のようなコードとなります。
powerfx
ClearCollect(
NestedTable,
AddColumns(
Ungroup(
AddColumns(
AddColumns(
Ungroup(
AddColumns(
DeptMaster,
管理コード一覧,
MgmtMaster
),
管理コード一覧
),
結合コード,
部門コード & "_" & 管理コード
),
管理コード一覧2,
MgmtMaster2
),
管理コード一覧2
),
結合コード2,
部門コード & "_" & 管理コード & "_" & 管理コード2
)
)
数式を実行してコレクションを更新し、結果を確認してみましょう。
正しく3つのコレクションを組み合わせた、8行分の結合コードが作成できていることが確認できます。

まとめ
このPowerFxのAddColumns関数とUngroup関数を組み合わせることで、コレクションの数に制限なく、複数のコレクションをクロス結合して、結合コードの作成を行うことが可能です。
Power Appsで複雑なマスターデータの組み合わせが必要な場面でも、この手法を使えばスマートに解決できるでしょう。ぜひ実際のアプリ開発でも試してみてください!



コメント