Power Apps で検索を実装するときはStartWith関数を併せて使おう

## サンプルアプリ
ユーザーが起票したレコードを後から条件検索・ソートできるようなアプリを用意しています。
レコード検索を行うシナリオのアプリであればなんでも結構です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/a274bf6d-57e1-22ad-4e07-dee547e5b4ce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/eb3469d4-bf05-4fc4-9cdc-cdbecee34be4.png)



## まずはStartWith 関数なしで実装してみる
ユーザーの起票（'5Sパトロール'という名称のテーブル）を＜実施工場＞と＜ステータス＞の２つの条件でフィルターしてみます。関数はこんな感じです。
（追加で※昇順/降順を切り替えるためのSort関数と変数（SortOrderVariable）を指定しています）
```javascript
Sort(
    Filter(
        '5Sパトロール',
        And(
            実施工場.Name = Dropdown2.Selected.Value,        
            Text('ステータス (new_statuscustom)') = Dropdown2_1.Selected.Value
        )   
    ),
    Name,SortOrderVariable
)
```
実際にフィルタをかけてみると、無事＜A工場＞の＜対応中＞のレコードだけがフィルタリングされてきました。ただし実際に利用するには１つ問題があります。工場もステータスも指定なしで全てのレコードを抽出してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/3b1befbe-88de-d3da-2f07-27ec61d70e53.png)

すると、該当レコードが０件になりました。条件を指定していないのに該当レコードが０件とはどういうことでしょうか？

これは、Filter関数内の条件において＜工場＞と＜ステータス＞の条件として"空白値"が指定されている状態になっているためです。つまり、＜工場＞と＜ステータス＞に何らかの値が入っている時点でレコードがヒットしないことになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/e915eb55-f966-4eb5-8d30-fef91a1a15f5.png)

## ヒットさせるために、IsBlank()で分岐させると関数が複雑になる
では、"値指定なし"の条件をせっていするにはどうすればいいでしょうか？
１つの手段としてISBlank関数を使ってフィルタパターンを分けることができます。後述しますが、この実装方法は関数が非常に煩雑になるため推奨されません。

例えば今回のケースだと、
・＜工場＞と＜ステータス＞が指定されている場合 ➡＜工場＞と＜ステータス＞でフィルタする
・＜工場＞の条件が空白値の場合 ➡ ＜ステータス＞のみでフィルタする
・＜ステータス＞の条件が空白値の場合 ➡ ＜工場＞のみでフィルタする
・＜工場＞も＜ステータス＞も空白値の場合 ➡ すべてのレコードを表示する
のように先に条件の指定あり/なしを判断したうえで該当のフィルタロジックをかけるというものです。

実際に関数を書いてみるとこのようになります。
（上記の条件のうち１つだけ記述してみましたが、関数のネストを繰り返してこれをもう３つ作ることになります。）

```javascript
Sort(
    If(
        And(
            !IsBlank(Dropdown2.Selected.Value),
            !IsBlank(Dropdown2_1.Selected.Value)
        ),
        Filter(
            '5Sパトロール',
            And(
                実施工場.Name = Dropdown2.Selected.Value,
                Text('ステータス (new_statuscustom)') = Dropdown2_1.Selected.Value
            )
        ),
        If(
            IsBlank(Dropdown2.Selected.Value) && !IsBlank(Dropdown2_1.Selected.Value),
            Filter(
                '5Sパトロール',
                Text('ステータス (new_statuscustom)') = Dropdown2_1.Selected.Value
            ),
            If(
                !IsBlank(Dropdown2.Selected.Value) && IsBlank(Dropdown2_1.Selected.Value),
                Filter(
                    '5Sパトロール',
                    実施工場.Name = Dropdown2.Selected.Value
                ),
                '5Sパトロール'
            )
        )
    ),
    Name, SortOrderVariable
);
   
```

たった２つの検索条件だけでこれだけ複雑な関数になってしまいます。
これをStartWith関数を使うことで大幅に短くできます。


## StartWithを使うと関数を大幅に短くできる

StartWith関数はFilter関数内での一致条件として利用します。
本来の関数の利用用途は文字通り前方一致のロジックチェックですが、これを検索ロジックに用いることで
「条件が空白」➡「空白ではじまる」➡　実質「指定なし」という検索ロジックとして代用できます。

```javascript
Sort(
    Filter(
        '5Sパトロール',
        StartsWith(
            実施工場.Name,
            Dropdown2.Selected.Value
        ),
        StartsWith(
            Text('ステータス (new_statuscustom)'),
            Dropdown2_1.Selected.Value
        )
    ),
    Name,SortOrderVariable
)
```

これで、条件を指定していないときにはその条件を実質「指定なし」として用いることが可能になりました。キャンバスアプリで複雑になりやすい検索ロジックの関数ですが、適切な関数を組み合わせて効率よく記述していきましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392887/90162458-634a-83c4-57f5-cc5a150987e8.png)