Power AppsのFilterテクニックの補足

## はじめに
 Microsoft Business Applications MVPでYouTube等で人気の[Reza Dorrani](https://www.rezadorrani.com/)による、Power AppsのFilterに関するチュートリアル動画、[PowerApps Multiple Filters on Gallery - YouTube](https://www.youtube.com/watch?v=5dSk5iOgT68)について、
 [03:45 - Filter on Choice column (single-select filter)](https://www.youtube.com/watch?v=5dSk5iOgT68&t=225s)
あたりのコンボボックスの設定で、何も選択されていない時にGalleryに全てのアイテムを表示するテクニックについて補足します。
<iframe width="560" height="560" src="https://www.youtube.com/embed/5dSk5iOgT68?start=225" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

### 前提
- 動画はデータベースをDataverseにしています。以下の私の説明はSharePointのリスト（Microsoft Lists）を使っています。
- DataverseとMicrosoft Listsでは、カラム名の指定の記載方法が微妙に違うことがあります（微修正すればOK）
- 委任の制限は以下考慮の対象外とします。

### テーブルの概要

図の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/35f5030e-6c79-baed-4747-6be69ba999ac.png)

### テキスト入力での検索
　まずは、[テキスト入力によって絞る部分](https://www.youtube.com/watch?v=5dSk5iOgT68&t=67s)です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/6ff370b7-a76a-ef69-15bb-71ed026fed05.png)

"OData__x30e1__x30e2_"は、リストの列名を最初、日本語名で作成した場合に内部名としてエンコードした文字列になっています。「メモ」の列名の内部名を確かめるには、Micrsofot Listsの右上のギアマーク > [リストの設定]から列名「メモ」を選択し、そのURLの**&Field=**で確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/21f36a61-010d-0dcd-3d34-092c765d6816.png)

### コンボボックスで未選択の場合にリスト全部を表示する
　さて、本題のコンボボックスについてです。ビフォーは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/b1392196-3ef8-fd52-2b16-ffa5261be715.png)
となっているところのテーブル名「'YouTube タイムスタンプ'」

```:ビフォー
    'YouTube タイムスタンプ',
```
をアフターとして、Filter関数に書き換えます。

```:アフター
    Filter(
        'YouTube タイムスタンプ',
        IsBlank(cbGroupFilter.Selected.Value) || IsEmpty(cbGroupFilter.SelectedItems) || グループ.Value = cbGroupFilter.Selected.Value
    ),
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/cea3e66b-5602-91c6-d109-7785aba48ddc.png)

```:テキストではこちら
Search(
    Filter(
        'YouTube タイムスタンプ',
        IsBlank(cbGroupFilter.Selected.Value) || IsEmpty(cbGroupFilter.SelectedItems) || グループ.Value = cbGroupFilter.Selected.Value
    ),
    txtNameFilter.Text,
    "OData__x30e1__x30e2_"
)
```

### Filterの3つの評価される数式の3つめ

Docsの説明では

Filter(Table*, Formula1 [, Formula2, ... ] )

のFormula1です。3つの式が **または（||）**で並んでいます。3つめが一番わかりやすいですね。

グループ.Value = cbGroupFilter.Selected.Value

のように、リストの列名がコンボボックスで選択されたものと一致した場合です。ではもし、この3つめのみだったら、どのような結果になるでしょうか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/1d680776-f86e-b852-6f4b-245b2a5c86ff.png)

Galleryの結果に注目してください。1行目、2行目にあった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/aa4226b5-73ad-a589-7f67-a39d13888b39.png)

がリストされていません。

```:3つめの数式のみの場合
    グループ.Value = cbGroupFilter.Selected.Value
```
で、コンボボックスではまだ何も選ばれていない（=空の文字列）なので、1行目、2行目は除外され、列名「グループ」が空のものだけが表示されている状態です。

このようなことがあるので、未選択の場合に、全部を表示するために、1つめと2つめの数式の処理を**または***で入れておきます。

### 1つめの数式　IsBlank
```:1つめの数式のみの場合
    IsBlank(cbGroupFilter.Selected.Value)
```
cbGroupFilter.Selected.Valueは、3つめと同じですね。要は、コンボボックスで1つも選ばれていなくて値が空の文字列になっている場合や、もし、コンボボックスの選択肢に空の文字列がある場合、IsBlankの評価結果はTrueになるので、結果として全部のアイテムが表示されます。

### 2つめの数式 IsEmpty
```:2つめの数式のみの場合
    IsEmpty(cbGroupFilter.SelectedItems)
```

IsEmptyは、テーブルにレコードが含まれているかどうか（Cowntrowsの結果が0かどうか）を調べていて、0ならばTrueで結果として全行でます。コンボボックスの選択をしていなければ0ですから、結果はTrueになり、こちらも1つめと同じ結果として全部のアイテムが表示されます。

以上の3つ数式が**または**の**||**で並んでいるので、コンボボックスが未選択の初期状態では確実に全部のリストを表示する、というわけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/6fb92df3-89b9-8d24-3e7f-18a697d029b3.png)


### 使用した関数
- Filter [Power Apps での Filter、Search、および LookUp 関数 - Power Apps | Microsoft Docs](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-filter-lookup?WT.mc_id=DP-MVP-5004418)
- Search 同上
- IsBlank [Power Apps での Blank、Coalesce、IsBlank、および IsEmpty 関数 - Power Apps | Microsoft Docs](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-isblank-isempty?WT.mc_id=DP-MVP-5004418)
- IsEmpty 同上

### （関連事項）委任（Delegation）に関して
　今回の説明の範囲外ですが、動画の中には[委任の話がでてきます](https://www.youtube.com/watch?v=5dSk5iOgT68&t=150s)。委任については、以下のDocsや有用なブログ等をご覧ください。
 - [キャンバス アプリでの委任について - Power Apps | Microsoft Docs](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/delegation-overview?WT.mc_id=DP-MVP-5004418)
 - [SharePoint の機能と操作 - Power Apps  | Microsoft Docs](https://docs.microsoft.com/ja-jp/connectors/sharepointonline/#power-apps-delegable-functions-and-operations-for-sharepoint?WT.mc_id=DP-MVP-5004418)
 - [Dataverse の機能と操作 - Power Apps | Microsoft Docs](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/connections/connection-common-data-service#power-apps-delegable-functions-and-operations-for-dataverse?WT.mc_id=DP-MVP-5004418)
 - [PowerApps 委任とデータ行の制限（500件～2000件）の関係を図にまとめてみた](https://ippu-biz.com/development/powerplatform/powerapps/delegation003/)
 - [PowerApps SharePointリストに対して委任できる操作を色々調べてみた | 仕事のあれこれ](https://ippu-biz.com/development/powerplatform/powerapps/delgate001/)
 - [【ほぼ不要になりました】PowerAppsで遭遇する５つの委任問題とちょっと強引な回避方法（SharePointリスト利用時）その１ - Qiita](https://qiita.com/KodamaJn/items/4341865e6784847a005d)


## おわりに
　理解が浅く、なかなか行動が遅かった、Power AppsのFilter関係について、この動画の理解でだいぶスッキリ感がでてきました～ 
今回は対象外ですが、委任の考え方も大事ですね～