【Power Apps】データ操作の関数について②　～ Patch Remove RemoveIf ClearCollect～

## はじめに
この記事ではPower Appsのアプリ内におけるデータ操作に関する関数について解説していきます。
データの読み込みや更新、削除においてデータの抽出方法はどの関数が最適か説明していきます。

## データ操作に関する関数のおおまかな分類
1\. **データの取得** 
　`LookUp` `First` `Last` `Filter` `Search`
2\. **データのフィルタリング・並び替え**
　`Filter` `Sort` `SortByColumns`
3\. **データの追加**
　`Collect` `Patch` `ForAll`
4\. **データの更新**
 　`Patch` `Update` `UpdateIf`
5\. **データの削除**
　`Remove` `RemoveIf` `Clear`
6\. **データの一時保存**
　`Collect` `ClearCollect`
7\. **フォームとの連携**
　`SubmitForm` `EditForm` `NewForm`

**`LookUp` `Filter` `Collect`については以下の記事で解説しています。**

https://qiita.com/Sanwa_Paint/items/3f4b7742dd1293c46cfa

### Patch関数
`Patch` 関数は、**データソースやコレクションのデータを更新・追加**するための関数です。

```ruby:基本的な書き方
Patch(データソース, レコードまたは条件, 変更内容)
```

+ **レコードを追加したい場合**

```ruby:新しくレコードを作成
Patch(データソース, Defaults(データソース), {レコード})
```

ここに `社員名簿テーブル` があります。
新しい社員が入ったのでレコードを追加したいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/1cc7a188-1766-4cc2-9e21-cdf36efab9be.png)

```ruby:新しくレコードを作成
Patch(
    社員名簿テーブル,
    Defaults(社員名簿テーブル),
    {
        姓: "西田",
        名: "健司",
        部署: "マーケティング部",
        性別: "男"
    }
)

//フルネームはテーブル上で 姓 と 名 を結合させた計算式となっているため設定無し
```

ボタンの `OnSelect` に設定して、この関数を作動させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/73d909df-305b-4d9a-a02e-b24f1633fcaf.png)

最終行に新しいレコードが追加されました。

+ **特定のレコードを更新したい場合**
```ruby:特定のレコードを更新
Patch(データソース, テーブルに含まれるレコード, ｛変更内容｝)
```
`テーブルに含まれるレコード` は `LookUp` 関数で取得することが可能です。
先ほど作成した新しいレコードの部署を `営業部` に変更してみましょう。

```ruby:特定のレコードを更新
Patch(
    社員名簿テーブル,
    LookUp(
        社員名簿テーブル,
        フルネーム = "西田 健司"
    ),
    {部署: "営業部"}
)
```

レコード作成時は `マーケティング部` でしたが `営業部` に更新されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/a719e549-04e0-4122-a6ba-9551ff70876d.png)

### Patch 関数のまとめ:bulb:
+ Patch 関数はレコードの更新や追加を行うことができる関数
+ LookUp 関数を使用することで特定のレコードの更新が可能
+ Defaults 関数を使用すれば新しくレコードを追加することが可能


### Remove関数
`Remove` 関数は、**データソースやコレクションから特定のデータを削除**するための関数です。

```ruby:基本的な書き方
Remove(データソース, 削除するレコード)

//削除するレコードは LookUp などで指定が可能
```

+ **特定のレコードを削除したい場合**
先ほど `Patch` 関数で追加した `西田 健司` さんのレコードを削除してみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/cc6431e7-e482-41ad-8b4f-7e7a7478dd44.png)

関数を実行します。

```ruby:レコードの削除
Remove(
    社員名簿テーブル,
    LookUp(
        社員名簿テーブル,
        フルネーム = "西田 健司"
    )
)
```

分かりづらいかもしれませんが、指定したレコードが削除されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/8f0ba6f9-a3f4-44e6-acab-69f82288903b.png)

### RemoveIf関数
`RemoveIf` 関数は、**条件に一致するすべてのレコードをデータソースやコレクションから削除**するための関数です。

```ruby:基本的な書き方
RemoveIf(データソース, 条件)
```

では、先ほどの `社員名簿テーブル` から部署が `総務部` の人をフィルターしてレコードを削除してみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/3c0ada9e-1c4e-4a43-878f-6a1ff59befb1.png)


```ruby:条件を指定してレコードを削除
RemoveIf(
    社員名簿テーブル,
    部署 = "総務部"
)
```

無事に２個のレコードの削除が実行されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/67241b9a-0286-425f-930d-e35d263ee689.png)

### Remove RemoveIf 関数のまとめ:bulb:
+ `Remove` 関数は `LookUp` を使用して **特定のレコードを削除** することが可能
+ `RemoveIf` 関数は **複数のレコードを一括で削除** することが可能
+ `And` や `Or` 関数を使って複数条件を設定することも可能

:::note warn
警告
`Remove` `RemoveIf` 関数で削除したレコードは復活させることはできませんので、削除を実行する際は十分に気を付けてください。
:::


### ClearCollect関数
`ClearCollect` 関数は、**コレクションをリセットし、新しいデータをセット**するための関数です。

`Clear` 関数と `Collect` 関数がセットになった関数だと思っていただければ結構です。

```ruby:基本的な書き方
ClearCollect(コレクション名, 新しいデータ)
```

`社員名簿テーブル` をそのまま `Collection` というテーブルに作成してみたいと思います。

```ruby:コレクションをリセットして新しいコレクションを作成
ClearCollect(
    Collection,
    社員名簿テーブル
)
```

ギャラリー内の Items が `Collection` という名前でデータを表示させることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/84e5aee6-cee4-459c-a9e1-b8a87e1c46cb.png)


### その②まとめ:bulb:
本記事では Patch Remove RemoveIf ClearCollect 関数について紹介しました！
その他記事についても今後作成していく予定です！
ぜひご参考にしてみてください！