[power apps]テニスコート申請画面を作成する Part9 申請データの登録実装(レスポンシブ対応/全手順公開)

やること

  • SPOリストへの登録周りに実装を行う。

手順

1.「次へ」ボタンの表示を編集

Text: If (glbCurrentStepId = glb代表者入力_STEP_ID, "登録する", "次へ")

「次へ」ボタンをクリックして、そのままデータが登録されるのは不親切である。
終端のフォームにたどり着いたら、「登録する」の表示に切り替える。

 

2.SPOリストの登録

Patch(
  テニス会場レンタル申請データ
  , Defaults(テニス会場レンタル申請データ)
  , 会場選択Form.Updates
  , 日程選択Form.Updates
  , 備品選択Form.Updates
  , 代表者入力Form.Updates
);

登録ボタンをクリックしたとき、かつ終端のフォームを表示しているときに実行する。
登録フォームにはSubmitFormという標準関数があるが、複数のフォームから入力情報を集めて一括登録を行うにはPatch関数を利用する。
SPOリストの名前でForm名.Updatesを重ねるだけでよい(簡単)

3.スケジュールマスタの空き数更新

UpdateIf(
  スケジュールマスタ
  , Int(連番) = Int(glbSelectedスケジュール候補日1.連番)
    Or Int(連番) = Int(glbSelectedスケジュール候補日2.連番) 
    Or Int(連番) = Int(glbSelectedスケジュール候補日3.連番)
  , {空き数: 空き数 - 1}
);

Updatelfはデータソースを更新することのできる関数である。
Or演算子を用いることで最大3つのレコード取得し、「空き数:空き数-1」で更新をしている。

この処理は「2.SPOリストの登録」の処理より後に記述しなければならない。
なぜなら、Updatelfを先に更新した場合、以下の順序で処理が走る可能性がある。

  1. スケジュールマスタが更新され、空き数が「1」⇒「0」になる
  2. RefleshScheduleTableReflesh(スケジュールマスタ)を呼び、最新のマスタ情報を参照する
  3. valスケジュール候補日1~3Itemsの『空き数が1以上のレコードのみ取得する』の条件を外れるため選択が空欄にリセットされる
  4. Patch関数が呼ばれ、valスケジュール候補日1~3が空欄であるため、SPOリストにも日付が入らない

4.事後処理

登録が完了したら、完了画面に遷移するなど、いろいろなアイデアはあるが簡略化のため、一番最初のフォーム画面に遷移させる。

そのままでは登録した時の情報が画面上に残ったままであるため、それらを初期化する。

/** フォームの入力値の初期化 */
ResetForm(日程選択Form);
ResetForm(備品選択Form);
ResetForm(代表者入力Form);
ResetForm(会場選択Form);

/** フォームの入力値として使用している変数の初期化 */
Set(cond会場ID, "");
Set(temp会場検索結果レコード, Blank()); 
Set(glbSelectedスケジュール候補日1, Blank());
Set(glbSelectedスケジュール候補日2, Blank());
Set(glbSelectedスケジュール候補日3, Blank());

/** 表示するフォーム画面を1番目に戻す */
Set(glbCurrentStepId, glb会場選択_STEP_ID);

/** 画面上に完了のメッセージを簡易的に表示 */
Notify("完了");

ResetFormを呼び出すとユーザー入力情報がリセットすることができる。

ただし、Defaultプロパティで変数を参照するようなオブジェクトの場合、その変数を初期化しないとリセットされないため、合わせて変数も初期化している。

最終的なNextButton.OnSelectのコードを念のため記載する。

If (glbCurrentStepId <> glb代表者入力_STEP_ID
  ,
    /** 画面が代表者入力でないとき */
  Set (glbCurrentStepId, glbCurrentStepId + 1)
  ,
    /** 画面が代表者入力であるとき */
  Patch(
    テニス会場レンタル申請データ
    , Defaults(テニス会場レンタル申請データ)
    , 会場選択Form.Updates
    , 日程選択Form.Updates
    , 備品選択Form.Updates
    , 代表者入力Form.Updates
  );
  UpdateIf(
    スケジュールマスタ
    , Int(連番) = Int(glbSelectedスケジュール候補日1.連番)
    Or Int(連番) = Int(glbSelectedスケジュール候補日2.連番) 
    Or Int(連番) = Int(glbSelectedスケジュール候補日3.連番)
    , {空き数: 空き数 - 1}
  );

  /** フォームの入力値の初期化 */
  ResetForm(日程選択Form);
  ResetForm(備品選択Form);
  ResetForm(代表者入力Form);
  ResetForm(会場選択Form);

  /** フォームの入力値として使用している変数の初期化 */
  Set(cond会場ID, "");
  Set(temp会場検索結果レコード, Blank()); 
  Set(glbSelectedスケジュール候補日1, Blank());
  Set(glbSelectedスケジュール候補日2, Blank());
  Set(glbSelectedスケジュール候補日3, Blank());
  Set(converted代表者電話番号, Blank());
  Set(converted代表者メールアドレス, Blank());

  /** 表示するフォーム画面を1番目に戻す */
  Set(glbCurrentStepId, glb会場選択_STEP_ID);

  /** 画面上に完了のメッセージを簡易的に表示 */
  Notify("完了");
);

5.動作確認

プレビュー画面を表示し、4つのフォームの全てに情報を入力する。
登録するのボタンをクリックし

  • 入力情報がSPOリスト(テニスコート申請データ)に反映されること
  • スケジュールマスタの空き数の数が「1」減っていること
  • 先頭のフォーム画面に戻ること
  • 全ての入力情報がリセットされていること

を確認できればOK

 

記事一覧