【Power Apps】ドロップダウン選択肢で取得データを動的に変化させる

## はじめに
とあるアプリのデータ一覧表示において、「ドロップダウンの選択によりデータを動的に並び替える」という機能を実装したので、個人的な備忘録として残しておきます。また、よくある委任警告の回避方法や、効率的なデータ処理についても整理します。

## 実装
今回は、Qiitaの投稿データを「ページビュー数、いいね数、ストック数」の3つの選択肢から動的に並び替えます。

具体的には、Qiita（Dataverse）のデータを、ドロップダウンで選択された値に応じて page_views_count（ページビュー数）、likes_count（いいね数）、stocks_count（ストック数）で並び替えます。

![Qiita管理アプリ-Power-Apps-Google-Chrome-2024-06-25-13-18-08-_online-video-cutter.com_-_2_.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/e5f48321-54b1-00ac-a2f0-55739ee897f9.gif)


#### ドロップダウンの設定
まずは、ドロップダウンを挿入して、Itemプロパティを ``["ページビュー数","いいね数","ストック数"]`` に設定します。 これにより、「ページビュー数、いいね数、ストック数」の3つをドロップダウンから選択できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/6e47ba02-37ca-c99a-0ade-ba05c83f119d.png)

#### 動的な並び替えギャラリーの設定
次に、ギャラリーを挿入して、Itemsプロパティに以下の式を設定します。この式では、ドロップダウンで選択された値に応じて、特定の列で並び替えたデータを取得します。

※必要に応じてギャラリー内に表示する内容（並び替えの列など）を設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/7668ea49-78dc-3321-682d-c7c5f833e845.png)

``` Gallery.Items
Switch(
    Dropdown1.Selected.Value,
    "ページビュー数",
    Sort(
        Qiita, 
        page_views_count,
        SortOrder.Descending
    ),
    "いいね数",
    Sort(
        Qiita,
        likes_count,
        SortOrder.Descending
    ),
    "ストック数",
    Sort(
        Qiita,
        stocks_count,
        SortOrder.Descending
    )
    /* "新たな条件", 新たなソート処理 */
)
```

## 委任警告の回避
先ほどの式はソート処理が重複しているためコードが簡潔でなく、また、ドロップダウンの選択肢を増やすときにソート処理全体を追加する必要があるため拡張性に乏しいです。

そこで、以下のようにソート処理の中にスイッチ処理を書くことでコードをすっきりさせることができます。新たな条件を追加する場合もスイッチの条件を書き換えるだけで済みます。
 
``` Gallery.Items: 簡潔なコード
Sort(
    Qiita, 
    Switch(
        Dropdown1.Selected.Value,
        "ページビュー数", page_views_count,
        "いいね数", likes_count,
        "ストック数", stocks_count
        /* "新たな条件", 新たな列 */
    ),
    SortOrder.Descending
)
```

::: note warn
しかし、この式をこのまま実装すると**委任に関する警告が出ます**。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/e945acf2-fcb8-e865-5ddd-6939344af751.png)

::: note info
そこで、**一度データソースを変数に格納してから使用する**ことでこの警告を回避することができます。
:::

例えば、アプリの初期起動（AppオブジェクトのOnStartプロパティ）や画面の読み込み（ScreenオブジェクトのOnVisibleプロパティ）のタイミングで変数に格納する、またはそれぞれの処理タイミングで以下のようにWith関数を用いる方法などがあります。

``` Gallert.Items: 委任警告を回避するコード
With({キータ:Qiita},
    Sort(
        キータ, 
        Switch(
            Dropdown2.Selected.Value,
            "ページビュー数", page_views_count,
            "いいね数", likes_count,
            "ストック数", stocks_count
            /* "新たな条件", 新たな列 */
        ),
        SortOrder.Descending
    )
)
```


## 効率的なデータ整理
データが時系列で変化せず、一度アプリでデータをロードした後にその内容が更新されない場合は、事前に並び替えしたデータを保持しておく方法が効果的です。これにより、ドロップダウンを切り替えるたびにデータを並び替える必要がなくなり、操作のレスポンスが向上します。

具体的には、AppオブジェクトのOnStartプロパティに以下の式を書くことで、初期起動のタイミングでデータを定義、保持することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/e58b2e84-85ff-ab99-e3d5-c815fcb3f04e.png)

``` App.OnStart
ClearCollect(
    colページビュー数,
    Sort(
        Qiita,
        page_views_count,
        SortOrder.Descending
    )
);
ClearCollect(
    colいいね数,
    Sort(
        Qiita,
        likes_count,
        SortOrder.Descending
    )
);
ClearCollect(
    colストック数,
    Sort(
        Qiita,
        stocks_count,
        SortOrder.Descending
    )
)
```

ギャラリーのItemsプロパティでは、スイッチ処理の条件に合わせて保持している並び替えたデータを切り替えるよう設定します。

``` Gallery.Items
Switch(
    Dropdown1.Selected.Value,
    "ページビュー数", colページビュー数,
    "いいね数", colいいね数,
    "ストック数", colストック数
)
```

## おわりに
今回は、ドロップダウンでデータを動的に並び替える方法と、関連するちょっとしたテクニックについて紹介しました。この記事は並び替えをベースとしたためSort関数を用いた実装となりますが、もちろん動的な絞り込み、Filter関数を用いた実装などにも応用できるので、ぜひ参考にしてみてください。この記事が皆さんの問題解決に繋がればうれしいです。