備品貸出アプリを作成する上で学んだこと

# 初めに

この記事では私がPowerAppsを用いてアプリを作成する上で学んだことを記載しております。

備忘録用として記載しておりますので読みにくいなどございましたらご容赦ください。

# 備品貸出アプリの構成について

DBはSharePointリストを用いて作成しております
以下の機能をYoutubeなどを参考&自分なりのカスタマイズで作成しました。

1.ドロップダウンを選択→データテーブルに借りたい備品の重複がなければ予約or借りるボタンを押下します。
　※ドロップダウン...機器の種類、機器名、日付の構成

2.貸出履歴から返却ボタンを押すと返却済みとなる
　※本人以外は押せない
　※予約中は返却ボタンが当日から表示されるようにしました

# Top画面の作りこみ

ここでは「借りる」と「貸し出し履歴へ」の二種類のボタン、利用者アイコン、名前で構成しました。

[参考:【 Power Apps入門 】貸し出しアプリを作ろう – ①アプリの作成 編](https://kyouzai.jp/material/3138/)

Top画面の左上に利用者のアイコンを表示するため、Imageプロパティに下記の関数を入力しました。

```
User().Image
```
名前はUser().FullNameで表示されますが「姓」「名」ではなく「名」「姓」と表示される為、下記のように関数を記載しました。

```
Concatenate(Last(Split(User().FullName," ").Result).Result," ",
First(Split(User().FullName," ").Result).Result)
```
※アプリ作成後に上記の記載をこのように更新しました。
```
With({fullName:Split(User().FullName," ")},Last(fullName).Value&" "&First(fullName).Value)
```

[参考:User().FullName で取得できる値を苗字・名前の順で逆に表示する方法](https://www.youtube.com/watch?v=zjMB0Zy-GMI)

# 借りる画面の作りこみ

ここからは借りる画面の構成について記載しております

## ドロップダウン

機器の種類、機器名、日付など選択できるドロップダウンを追加しました。

```
Items = Distinct(貸し出し機器,id機器の種類)
```

## データテーブル(貸し出し中一覧)

ドロップダウンで機器の種類、借りたい日付、機器名を選択後、
重複があればデータテーブル上に表示されるようにしました。

```

Items=
Filter(
　借用者リスト,
　(貸出日入力.SelectedDate<=返却日)And
　(返却日入力.SelectedDate>=貸出日)And
　(機器名検索ボックス.Selected.id機器名=sp機器名)And
　(sp貸し出し状態<>"返却済")
)
```
[参考:【第2回】備品貸出アプリ作成で学ぶ SharePoint × PowerApps × PowerAutomate](https://www.youtube.com/watch?v=zOX8lwSUpok&t=2s)

## 備品ギャラリー

```
Items = Filter(貸し出し機器,id機器の種類=貸し出し機器検索ボックス.Selected.Result)

```
## チェックボックス
```
OnCheck = Collect(レンタル機器List,ThisItem.id機器名)
```
```
OnUncheck = Remove(レンタル機器List,Value = ThisItem.id機器名)
```
```
Default = ThisItem.id機器名inレンタル機器List
```

## 借りるボタン

ボタンにPatch関数を用いて下記のように記載しました。
***!Blank()によってデータテーブル(貸し出し中一覧)に値があれば
重複している通知を伝え、重複がなければPatch関数が通るように***参考＆カスタマイズしました。

```
If(
　!Blank(貸し出し中一覧),
　Notify("貸出日、返却日が重複しています",warning),
　Patch('借用者リスト',Defaults('借用者リスト'),
　　{
	　sp借用日:Text(Today(),"yyyy/mm/dd"),
	　sp名前:With({fullName:Split(User().FullName," ")},Last(fullName).Value&" "&First(fullName).Value),
	　spメールアドレス:User().Email,
	　sp貸し出し状態:If(貸出日入力.SelectedDate-Today()>0,"予約中","借用中"),
	　sp機器名:機器名検索ボックス.Selected.id機器名,
	　貸出日:貸出日入力.SelectedDate,
	　返却日:返却日入力.SelectedDate,
	　sp_id機器の種類:貸出検索ボックス.Selected.Result
}));

```

### ステータス表示

ステータス表示(貸し出し中、貸し出しOK、予約中)を下記のように記載しました。

```
Text=
　If(
　　ThisItem.id機器名 in Concat(
	　Filter(
		　　'借用者リスト',
		　　sp貸し出し状態="借用中"
		　),sp機器名
		　),"貸出中",
	ThisItem.id機器名 in Concat(
		　Filter(
			　　'借用者リスト',
			　　sp貸し出し状態="予約中"
			　),sp機器名
			　),"予約中",
			　"貸出OK"
			)
```

# 貸し出し履歴

ボタンを押下すると返却済みとステータスが変わるように記載しました
借りるボタンを押下した本人のみが押せるようになっています。

## 返却ボタン

```
OnSelect=Patch(借用者,LookUp(借用者,ID = ThisItem.ID),
{sp貸し出し状態:"返却済み"})
```

```
DisplayMode = If(ThisItem.spメールアドレス=User().Email,DisplayMode.Edit,Disabled)
```

```
Visible = If(ThisItem.sp貸し出し状態="借用中",true,false)
```

## 当日になると予約中→借用中に更新する機能

下記のように記載することで実現しました

```
OnStart=
　UpdateIf(
	　　　借用者リスト,
		sp貸し出し状態="予約中"&&貸出日=Today(),
		{sp貸し出し状態:"借用中"}
)
```
# 所感 

**予約システムを作成することが一番苦労しました**

借用者リスト上で保管されている該当する端末の貸出日、返却日と他のユーザーが選択した端末、貸出日、返却日を比較して重複があればデータテーブルに表示されるようにし、借りるボタンを押すとデータテーブルに表示されているものがあると押せないようにした考えは自分の中でまた1歩成長としたと感じました。

**youtubeで参考にさせていただいた先人の方々には感謝しております。**
今後も勉強のために参考に致します。

# まとめ：備品貸出アプリを作成する上で学んだこと

1.User().FullNameの記載の工夫の仕方
2.If,LookUp,Filter,Patch,UpdateIf等の関数の使い方
3.関数の組み合わせのバリエーション
4.予約システムの追加方法