プログラマーになるのは諦めた

ノーコード・ローコード勉強するおじさんのブログ

Power Apps - 期間の重複をチェックする

こんにちは。kickyです。
予約システムなどを作る際、すでに登録されている期間と、自分がこれから予約したい期間が重複しているのかどうかチェックしたい場合があります。Power Appsでどのようにチェックすればよいか、試してみました。

参考
日付期間の重複チェック - Qiita
DateDiffすごく便利 - Qiita

結論から言うと、DateDiff関数を使います。

f:id:kicky60136227:20210626143604p:plain

対象日時、比較日時、ともに開始日時は終了日時を越えていないものとします。

比較終了日付 < 対象開始日付 Or 対象終了日付 < 比較開始日付

2つの式のOrを取り、どちらかの式のDateDiffが0より大きいならば、期間重複はしていないとみなせます。

対象と比較① → 3000 Minutes で0より大きい
f:id:kicky60136227:20210626150701p:plain

対象と比較② → 3960 Minutes で0より大きい
f:id:kicky60136227:20210626150713p:plain

実際には、複数ある対象日時と比較していくことが多いと思うので、ループで複数回処理する工夫が必要ですね。

説明は以上なのですが、このままでは面白くないので、Power Appsで期間の重複をチェックする画面を作りました。
f:id:kicky60136227:20210627212640g:plain
Button1は比較開始日時<比較終了日時になっている場合に表示する。
Button2は比較開始日時<比較終了日時になっていて、かつ、対象開始日時~対象終了日時と重複しない場合に表示する。
という仕組みを入れています。

ポイントを絞って解説します。

参考
Power Apps for Teams の DateTime 列にはご注意を! (時間ずれる) - MoreBeerMorePower
Power Appsで選べる「日付の選択」パーツでは、日付は入力できても、時刻まで入力できないようです。そこで時刻入力用の別パーツ(ドロップダウンなど)と組み合わせる必要があるのですが、「日付の選択」で選んだ値(SelectedDate)は日付+00:00:00を含む「日付」で取り出されるようです。このままだと非常に扱いにくいので、いったん文字列にして時刻の文字列とくっつけてから、全ての文字列をDateTimeValue関数の中に入れて「日時」に変換しました。
※DateDiff関数は中身のデータ型が「日時」である必要があります。

TextInput3.Default

f:id:kicky60136227:20210627215538p:plain

Button1は比較開始日時<比較終了日時となるときだけ表示されるようにしました。If関数のなかに、DateDiff関数の結果が0より大きい(つまり正)ときのみtrueとなる条件を入れています。

Button1.Visible

f:id:kicky60136227:20210627220429p:plain

Button2は先ほどのButton1の条件を満たしたうえで、「比較終了日付 < 対象開始日付 OR 対象終了日付 < 比較開始日付」を満たすために、If、And、Orの入れ子になっています。

Button2.Visible

f:id:kicky60136227:20210627221215p:plain

条件式の書き方はPower Apps独特なのでこのあたりが分かりやすいです。
PowerApps 今更だけどPowerAppsのifを調べてみた | 仕事のあれこれ