Oracle APEXは、表は自動生成のサロゲートキーを主キーにしていると、一番うまく扱ってくれます。
以前のバージョンではそれが顕著だった記憶があります。最新のバージョンの22.1のアプリケーション作成ウィザードとページ・作成ウィザードを使って、ナチュラルキーが主キーの表のレポートとフォームのページおよび対話グリッドのページを作成し、結果を確認してみます。
主キーの書式を検証するには開発者によるコーディングが必要で、それが自動生成されないのは仕方ありませんが、それを除くと自動生成されたページでは、最低でも以下の変更が必要です。
- レポートの主キー列が非表示になる。ナチュラルキーの場合は表示したい。
- フォームの主キー項目が非表示になる。そのため主キーを入力できない。(ページ作成ウィザードのみ)
- フォームの主キー項目に設定されている値が変更可能である。主キーを変更されると問題が大きいので、変更不可が望ましい。
- 対話グリッドでは、主キー列の代わりにROWIDを使用する。
- 対話グリッドで主キー列が非表示、変更可能である点は、対話モード・レポートやフォームと同様の対応が必要です。
以下に状況の確認と、対処する手順について記述します。
準備作業
クイックSQLの以下のモデルより、確認作業で使用する表NK_TESTを作成します。列CODEが主キーでナチュラルキーを想定しています。キー値の自動生成は行いません。
# prefix: nk
test
code vc8 /pk
name vc80
SQLワークショップのユーティリティから、クイックSQLを起動します。上記のモデルを与え、SQLの生成、SQLスクリプトを保存、レビューおよび実行を順次実行します。
SQLスクリプトのレビュー画面が開きます。列CODEの値が自動生成されない(generated by default on null as identityといった指定がない)ことを確認します。
実行をクリックし、表NK_TESTを作成します。(確認画面で即時実行をクリックします。)
表NK_TESTが作成されたことを確認し、アプリケーションの作成をクリックします。(確認のダイアログが開くので、そこでもアプリケーションの作成をクリックします。)
アプリケーションの名前をナチュラルキーの確認とします。表NK_TESTのフォーム付き対話モード・レポートのページが追加されていることを確認します。
以上で、アプリケーションの作成を実行します。
アプリケーションが作成されます。
ページ作成ウィザードを使って対話モード・レポートとフォームのページを作成します。
ページの作成をクリックします。
コンポーネントの対話モード・レポートを選択します。
ページ定義のレポートの名前をTest2、ページ・モードは標準とし、フォーム・ページを含めるはONにします。フォーム・ページ名もTest2とします。データ・ソースの表/ビューの名前はNK_TESTです。ナビゲーションのブレッドクラム、ナビゲーション共にONにします。
次へ進みます。
主キー列1にCode (Varchar2)を選択し、ページの作成をクリックします。
コンポーネントの対話グリッドを選択します。
ページ定義の名前はTest3とします。ページ・モードは標準、フォーム・ページを含めるはOFFにします。対話グリッドの編集を有効にするため、データ編集用のフォームは不要です。データ・ソースの表/ビューの名前にNK_TESTを指定し、編集が有効をONにします。ナビゲーションのブレッドクラム、ナビゲーション共にONにします。
次へ進みます。
主キー列1にCode (Varchar2)を選択し、ページの作成をクリックします。
以上で準備は完了です。
対話モード・レポートとフォームの確認(アプリケーション作成ウィザード)
作成したアプリケーションを実行し、アプリケーション作成ウィザードによって作成された、対話モード・レポートとフォームを確認します。
ナビゲーション・メニューからTestを開き、作成をクリックします。レポートの表示を確認するには、最初にデータを投入する必要があります。
表NK_TESTにデータが1行投入されます。対話モード・レポートに、列CODEは表示されません。
ページ・デザイナを開き、列CODEの識別のタイプを非表示からプレーン・テキストに変更します。
主キー列のCODEもレポートに表示されるようになりました。
入力したデータを編集モードで開きます。鉛筆アイコンをクリックします。
先ほど入力したデータの編集フォームが開きます。ここでCodeが編集できてしまいます。
ページ・デザイナを開き、ページ・アイテムP3_CODEを選択します。
読取り専用のタイプにアイテムはNULLではないを選択し、アイテムにP3_CODEを指定します。これで、P3_CODEに値が設定されているときは編集不可になります。
再度、フォームを開き直します。Codeが編集不可でNameは編集できることを確認し、変更の適用をクリックします。
レポート上のNameの表示が変わっていることを確認します。
対話モード・レポートとフォームの確認(ページ作成ウィザード)
ページ作成ウィザードによって作成された対話モード・レポートとフォームを確認します。ナビゲーション・メニューよりTest2を開きます。
列CODEが非表示になっています。
ページ・デザイナで確認すると、なぜか列にROWIDが含まれています。
不要なので削除しますが、その前に、フォームを開く際のパラメータとしてROWIDが使用されていないことを確認します。
リージョンTest2を選択し、プロパティ・エディタの属性タブを開き、リンクのターゲットをクリックします。
フォームのページ・アイテムP5_CODEに列CODEの値#CODE#が渡されています。ROWIDは使われていないため、レポートの列ROWIDは問題なく削除できます。
列ROWIDを削除し、列CODEの識別のタイプをプレーン・テキストに変更します。
対話モード・レポートの対応は以上で完了です。
鉛筆アイコンをクリックし、編集フォームを開きます。
ページ作成ウィザードで作成されたフォームでは、主キー項目であるCODEを保持するページ・アイテムが非表示になっています。
ページ・デザイナを開き、主キーであるページ・アイテムP5_CODEのプロパティを適切に設定します。
識別のタイプをテキスト・フィールド、ラベルはCodeとします。外観のテンプレートをRequired - Floatingに変更します。主キーなので、検証の必須の値はONにします。
検証の必須の値の変更と、外観のテンプレートの設定は連動しません。必須の値の設定に合うように、手作業で外観のテンプレートを設定する必要があります。
ソースの主キーがONであることを確認します。読取り専用のタイプとしてアイテムはNULLではないを選択し、アイテムにP5_CODEを指定します。
基本的な対応は、以上となります。
対話グリッド
対話グリッドについても確認します。ナビゲーション・メニューからTest3を開きます。
列CODEが表示されていません。
ページ・デザイナで対話グリッドのページを開きます。
主キーがナチュラルキーの場合、対話グリッドでそのまま扱うのは困難です。そのため、ROWID列を使います。
ソースのROWID列を含めるをONにします。
列CODEを選択します。
識別のタイプを非表示からテキスト・フィールドに変更します。ヘッダーはCodeとします。列CODEは実際には主キーなので、検証の必須の値はONにします。対話グリッドとしての主キーはROWIDになっているので、ソースの主キーはOFFにします。読取り専用のタイプとしてアイテムはNULLではない、アイテムにCODEを選択し実行は各行とします。
対話グリッドの場合、実行を各行とするとアイテムとして列を指定します。この設定により、新規行であれば列CODEに値の入力を許可し、それ以外の既存行での列CODEの変更を禁止できます。
基本的な対応は、以上となります。
今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/support-natural-key.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完