MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Power Apps for Teams の DateTime 列にはご注意を! (時間ずれる)

まずは何が問題なのか実際に挙動を見ていただければと。

f:id:mofumofu_dance:20210216133702g:plain
フォームにDateTime型の列が含まれる場合

『おや?変更を加えていないのに時間がコロコロ変わっているぞ?』

これが Teams 上の Power Apps で DateTime型の列を取り扱う場合の問題点です。

DateTime型の列が紐づけられているフォームでは、日付に変更を加えず保存すると時間がずれる

問題の原因

問題の原因は、フォーム内の対応するカードの Update プロパティ と、新しい DatePicker コントロールの性質です。

まず Update プロパティですが、以下の式で与えられます。

DateValue1.Value + Time(Value(HourValue1.Selected.Value), Value(MinuteValue1.Selected.Value), 0)

f:id:mofumofu_dance:20210216134616p:plain
DateTime型の列のUpdateプロパティ。DatePickerの値+時間を表すドロップダウンで構成される

この式は通常の Power Apps のフォームでも見慣れた式で、通常のフォームでは Update プロパティは以下のように与えられます。

DateValue1.SelectedDate + Time(Value(HourValue1.Selected.Value), Value(MinuteValue1.Selected.Value), 0)

f:id:mofumofu_dance:20210216135258p:plain
通常のPower AppsにおけるDateTime型の列に対応したUpdateプロパティ

同じに見えますよね。ここで問題になるのが新しい DatePickerコントロールの性質です。

新しい DatePicker コントロールでは、選択された日付 (SelectedDate) ではなく、 値 (Value) を返すようになりました。この Value は 日付だけでなく (より正確には日付+0:00 ではなく) 日付+時間を返します。

また、Editフォームでは既定でDatePickerに対して Parent.Default (DateTime列の値) が適用されます。

例 : DateTime 列が 2020/02/16 15:00 の場合

このとき、DataValue.Value2020/02/16 ではなく 2020/02/16 15:00を返します。一方で、通常の Power Apps における DatePicker ではあくまでもSelectedDate なので、DateValue1.SelectedDate2020/02/16 00:00 を返します。

f:id:mofumofu_dance:20210216140007p:plain
新しいDatePickerと元のDatePickerの挙動差

これにより、Teams版と通常版ではそれぞれ Update の計算結果は以下のようになります。

Teams 版

DateValue1.Value + Time(Value(HourValue1.Selected.Value), Value(MinuteValue1.Selected.Value), 0)
= 2020/02/16 15:00 + 15:00
= 2020/02/17 06:00 

通常版

DateValue1.SelectedDate + Time(Value(HourValue1.Selected.Value), Value(MinuteValue1.Selected.Value), 0)
= 2020/02/16 00:00 + 15:00
= 2020/02/16 15:00

ということで、元の問題だった DateTime型の列が紐づけられているフォームでは、日付に変更を加えず保存すると時間がずれる の原因 がおわかりいただけたでしょうか。

修正するには

これを正しくするためにはどうすればよいでしょうか。

考えられる方法は2つ、

  1. DatePicker のValue (Parent.Default) から時間部分を取り除く
  2. Update プロパティの DatePicker.Value な部分から 時間を取り除く

です。どちらで対応しても問題ありません。

修正方法1 : DatePicker の Value をいじる

この場合にはDatePickerの Valueプロパティを以下のように変更します。

DateValue(Text(Parent.Default,"[$-en-US]yyyy-mm-dd"))

f:id:mofumofu_dance:20210216141225p:plain
DatePickerの初期値をいじる場合

Parent.Defaultだと時間も含んでしまうので、一回 Text関数で日付だけにして、DateValue関数でDate型に戻しています。

修正方法2 : Update プロパティをいじる

同様に、 Updateプロパティで対応する場合には以下のように書き換えを行います。

DateValue(Text(DateValue1.Value,"[$-en-US]yyyy-mm-dd")) + Time(Value(HourValue1.Selected.Value), Value(MinuteValue1.Selected.Value), 0)

これで無編集で時間がどんどん進んでしまう事象がおこらなくなりました。

f:id:mofumofu_dance:20210216141805g:plain
修正後

おわり

もう一つはClassicコントロールを有効にするという手もあるんですが、コントロールを入れ替えてかつプロパティを書き換えるというのもなかなか大変なので 割愛しました。

今後修正が入るかもしれませんが、いずれにしてもこの修正を行っておけば回避できるので同じ問題にぶつかったら試してみてください。

f:id:mofumofu_dance:20210216142138p:plain