2022年7月29日金曜日

主キーをナチュラルキーにしたときにウィザードが生成するページについて

 Oracle APEXは、表は自動生成のサロゲートキーを主キーにしていると、一番うまく扱ってくれます。

以前のバージョンではそれが顕著だった記憶があります。最新のバージョンの22.1のアプリケーション作成ウィザードページ・作成ウィザードを使って、ナチュラルキーが主キーの表のレポートとフォームのページおよび対話グリッドのページを作成し、結果を確認してみます。

主キーの書式を検証するには開発者によるコーディングが必要で、それが自動生成されないのは仕方ありませんが、それを除くと自動生成されたページでは、最低でも以下の変更が必要です。

  1. レポートの主キー列が非表示になる。ナチュラルキーの場合は表示したい。
  2. フォームの主キー項目が非表示になる。そのため主キーを入力できない。(ページ作成ウィザードのみ)
  3. フォームの主キー項目に設定されている値が変更可能である。主キーを変更されると問題が大きいので、変更不可が望ましい。
  4. 対話グリッドでは、主キー列の代わりにROWIDを使用する。
  5. 対話グリッドで主キー列が非表示、変更可能である点は、対話モード・レポートやフォームと同様の対応が必要です。
以下に状況の確認と、対処する手順について記述します。


準備作業



クイック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にします。

へ進みます。


主キー列1Code (Varchar2)を選択し、ページの作成をクリックします。


同様の手順で、編集可能対話グリッドのページも作成します。

コンポーネント対話グリッドを選択します。


ページ定義名前Test3とします。ページ・モード標準フォーム・ページを含めるOFFにします。対話グリッドの編集を有効にするため、データ編集用のフォームは不要です。データ・ソース表/ビューの名前NK_TESTを指定し、編集が有効ONにします。ナビゲーションブレッドクラムナビゲーション共にONにします。

へ進みます。


主キー列1Code (Varchar2)を選択し、ページの作成をクリックします。


以上で準備は完了です。


対話モード・レポートとフォームの確認(アプリケーション作成ウィザード)



作成したアプリケーションを実行し、アプリケーション作成ウィザードによって作成された、対話モード・レポートとフォームを確認します。

ナビゲーション・メニューからTestを開き、作成をクリックします。レポートの表示を確認するには、最初にデータを投入する必要があります。


CodeNameに適当な値を入力し、作成をクリックします。以下の例では、CodeにX-119、Nameにタブレット7と入力しています。


表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のアプリケーション作成の参考になれば幸いです。