Power Appsで複数のマスターデータを組み合わせて結合キーを作りたい時はありませんか?

Power Apps
この記事は約7分で読めます。

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で複雑なマスターデータの組み合わせが必要な場面でも、この手法を使えばスマートに解決できるでしょう。ぜひ実際のアプリ開発でも試してみてください!

コメント

タイトルとURLをコピーしました