17
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ungroup + Table = UNION (ALL) (はもう過去の話)

Last updated at Posted at 2020-01-03

[2024/4/3更新: Table関数のアップデートを反映]

UNION ALL

PowerAppsではUNION操作は提供されていません。
UNION (ALL)とは・・・

UNIONALL
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関数を利用することで実現できます。

準備

まずは2つのCollectionを考えます。
image.png

Collect(C,A,B)

この2つのCollectionを統合する方法はいくつもあります。
例えば何らかのイベントによって、Collectionを生成するのであれば、以下のような方法がよく知られています。

ClearCollect(UniCol, Col1,Col2)

この結果生成されるUniColは、Col1Col2を統合した結果、すなわち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プロパティに設定すればよいです。

Gallery.Items
Table(Col1, Col2)

とても簡単ですね。

[2024/4/3更新] 以下はすでに不要な操作です。覚えておいても損はないけど。

Gallery.Items
Ungroup(
 Table(
  {TableName:Col1}, {TableName:Col2}
 ), "TableName"
)

Table関数は複数のレコードからTableを生成する関数で、もちろん結果はTable型になります。
Ungroupは、グループ化された列を含むテーブルのグループ化を解く関数で、例えば以下のような操作に対応します。
image.png

これを踏まえると、Ungroup+Tableの方法はちょうど、以下のような操作をしていることになります。
image.png
つまり、複数のCollectionまたはデータ取得結果を、Tableの1つの列にネストした形で挿入し、それをUngroupで解くことで、データを統合しているということです。

繰り返しですが、これをギャラリーやデータテーブルに直接設定することができます。ですので、片方のCollectionにアイテムを追加するたびに、統合したCollectionを作りなおすというコストはありません。

Revisit Multiple Datasource

単一のリストから、複数の条件で結果を抽出したい場合(カテゴリーでのフィルター等)には、Filter内の条件式にOr関数を使えば、多くの場合期待される結果を取得できます。
一方で、複数のリストから結果を取得し、表示したいような場合には、単純ではありません。
image.png
もちろん、結果の足し算はできません。

例として、Opportunityという名前のリストと、Opportunity Archiveという名前のリストから、特定の条件でフィルターして、データを統合表示するような場合を考えます。
image.png

この場合の表示条件は、OpportunityはステータスがCloseのアイテムのみ、Archive側はすべてのアイテムとします。
また、年度がわかるように、すべてのアイテムでFYを表示することにします。

この時、データテーブルのItemsプロパティは以下のようにかけます。

DataTable.Items
Ungroup(
    Table(
        {TableName:AddColumns(Filter(Opportunity,Status.Value="Close"),"FY",2020)},
        {TableName:'Opportunity Archive'}
        ),
    "TableName"
)

image.png

最初のリスト部分で少しデータ操作をしていますが、基本はCollectionの場合と同様です。

ここでは2つのリストの統合をしていますが、3つ以上でも同様ですので、試してみてください。

おわりに

今回はPowerAppsの枠組みの中で、UNION ALLと同等の操作を行う方法を紹介しました。
このほかにも、INNER JOINであったり、OUTER JOINと同等の操作をPower Appsで行うこともできますので、ぜひ挑戦してみてください!

ヒントはこのツイートのスレッドにあります👇

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")

このように書けます。

17
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?