[2024/4/3更新: Table関数のアップデートを反映]
UNION ALL
PowerAppsではUNION操作は提供されていません。
UNION (ALL)とは・・・
select * from number_table where num in (1,2,3)
UNION ALL
select * from number_table where num in (3,4,5)
この結果は、{1,2,3,3,4,5}を返します。つまり重複を排除しない、2つ以上のクエリの統合処理です。
Power Appsでは、このような関数は提供されていませんが、既存の2つの関数、Ungroup関数とTable関数を利用することで、同等の処理ができましたので、ご紹介します。
[2024/4/3更新]
Power Appsではこの操作は Table関数を利用することで実現できます。
準備
Collect(C,A,B)
この2つのCollectionを統合する方法はいくつもあります。
例えば何らかのイベントによって、Collectionを生成するのであれば、以下のような方法がよく知られています。
ClearCollect(UniCol, Col1,Col2)
この結果生成されるUniColは、Col1とCol2を統合した結果、すなわちName={"AAAAAA","BBBBBB","CCC","DDD"}とそれに対応する他の列からなるCollectionとなります。
Collectionを生成してもよい場合、または、Collectionを生成する明確なイベントが存在する場合には、この操作で充分です。
反対に、Collectionを生成するイベントが明確になく、ギャラリーやデータテーブルに統合した結果を表示したい場合には、ここで紹介するUngroup+Tableの組み合わせが有効になります。
(実際、Collectionを生成すると、そのCollectionをどのタイミングで更新するか/破棄するかという課題が発生します)
Multiple Datasource
複数のデータソースが存在する場合、例えば2つ以上のSharePointリストに(部分的に)同じ列をもつデータが存在し、データを統合して表示したい場合にもUngroup+Tableが有効です。
例えば、現在の案件のリストとArchiveの案件のリストが分かれていた場合、その2つのデータを合算するようなシーンで利用できます。
UNION ALL = Ungroup+Table (だったけど今はTable)
再び2つのCollection - Col1, Col2を考えます。この2つのCollectionを統合した結果を、例えばギャラリーに表示する場合には以下のような数式をItemsプロパティに設定すればよいです。
Table(Col1, Col2)
とても簡単ですね。
[2024/4/3更新] 以下はすでに不要な操作です。覚えておいても損はないけど。
Ungroup(
Table(
{TableName:Col1}, {TableName:Col2}
), "TableName"
)
Table関数は複数のレコードからTableを生成する関数で、もちろん結果はTable型になります。
Ungroupは、グループ化された列を含むテーブルのグループ化を解く関数で、例えば以下のような操作に対応します。
これを踏まえると、Ungroup+Tableの方法はちょうど、以下のような操作をしていることになります。
つまり、複数のCollectionまたはデータ取得結果を、Tableの1つの列にネストした形で挿入し、それをUngroupで解くことで、データを統合しているということです。
繰り返しですが、これをギャラリーやデータテーブルに直接設定することができます。ですので、片方のCollectionにアイテムを追加するたびに、統合したCollectionを作りなおすというコストはありません。
Revisit Multiple Datasource
単一のリストから、複数の条件で結果を抽出したい場合(カテゴリーでのフィルター等)には、Filter内の条件式にOr関数を使えば、多くの場合期待される結果を取得できます。
一方で、複数のリストから結果を取得し、表示したいような場合には、単純ではありません。
もちろん、結果の足し算はできません。
例として、Opportunityという名前のリストと、Opportunity Archiveという名前のリストから、特定の条件でフィルターして、データを統合表示するような場合を考えます。
この場合の表示条件は、OpportunityはステータスがCloseのアイテムのみ、Archive側はすべてのアイテムとします。
また、年度がわかるように、すべてのアイテムでFYを表示することにします。
この時、データテーブルのItemsプロパティは以下のようにかけます。
Ungroup(
Table(
{TableName:AddColumns(Filter(Opportunity,Status.Value="Close"),"FY",2020)},
{TableName:'Opportunity Archive'}
),
"TableName"
)
最初のリスト部分で少しデータ操作をしていますが、基本はCollectionの場合と同様です。
ここでは2つのリストの統合をしていますが、3つ以上でも同様ですので、試してみてください。
おわりに
今回はPowerAppsの枠組みの中で、UNION ALLと同等の操作を行う方法を紹介しました。
このほかにも、INNER JOINであったり、OUTER JOINと同等の操作をPower Appsで行うこともできますので、ぜひ挑戦してみてください!
ヒントはこのツイートのスレッドにあります👇
Did you know the Union operation in #PowerApps ?
— Hiro (@mofumofu_dance) January 2, 2020
↓↓ pic.twitter.com/FAkwJpPezn
CROSS JOIN
例えば単純なテーブルの外積であれば、
Num |
---|
1 |
2 |
3 |
4 |
5 |
6 |
と |
Alp |
---|
A |
B |
C |
D |
の外積は |
Ungroup(
AddColumns(
Table({Num:1},{Num:2},{Num:3},{Num:4},{Num:5},{Num:6}),
"AddTable",
Table({Alp:"A"},{Alp:"B"},{Alp:"C"},{Alp:"D"})),"AddTable")
このように書けます。