見出し画像

PowerApps Filter検索 目から鱗だった話②

DatePickerはFilter検索できたけれど、ドロップダウンリストやチェックボックスでFilterしたい場合もありますので、記事にいたします。

イメージ1
イメージ2

ドロップダウンリストでのフィルター

DatePickerはitemsプロパティが無く、カレンダーが表示され選択できるようになっておりますが、ドロップダウンリストの場合は、選択肢となる項目をitemsプロパティに設定しなければなりません😥

イメージ3

ドロップダウンでは過去のレコードから選択するという方法を取りました。
Itemsプロパティは下記のように記載しております😌

Distinct(レコーディング,登録者.DisplayName)

Distinct関数は重複を排除したユニークな値になります😌

また、未選択の場合は空白にしたいので下記のようにいたしました😌
・AllowEmptySelectionプロパティはtrue
・Defaultプロパティは""

ドロップダウンリストのItemsプロパティ、AllowEmptySelectionプロパティ、Defaultプロパティはaliceさんの記事を勉強させていただき設定することができました🙇‍♂️🙇‍♂️🙇‍♂️

肝心のギャラリーのItemsプロパティのFilterです。
ここも下記の記載のようにドロップダウンの選択値が未入力の場合は
フィルターしないようにできました。

IsBlank(drpRegisterName.Selected) ||
登録者.DisplayName = drpRegisterName.Selected.Value

前の記事のDatePickerを合わせて記載するとこのようになります。
Filterの外で検索してどうしようかと考えていたモヤモヤがすっきり✨
実にシンプルです。

Filter(
レコーディング,
      //日付
      IsBlank(dteRecordingDateStart.SelectedDate) ||
      日にち >=dteRecordingDateStart.SelectedDate,
      IsBlank(dteRecordingDateEnd.SelectedDate) ||
      日にち <=dteRecordingDateEnd.SelectedDate,
      IsBlank(drpRegisterName.Selected) ||
      //登録者
      登録者.DisplayName = drpRegisterName.Selected.Value
)

記事にはしていませんが、コンボボックス、ラジオボタンでも同じ要領で
Filter処理を作成することができました🙇‍♂️🙇‍♂️🙇‍♂️

日付の選択コントロールやドロップダウンリストの場合は、未入力の場合は空白でFilterされてしまうと、抽出されなくなってしまうため、選択値が空白の場合は、IsBlank(コントロール.Selected)|| としてフィルターなしで返却されます。

ヨウセイさんの記事に、とても詳しく記載くださってます。

チェックボックスでのFilter

迷ったのはチェックボックスです。

イメージ4

チェックボックスは、当たり前ですがチェックされていないか、されているかの2択です。

日付の選択コントロールやドロップダウンの場合は、入力されていない場合は空白でフィルターしないで全部返却する仕様にしましたが、チェックボックスについては、迷いました。

気分というSPOリストの選択肢の値5つを、コントロールとしてオン、オフの2択で切り替えるからです。
なので、ここは下記のようにどれかのチェックに合致したらというように
いたしました。

Or(
   And(chkFeelingVeryGood.Value=true,気分.Value="とても良い"),
   And(chkFeelingGood.Value=true, 気分.Value="良い"),
   And(chkFeelingNormal.Value=true, 気分.Value="中間"),
   And(chkFeelingWorse.Value=true, 気分.Value="悪い"),
   And(chkFeelingVeryWorse.Value=true, 気分.Value="とても悪い")
)

下記検索フォームのギャラリーのItemsプロパティは下記のとおりになりました。

イメージ5
Filter(
レコーディング,
//日付
IsBlank(dteRecordingDateStart.SelectedDate) || 日にち >=dteRecordingDateStart.SelectedDate,
IsBlank(dteRecordingDateEnd.SelectedDate) || 日にち <=dteRecordingDateEnd.SelectedDate,
IsBlank(drpRegisterName.Selected) || 登録者.DisplayName = drpRegisterName.Selected.Value,
//朝散歩、飲酒、運動
Or(And(chkMorningWalk.Value=true,朝散歩=1),
And(chkDrinking.Value=true,飲酒=1),
And(chkMotioning.Value=true,運動=1)),
//気分
Or(
And(chkFeelingVeryGood.Value=true,気分.Value="とても良い"),
And(chkFeelingGood.Value=true, 気分.Value="良い"),
And(chkFeelingNormal.Value=true, 気分.Value="中間"),
And(chkFeelingWorse.Value=true , 気分.Value="悪い"),
And(chkFeelingVeryWorse.Value=true , 気分.Value="とても悪い"))
)

朝散歩=1、飲酒=1、運動=1とありますが、朝散歩、飲酒、運動はSPOのはいいいえ列です。
なぜ、朝散歩=true、飲酒=true、運動=trueとしないのかは
複数条件では false しか上手く評価されないからです。

実際、朝散歩=trueとしたところ動作しませんでした。
おかしいと思ってGoogleで調べてみたところ上記の記事にいきつきました。
Microsoft関連で疑問に思ったときにidea.toString();のOOTAさんの記事に助けられていることが多いです。
すみません。どうお呼びして良いか分からず。OOTAさんとしております🙇‍♂️🙇‍♂️🙇‍♂️

仕事ではもっと込み入った検索フォームを作らざるを得なかったのですが皆様のおかげで大変勉強になりました。

次回はFilterを行う際に気を付けた5,000件の問題について
記事にしたいと思います。

この記事が気に入ったらサポートをしてみませんか?