モダンの「数値入力」の困った仕様について ※2025年3月4日現在

この記事の内容は2025年3月4日時点での仕様です。
今後のバージョンアップなどにより変更される可能性があります。
作成バージョンは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/465d6cf7-5371-45b5-a689-a8860303759a.png)

## 動画でも解説しました
<iframe width="560" height="400" src="https://www.youtube.com/embed/v15KJyIyDa8?si=W5EU9C1K4dcXjmao" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## モダンの「数値入力」について
PowerAppsStudioの設定でモダンコントロールをオンにすると、新しい外観のコントロールを使用することができます。その中に数値入力するための「数値入力」コントロールがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/f67088cb-406a-4dda-da4b-2c93f874a695.png)
↑このようなコントロールで、右側の上下ボタンで数値を変更することができるようになっています。

SharePointリストをデータソースとして、モダンコントロールのフォームを追加した際も、数値列があると「数値入力」コントロールが自動的に追加されます。

ボタンを配置してOnSelectプロパティに```SubmitForm(Form1)```として、ボタンを押下するとリストに保存することができますが、この際に**数値だけが保存されない**ことが多々あり、少し悩んでいました。

検証して分かったこととしては、

## ※フォームの場合
**「数値入力」コントロールのフィールドを編集して、カーソルがフィールドに残った状態で、SubmitFormボタンを一瞬押しても、編集した数値がリストに保存されない**ということでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/279642f1-8ccc-d4b1-02e3-422f5810e6e5.png)
↑この状態ではボタンを一瞬押すだけでは編集した数値が保存されない

これは、ボタンを押した際にフィールドが確定されて、離した際に送信されるためのようです。
ボタンを押して離すのが一瞬だと、入力した値が確定されていない状態で送信されるので、編集された値が保存されないのではないかと思います。

ちなみにモダンでも「テキスト入力」（TextInputCanvas）では大丈夫でした。


### ▼ではフォームを使用しない場合はどうか
## ※Notifyの場合
これはフォームのSubmitFormと同じでした。

![NumberInputの挙動.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/907e9dc2-79ea-4957-af79-e24ae73ec062.gif)
「123」と入れてボタンを押して、1秒くらいで離した場合は、ちゃんと反映されています。
「456」と入れてボタンを押して、0.5秒くらいで離した場合は、編集前の値が取得されていることが分かりますね。

## ※Patchの場合
ボタンのOnSelectプロパティに```Patch(testlist,Default(testlist),{user_ID:NumberInput.Value})```
として、ボタンを押下するとこれまた保存されるときと保存されない時があります。
フォームの時は空白で保存されていましたが、こちらは行自体が追加されません。

ボタンを押して離す時間が一瞬だと、入力が確定されるだけで保存されません。
ボタンを押して、一瞬間をおいて離すときちんと保存されます。

## ※Collectの場合
結論から言うと、Collect関数の場合は大丈夫でした。
```Collect(testlist,{user_ID:NumberInput.Value})```
で、何度も試してみましたが、特に異常はありませんでした。

ただ、フォームとPatchの動作が不安定なので、今の状態では使用するのに不安が残ります。

## 予想
恐らくですが、この仕様は「テキスト入力」の「出力のトリガー(TriggerOutput)」の初期値「Forcus Out」がそのまま使われていて、編集した値が反映される前に、値が取得されてしまっているのではないかと思います。
「テキスト入力」ではこの設定を3種類設定することができますが、「数値の入力」にはありません。

※とは言いつつも「テキスト入力」の「Forcus out」ではこの現象はなくて、きちんと編集した値が取得できるのですが・・・

▼試しに「数値入力」のOnChangeプロパティに
```
Notify(NumberInput1.Value,NotificationType.Warning)
```
として試したところ
「テキスト入力」の「Forcus out」と同じ挙動になりました。

今後の仕様変更で、内部的に「keypress」にされるか、「出力のトリガー」の設定が「数値入力」にも実装されることを願います。

## ※対策
対策としていくつか試してみました。

失敗： ~~Select関数で別のコントロールを選択してからSubmitFormする~~
失敗： ~~Select関数で別のコントロールのボタンのOnSelectプロパティでSubmitFormする~~

成功：タイマーコントロールでSubimitFormを〇秒遅らせる

結果タイマーコントロールで遅らせて送信したところ、編集した内容をきちんと送信することができました。

フォーカスがちゃんと外れてから送信することで、編集した内容が反映されたのだと思います。
「Duration」プロパティをどれくらいまで小さくできるか検証したのですが、60ミリ秒まではOKで50ミリ秒では不安定でした。
ただ、ボタンを離してタイマーが動作するまでにも遅延はあると思いますので、ギリギリを攻めてもあまり意味はありません。
実用上100ミリ秒に設定しておけば、安定して取得できるのではないかと思います。

ふと、モダンの「ボタン」に「DelayOutput」プロパティがあれば、「タイマー」を使う必要がないと思ったのですが、残念ながら有りませんでした。

~~現状有効な対策はタイマーだけだと思うのですが、そこまでしてモダンコントロールの「数値入力」コントロールを使うかというところですね。~~

※追記
「送信しますか？」と書いたダイアログを用意して、SubmitFormやPatch動作前にワンクッション置くのが良い対策だと思います。