業務改善と標準化を同時に実現:MS 365業務システム開発

PowerAppsのコンボボックスの選択値の取得/既定値の設定、完全攻略(「DefaultSelectedItems」属性)

    
PowerAppsのコンボボックスの選択値の取得/既定値の設定、完全攻略(「DefaultSelectedItems」属性)
\ この記事を共有 /
PowerAppsのコンボボックスの選択値の取得/既定値の設定、完全攻略...

PowerAppsのコンボボックスを使う上での、選択値の取得や既定値の設定の仕方など皆さんが持っている問題に対する解決策を提示しています。

(動画時間:9:02)

Udemy.comでオンラインコースを運営しています。
マイクロソフトPowerApps 中級編【SharePointで、実務で使える業務アプリの作り方:勤怠管理アプリ編】
⇒ 半額になる「ディスカウントリンクページ」へ


コンボボックスとドロップダウンの本質的な違いとは?

こんにちは、リーンシグマブラックベルトのマイク根上です。
業務改善コンサルをしています。

以前からPowerAppsのコンボボックスについての質問を多く頂きます。
そこで今回はコンボボックスの色んな問題の解決策の検証をしたいと思います。

コンボボックスの基本については以前動画を
作りましたので次のリンクからご覧下さい。
⇒「ドロップダウンコントロールの使い方とコンボボックスとの違い(Distinct関数、Sort関数)」

今日はもうちょっと上級的な内容になり、
最後に皆が困っている既定値の設定の仕方もお話します。

アプリユーザーが情報を入力する時に可能であれば
選択肢から選んだ方が操作性が向上しますね。
この時にドロップダウンとコンボボックスがあり、
まずは簡単にその二つの違いを整理してみます。

PowerApps ユーザー管理画面のコンボボックス

上の画面は前回の動画でご紹介した
アプリの「ユーザー管理画面」です。
ここの所属部署ではドロップダウンを使っていて
承認担当部署ではコンボボックスを使っています。

まず、コンボボックスでは
ユーザーは複数の値を選択できます。
その時は「複数選択の許可」属性を「オン」にします。

それに対してドロップダウンはいつも一つしか選べません。

次に、コンボボックスは選択肢にない
ユーザーの任意の値を入力できます。
その時に「検索の許可」属性を「オン」にして下さい。

それに対してドロップダウンは選択肢以外は入力できません。

最後にコンボボックスでは選択肢内の値の検索ができます。
これはさっきの「検索の許可」属性を「オン」にしてればそれができます。

ここで注意しなければいけないのは
検索はできる様に「検索の許可」を「オン」にし、
同時に任意の値の追加はできない様にする事は、できないという事です。

一方、ドロップダウンには選択肢の検索ができるオプションはありません。

こう見ますと、コンボボックスで
「複数選択の許可」と「検索の許可」を両方とも「オフ」にすれば
ドロップダウンと全く同じ機能になる事が分かります。

それならば「ドロップダウンは要らないじゃないか」と思いますよね。
しかし、コンボボックスは多機能な分扱いが難しいので、
複数選択と値の検索機能が要らないのであれば、
ドロップダウンを使うのをお勧めします。

これで今回の二つのコントロールの使い分けの仕方が分かりました。
次はそれらの選択肢の値の登録の仕方ですが、
両方とも「Items」属性で設定し、
全く同じ様に行えるので今回はその説明は割愛します。

コンボボックスとドロップダウンで選択された値の取得の仕方

違いが出てくるのはそれらの選択された値の取得の仕方です。
これを理解する事でこの後の既定値の設定の仕方も分かり易くなります。

まず同じギャラリー内にテキストラベルを二枚追加します。
一枚目の「Text」属性にドロップダウン名と「.Selected」を付けます。
これではレコード型なので、
その中のどの列の値を取得したいかを指定します。
すると、ちゃんと選択値が出てきます。

テキストラベルの「Text」属性
=DD_所属部署2.Selected.Department

次にコンボボックスですが、
同じ様にその名前と「.Selected.列名」でエラーが無くできましたが、
複数選択の内一つしか出ていません。

テキストラベルの「Text」属性
=CB_承認担当部署2.Selected.Department

結論から言うと「.Selected」ではなく
「.SelectedItems」で複数値を取得できます。
しかしラベルではテキスト型の値しか取得できないので、
メニューバーの「挿入」、「入力」からリストボックスを追加し、
その「Items」属性に同じ式を入れます。

リストボックスの「Items」属性
=CB_承認担当部署2.SelectedItems.Department

するとちゃんと選択値が全て取得できるのが分かります。

しかし、ここで一つ問題があります。
コンボボックスに任意の値を入れた時にそれが反映しません。
「.SelectedItems」では取得できず、
それは「.SearchText」属性で取得できるのです。

今回の僕のアプリでは保存ボタンの「OnSelect」属性のPatch関数内で
次の式でコンボボックスの結果を取得しています。

保存ボタンの「OnSelect」属性
=Concat(
  CB_承認担当部署2.SelectedItems,
  Department,
  ”;”
) & If(IsBlank(CB_承認担当部署2.SearchText),
  ””,
  ”;” & CB_承認担当部署2.SearchText
)

ここでやっている事はConcat関数を使って
半角の「;(セミコロン)」を区切文字として全選択値を繋げて、
最後に任意の値が入力されていた時にそれを追加する様にして
一つのテキスト値にしています。
そして、それをデータベースの一つのセルに入れています。

コンボボックスの既定値を正しく出力する方法

次は、データソースに保存されている値を
コンボボックスの既定値として出力する方法です。

ドロップダウンでは「Default」属性を使います。
コンボボックスも「Default」属性があるのですがそれは使えません。
「DefaultSelectedItems」属性を使います。

「Default」属性ではデータ型はテキスト型です。
それに対してコンボボックスは複数の値を取得できるので
テキスト型ではなく、テーブル型が必要で
「DefaultSelectedItems」属性を使うのです。

その数式がこれです:

コンボボックスの「DefaultSelectedItems」属性1
=Split(
  ThisItem.Dep_In_Charge,
  ”;”
)

さっき使ったConcat関数の真逆の働きをする
Split関数で同じ区切り文字でさっきのテキストをテーブル型に戻して、
既定値として使えるのです。
ちなみに先ほどの保存先が「Dep_In_Charge(承認担当部署)」列なのです。

しかしですね、この数式では実は問題があります。
既定値としてコンボボックスには表示されているのですが、
「SelectedItems」属性にはそれが反映されず、
リストボックスが空白になります。

ですから選択肢を変更せずに保存をし直すと
空白が保存されてしまうという大きな問題があるのです。

まず次の式の様に「Items」属性で
「K01Tbl_Departments(部署データベース)」から
部署名を持ってきてるのをご留意下さい。

コンボボックスの「Items」属性
=SortByColumns(
  Filter(
    K01Tbl_Departments,
    IsActive = “Y”
  ),”Department”
)

しかし「DefaultSelectedItems」属性の式では
「ThisItem」を使っていますが、
これは部署データベースと関係ありません。

そこでその式を次の式に変えます。

コンボボックスの「DefaultSelectedItems」属性2
=Filter(
  K01Tbl_Departments,
  Department in ThisItem.Dep_In_Charge
)

この式を使う事でその二つの属性が繋がり、
「SelectedItems」属性がちゃんと使える様になるのです。
同じデータソースと繋げて関係性を持たせる事が必要なのです。

最後にもう一つ問題ですが、さっきの二つ目の式にしたら、
任意で入力した値が出てこなくなりました。
これはその値が部署データベースに無いからです。

ですからギャラリーの保存ボタンに任意の入力があった時に
Patch関数で部署データベースにそれを保存する式を加える必要があります。

それをすれば全て完了です。

今回の内容はちょっと複雑でしたが、
コンボボックスを使う時には
複数の選択値を扱うという事とそのデータ型を考慮する事で、
なぜ今回の様な対応をしなくてはならないかが分かってくると思います。

「こちらの記事も読まれてます。」