2021年2月12日金曜日

同一ページのフォームと対話グリッドの処理順について

 同じページにフォームと対話グリッドのリージョンがある場合、どちらが先に処理されるのか、と質問がありました。プロセス行の自動処理(DML)の登録順だろうと思ったのですが、確認してみました。その作業ログです。ページ作成ウィザードを使用しないフォームと対話グリッドのリージョンの作成方法の紹介にもなっています。

以下のクイックSQLのモデルにて、表TST_INSERT_ORDERを作成します。

# prefix: tst
# semantics: default
insert_order
    name vc80

モデルには含まれていませんが、主キーとして列IDが作成され、一意となる数値が自動採番されます。そのため、IDを確認することにより、行が挿入された順番が分かります。

表を作成した後、空のアプリケーションを作成します。今回は名前Insert Order確認としました。ホーム・ページを開いて、フォームと対話グリッドのリージョンを追加します。

新規にタイプフォームとなるリージョンを追加します。タイトルフォームとしています。ソース表名としてTST_INSERT_ORDERを設定します。

表名が設定されると、列が認識されます。認識された列の中から列IDに対応するページ・アイテムP1_IDを選択し、タイプ非表示主キーONに変更します。

フォーム・リージョンのAttributesを開き、編集有効にします(ONにします)。

行を作成するボタンを作成します。フォーム・リージョンを手動で作成した場合、ページ作成ウィザードによる作成とは異なり、作成、変更の登録、削除、キャンセルといったボタンは作成されません(これらのボタンは、フォーム・リージョンというコンポーネントの一部ではありません)。

フォーム・リージョンにボタンを作成します。ボタン名B_CREATEラベル生成としています。動作アクションページの送信(つまりHTTPのPOSTが発行されます)、データベース・アクションSQL INSERT操作を選びます。

データベース・アクションの指定は重要で、フォーム・リージョンに対応する行の自動更新(DML)プロセスは、このデータベース・アクションの指定に従ってデータベースの表操作を行います。

続いて、対話グリッドのリージョンを追加します。新規に名前対話グリッドとしたリージョンを追加し、タイプ対話グリッド表名TST_INSERT_ORDERを設定します。

表名が設定されると、列が認識されます。認識された列の中から列IDを選択し、タイプ表示のみ主キーONに変更します。主キー列は通常は非表示にしますが、今回は挿入の順番を確認するため、列として表示させます。

 対話グリッドのリージョンのAttributesを開き、編集有効にします(ONにします)。

以上でアプリケーションの作成は完了です。プロセス・ビューを開いて、登録されている行の自動処理(DML)の順番を確認します。

アプリケーションを実行して、何行かデータを挿入してみます。

フォームのNameにform 1、対話グリッドにgrid 1grid 2の2行を設定し、作成をクリックします。


フォームのプロセスの方が対話グリッドより先に実行されるので、挿入順はform 1、grid 1、grid 2になります。


プロセスの処理順を入れ替え、対話グリッドのプロセスを先に実行します。

アプリケーションを実行し、フォームのNameにform 2、対話グリッドにgrid 3grid 4の2行を設定し、作成をクリックします。

今度は対話グリッドのプロセスが先に処理されるため、挿入順はgrid 3、grid 4、form 2になります。

確認に使用したアプリケーションのエクスポートを以下に置きました。

https://github.com/ujnak/apexapps/blob/master/exports/insertorder.sql

以上になります。Oracle APEXのアプリケーション作成の一助になれば幸いです。