複数のページを呼び出して最後のデータを更新するといった要件は、どのように実装すればよいのかという相談がありました。
以下のような動作をするアプリケーションを作ってみます。
最初に開いたページで値を変更します。次に進んで、確認をONにします。確認をONにして次に進むと、変更した値が次のフォームに反映されます。OFFのときは元の値がフォームに反映されます。最後に変更を確定する画面が開き、送信すると値が変更されます。
以下より作成方法を記述します。サンプル・データセットのEMP/DEPTに含まれる表EMPを、テスト用のデータとして使用します。
アプリケーション作成ウィザードを起動します。
名前は複数ステップ更新とし、あらかじめ作成されているホーム・ページは削除します。
ページの追加をクリックし、対話モード・レポートのページを追加します。
ページ名は従業員一覧、表またはビューとしてEMPを選択します。値の編集は行うため、フォームを含めるはチェックします。
ページの追加を実行します。
元のページでアプリケーションの作成を実行します。
アプリケーションが作成されます。最初にページ番号2の編集フォームのページEmployeeを開き、コピーを作成します。
作成メニューを開き、コピーとしてのページを実行します。
次のコピーとしてのページを作成として、このアプリケーションのページを選択します。
次へ進みます。
コピー元ページは2.Employee、新規ページ番号は4を指定します。(後ほどページ番号3として、確認を行うページを作成します。)新規ページ名は確定とします。
次へ進みます。
ダイアログなのでナビゲーション・メニューは不要です。ナビゲーションのプリファレンスはこのページとナビゲーション・メニュー・エントリを関連付けないから変更しません。
次へ進みます。
コピーを実行します。
ページのコピーが作成されます。
ページ2とページ4の間で、確認を実行するページを作成します。
作成メニューのページを実行します。
空白ページを選択します。
次へ進みます。
ナビゲーションのプリファレンスはこのページとナビゲーション・メニュー・エントリを関連付けないから変更しません。
次へ進みます。
終了をクリックし、ページを作成します。
確認のページが作成されました。
これから、ページ番号2、3、4と順番に画面が遷移する実装を行います。
ページ番号2から変更していきます。ページ・デザイナにてページ番号2を開きます。
最初にページ・プロパティのダイアログのチェーンをONに変更します。チェーンをONにすると、次に遷移するページがモーダル・ダイアログの場合、ダイアログの上に重ねてダイアログが表示される代わりに、今開いているダイアログが置き換えられます。
ボタンDELETEとCREATEは削除します。
ページ・アイテムをすべて選択し、ソースのセッション・ステートの保持をリクエストごと(メモリーのみ)からセッションごと(ディスク)に変更します。このようにすることで、サーバーに送信されたページ・アイテムはデータベースに保存され、アプリケーション内の別のページから参照できるようになります。
ページ・アイテムは、それが配置されているページ内からの参照に留める方が、デバッグが容易なアプリケーションになります。セッション・ステートの保持をセッションごと(ディスク)とするのは、今回のように遷移先のページが固定されていたり、ページ・アイテムを参照するページが決まっている(今回の例ではデータを確定するページ番号4のみ)ときに限定した方が良いでしょう。
プロセス・ビューを開き、プロセス・フォームEmployeeとダイアログを閉じるを削除します。このページでは、データの操作は行いません。
送信されたフォームのデータは、自動的にセッション・ステートに保存されます。プロセスは不要です。
動作のタイプとしてページまたはURL(リダイレクト)を選択し、ターゲットにページ3を選択します。このページのページ・アイテムの値はセッション・ステートに保存されているので、パラメータとして渡す必要はありません。
サーバー側の条件として、ボタン押下時にSAVEを選択します。
ページ・デザイナで、ページ番号3の確認のページを開きます。
ページ・アイテムを作成します。この値がYのとき、前のページで変更した値を最後のフォームで使用します。
識別の名前をP3_CONFIRMとします。タイプとして切替えを選択します。ラベルは確認とします。ソースのセッション・ステートの保持はセッションごと(ディスク)を選択します。
次のページへ遷移するためのボタンを作成します。
識別のボタン名はB_NEXT、ラベルは次とします。動作のアクションはページの送信です。
先ほどと同様にプロセス・ビューを開いて、次のページへの遷移を行うブランチを作成します。
動作のターゲットはページ4、サーバー側の条件のボタン押下時にB_NEXTを選択します。
ページ・プロパティのチェーンがONであることを確認します。
ページ・デザイナにて、最後にデータを確定するページ番号4を開きます。
最初に主キーP4_EMPNOに、ページ番号2のP2_EMPNOの値を設定します。
プロセスを作成し、初期化フォームEmployeeの前に配置します。
識別の名前は主キーの設定、ソースのPL/SQLコードとして以下を記述します。
:P4_EMPNO := :P2_EMPNO;
最初のフォームで指定した値を、このページに移入します。
プロセスを作成します。識別の名前を変更された値を適用とします。タイプとしてコードを実行を選択します。ソースのPL/SQLコードとして以下を記述します。
:P4_ENAME := :P2_ENAME;
:P4_JOB := :P2_JOB;
:P4_MGR := :P2_MGR;
:P4_HIREDATE := :P2_HIREDATE;
:P4_SAL := :P2_SAL;
:P4_COMM := :P2_COMM;
:P4_DEPTNO := :P2_DEPTNO;
サーバー側の条件のタイプとしてアイテム = 値を選択し、アイテムにP3_CONFIRM、値をYとします。ひとつ前のページの確認をONにしたときに限り、変更した値が移入されます。ページ・アイテムP3_CONFIRMもセッション・ステートの保持がセッションごと(ディスク)なので、異なるページから値を参照できます。
このページでの値の変更を禁止するため、P4_EMPNO以外のページ・アイテムをすべて選択し、読取り専用のタイプを常時に変更します。
ボタンDELETEとCREATEを削除します。
以上でアプリケーションは完成です。実行すると、記事の最初のGIF動画のように動作します。
今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/multi-step-submit.sql
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完