Power Appsによるアプリ開発(Part1-3)

# 目次
- 初めに
- 今回の目標
- 作成した内容
- 最後に

# 初めに
こちらは第3回です。
前回の記事を見ていない方か以下からご覧ください。
- [Power Appsによるアプリ開発(Part1-1)](https://qiita.com/gun_lee/items/f930f0c086b88eff4dfe)
- [Power Appsによるアプリ開発(Part1-2)](https://qiita.com/gun_lee/items/b6b323be7f8076b24cdb)
# 今回の目標
前回、来店記録アプリを完成して、このアプリを使って登録されたデータを可視化し分析できるようにすると決めたのですが、作成したアプリをよく見ると上手く動作できていなかった箇所があったのでそこを修正していきたいと思います。
# 作成した内容
今回発覚した問題は登録画面のところでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329903/1ed7aa8d-edbf-df9e-63d1-866ed06b4f42.png)
フォームを送信すると入力されたデータがSharePointで作成したリストに登録され、参照画面に遷移するようになっており、日付、時間、店舗名が一致するデータが存在する場合はエラー文を表示させ登録しないようにしていました。しかし、フォーム内のすべての必須項目を入力しない場合、データは保存されないのですが参照画面に移動してしまうことに気付きました。
そこでもう一度フォームの動きを確認してみてみました。
以前まではこのように記述していました。
```:Onselect(登録ボタン)
With(
    {
        Rec: LookUp(
            来店記録,
            And(
                日付 = DataCardValue14.SelectedDate,
                時間.Value = DataCardValue15.Selected.Value,
                店舗名.Value = DataCardValue12.Selected.Value
            )
        )
    },
    If(
        IsBlank(Rec),
        SubmitForm(VisitRecordForm);
        Set(
            countA,
            0
        );
        Set(
            countB,
            0
        );
        Set(
            countC,
            0
        );
        Set(
            countD,
            0
        );
        Set(
            countE,
            0
        );
        Set(
            countF,
            0
        );
        Set(
            countG,
            0
        );
        Navigate(EditSelectPage);
        Notify(
            "登録完了しました",
            NotificationType.Success,
            5000
        ),
        Notify(
            "既に登録されている日付、時間、店舗名です",
            NotificationType.Error,
            5000
        )
        
    )
```
コード内にあるcountA~countGはスタッフ数などの数値をボタンのようにカウントするために利用している変数です。
コードを見てみると初めにWith関数でRec(Lookup関数を使って入力している日付、時間、店舗名が既に登録されているか参照)を設定します。次にIf文を使ってRecの内容が空白だった場合(日付、時間、店舗名すべてが一致するデータが**登録されていない場合**)はフォームの内容を登録し、各count関数を0にし、参照画面に遷移してから「登録完了しました」とアナウンスするようにし、それ以外の場合(日付、時間、店舗名すべてが一致するデータが**登録されている場合**)は「既に登録されている日付、時間、店舗名です」とエラーを出すようにしています。
今回の不具合から考えられるのは、Recの内容が空白だったか否かを判断しているため、たとえ必須項目が空白であってもTrueの処理が行われてSubmitForm関数によってフォームを確認されて必須項目が抜けているから登録されないのですが、その後にNavigate関数によって参照画面に移動してしまい、「登録完了しました」とアナウンスがされてしまうことが分かりました。つまり、**SubmitForm関数から出た結果を元に更に条件分岐をしなければならないこと**が分かりました。
そこで調べてみたところ、ボタンではなくフォームのプロパティに成功した場合と失敗した場合の二種類の動きを設定できることが分かり、以下のように書き、ボタンの方も書き換えてみました。
```:OnSuccess(フォーム)
Back()
```
```:OnFailure(フォーム)
Notify(
    "必須項目を入力してください",
    NotificationType.Error,
    5000
)
```
```:Onselect(登録ボタン)
With(
    {
        Rec: LookUp(
            来店記録,
            And(
                日付 = DataCardValue14.SelectedDate,
                時間.Value = DataCardValue15.Selected.Value,
                店舗名.Value = DataCardValue12.Selected.Value
            )
        )
    },
    If(
        IsBlank(Rec),
        SubmitForm(VisitRecordForm);
        Set(
            countA,
            0
        );
        Set(
            countB,
            0
        );
        Set(
            countC,
            0
        );
        Set(
            countD,
            0
        );
        Set(
            countE,
            0
        );
        Set(
            countF,
            0
        );
        Set(
            countG,
            0
        );
        Notify(
            "登録完了しました",
            NotificationType.Success,
            5000
        ),
        Notify(
            "既に登録されている日付、時間、店舗名です",
            NotificationType.Error,
            5000
        )
        
    )
)
```
先ほどと似ているように見えますが、先ほどと違ってIf文でRecの内容を確認した後、空白だった場合、フォームに登録するようにして、そこで登録できたか判断し成功したら画面を参照画面に移動させるようにした後に、先ほどと同じ動きを行うようにして、失敗したら「必須項目を入力してください」とエラーを出すだけにしてみました。
書き換えた結果、うまく動いてくれて解決することが出来ました。

# 最後に
今回は来店記録のアプリの不具合を修正してみました。
アルゴリズムを理解していないと解決出来ていなかったと思いました。
次回は今回やろうと決めていた、このアプリを使って登録されたデータを可視化し分析できるようにしていきたいと思います。