お久しぶりです、社内ITの萩原です。
最近、リモートワークを始めたのですが夏に入って電気代が3倍になってしまったので出社するか悩んでいます。
今回はPower Appsで複数条件でフィルターできる検索窓を作ったので、"検索"に焦点を当てた記事を書いていこうと思います。
データベース(DB)にはMicrosoft Dataverseを使用しているため、参照列も使用しています。
実際はDBから取ってくるデータの整形なので参照列の扱い方、Filter、searchなどの関数の参考にもなるかと思います。
ではいってみましょう!
1. 事前準備
まずは、今回使用するDBと画面のユーザーインターフェース(UI)を簡単に作っていきます。
テストデータとして、DBは案件情報を持つテーブルと企業情報をもつテーブルの2つを用意しました。
Dataverseでは、テーブル作成時にいくつかの列が自動で生成されますが実際に使用している列は以下の通りです。
案件内容テーブルの"referCompanyTable"列は参照型となっており、企業テーブルの"Id"列を基準にデータを取得できます。
次にUIですが、Power Appsを使用して簡単に複数条件の検索窓とそれによってフィルターされたレコードを表示するギャラリーを用意しました。
ギャラリーの使い方は割愛しますが、
案件一覧として、ギャラリー内に企業名、案件No、案件名、本社位置のテキストボックスを作成し、それぞれのTextの値に、データソース(DBの列)を指定しています。
ギャラリーのitemで指定したテーブルの列を指定する際は Thisitem.列 で指定することができますが、
参照列の場合、上の画像のように Thisitem.参照列.参照先の列 とすることで表示することができます。
いよいよここからフィルター機能を作っていきましょう~!!
補足
検索条件の手法には前方一致、後方一致、部分一致、完全一致と様々なものがあるため
シチュエーションによって使い分ける必要があります。
これらの手法を組み合わせることでユーザーが最も使いやすい検索機能を実現できます。
次の章からはそれらのPower Appsでの実装方法を説明していきます!
2. 前方一致
まずは前方一致です!
前方一致とは「そのキーワードから始まっているデータを探す」検索条件です。
例えば、”ラーメン二郎”なら「ラ」「ラー」「ラーメン」「ラーメン二」などであれば前方一致検索で出てきますが、「二郎」で検索しても出てきません!
前方一致検索を行う場合、ギャラリーのitemsに下図ようなコードを書くことで前方一致検索をすることができます。
ここで指定している”○○窓.Text”というのはUI上部の検索フィルターで配置してあるテキスト入力フィールドに入力された値になります。
実際にアプリを使って入力してみたものがこちらになります。
本社位置に「京」と入力した場合「東京」などのデータは表示されず「京都」のみになります。
このように前方一致はFilter(StartsWith())関数よって実現できます。
補足
Filter関数はFliter(テーブル, 条件1, 条件2, ...)として条件1 & 条件2を満たすものを表示するため、いくつかの窓に文字を入力した場合はそれらすべてを満たすデータのみが表示されます。
2. 後方一致
次に後方一致です!
後方一致は「そのキーワードで終わっているデータを探す」検索条件です。
例えば、”ラーメン二郎"なら「メン二郎」「二郎」「郎」などであれば後方一致検索で出てきますが
「ラーメン」で検索しても出てきません!
後方一致検索を行う場合は前方一致とあまり違わず、StartsWith関数の代わりにEndsWith関数を使うことで実現できます。
実際に入力してみたものがこちら
今度は”京”と入力しても「東京」のデータしか出てきません。
このように前方一致はFilter(EndsWith())関数よって実現できます。
4. 部分一致
次に部分一致です!
部分一致は「そのキーワードが含まれているデータを探す」検索条件です。
お馴染み”ラーメン二郎”で例えると「ラーメン」「メン」「二郎」などであれば出てきますが
「ラー郎」で検索しても出てきません!
これが一番使いやすいし、とりあえず部分一致使えばいいじゃん!と思う方もいらっしゃるかもしれませんが
逆に部分一致だけだと、「ラ」「ー」「メ」「ン」といったどの1文字を入力しても「ラーメン二郎」が出てきてしまうため例えば”目(メ)”の情報を検索したいときに二郎が出てくるといった問題があります。
そのため、各社が頑張って検索エンジンを作っているわけですね。
さて、前置きが長くなりましたが部分一致の実装です。
Power AppsにはもともとSearch関数が存在しており、部分一致の検索を簡単に行うことができます。
しかし今回は複数検索なのと参照列を使用しているため、少し工夫が必要になりますのでその理由を書いていこうと思います。
まず、Search関数ですがSearch(テーブル, キーワード,"列")と記述することで、テーブル内の指定した”列”の中でキーワードを含むレコードをすべて返してくれます。
このとき返り値はテーブル型になっていますので、
Search(Search(), キーワード, "列")と入れ子にしていけば複数検索にも対応することができます。
この時、参照列を使用する場合には注意が必要です。
本来、Power Appsでは参照列を使って参照先の列を選択したい場合「テーブル.参照列.参照先の列」と指定することでデータを取得できますが、Search関数を使用する場合、列名をダブルクオーテーションを使ってテキスト型で書かなければなりません。"テーブル.参照列.参照先の列"と書きたいところですが、テキストになってしまうためこのようには書けません。そのため、一度Addcolumns関数を使用して仮の列名を作り、その列に参照先の列を入れることで実現できます。
少し回り道ですが、仕様上仕方ないのかもしれません...
実際にアプリに入力してみると
”京”と入力すると「東京」と「京都」が両方出てきています。
下は見えないですが香川や島根などはフィルターされています。
また、部分一致の場合
Search関数ではなくFilter関数を使って書くこともできます。
こちらの場合はAddcolumn関数を使う必要もないため、とてもシンプルに書くことができます。
ただ、Search時には出ていなかった委任の警告が出ているためレコードや列数が多い場合には注意が必要です。
5. まとめ
最後にAND検索、OR検索などですが、
Spilit関数で文字を区切って、それぞれの文字について検索した結果を連結すれば難しくなく実装はできると思います。
ただ、Power Appsにはfor文がないため(for eachに該当するForAll関数はある)結構面倒な作業になることは予想できますね。
演算子自体はPower Appsでも他言語と同様に使用することができます。
長くなるので割愛しますがいずれ実装したらpart2として書くかもしれません。 #完全攻略とは
ただやはり実装してみて思ったのはFilter程度であれば実装できても、検索エンジンを作るのって相当大変なんだろうなっていうことです。
レコメンドとかpv数とか関連度とかでしっかりsort,filterされてますよね
いつもお世話になっております。
それでは