2022年7月28日木曜日

Autonomous Databaseで利用できるapex-adb-xxx擬似ヒントの確認

 Oracle APEXのレポートやチャートのソースに、オプティマイザ・ヒントを指定できます。このプロパティで指定できるオプティマイザ・ヒントには、データベースへのヒントではなくAPEXによって解釈されるヒントが含まれます。Oracle APEXでは擬似ヒントと呼んでいます。

Autonomous Databaseで使うことのできるapex-adb-high、apex-adb-medium、apex-adb-low、apex-adb-tp、apex-adb-tpurgentといった擬似ヒントがあるとのことで、確認してみました。

リソース・マネージャのコンシューマ・グループの切り替えは、以前の記事でCS_SESSION.SWITCH_SESSIONを呼び出して実装したことがあります。擬似ヒントの指定により切り替えができるのであれば、コンシューマー・グループの切り替えを簡単に実装できます。

確認作業に使用するアプリケーションを作成します。

アプリケーション作成ウィザードを起動します。

アプリケーションの名前擬似ヒントの確認とし、ページの追加をクリックします。

ダイアログが開きます。追加ページを開き、クラシック・レポートを選択します。


ページ名サービスの確認SQL問合せを選択します。ページは、クラシック・レポートです。SQL問合せとして、以下を記述します。
select
    sys_context('USERENV','SID') sid
    , sys_context('USERENV','SESSIONID') audsid
    , sys_context('USERENV','SERVICE_NAME') service_name
from dual
ページの追加をクリックします。


アプリケーションの作成を実行します。


アプリケーションが作成されました。ページ・デザイナにて、ページ番号のサービスの確認を開きます。


クラシック・レポートのリージョンサービスの確認を選択し、ソースオプティマイザ・ヒントとしてapex-adb-mediumを指定します。


アプリケーションを実行し、クラシック・レポートの表示を確認します。

サービス名が切り替わっていることが確認できます。


擬似ヒントのスペルが間違っていてもエラーは発生しないので、注意が必要です。

デバッグの完全トレースを取得し、実行されているコマンドを確認します。

レポートのソースであるSELECT文が実行される前に、execution service levelとしてapex-adb-high、apex-adb-low、apex-adb-medium、apex-adb-tp、apex-adb-tpurgentがあることが確認されています。今回テストに使用しているインスタンスはAutonomous Transaction Processingなのでapex-adb-tp、apex-adb-tpurgentが含まれますが、Autonomous Data Warehouseの場合はapex-adb-high、apex-adb-low、apex-adb-mediumの3つと思われます。

この後alter session文を発行して、サービスを切り替えています。

executing switch service SQL: "alter session set container="XXXXXXXXXXXX_APEXSERV" service="XXXXXXXXXXXX_APEXSERV_medium.adb.oraclecloud.com""


レポートのSELECT文を実行した後に、元のexecution service levelに戻しています。


Autonomous Databaseで利用できるapex-adb-xxx擬似ヒントを、簡単に確認してみました。

簡単なアプリケーションですが、以下にエクスポートを置きました。
https://github.com/ujnak/apexapps/blob/master/exports/confirm-adb-psedudo-hint.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。

2022年7月27日水曜日

ページ・アイテムを無効化すると発生するエラーの対応

 動的アクションの無効化をページ・アイテムに対して実行すると、ページの送信時にエラーが発生することがあります。

以下のページでは、チェックボックス30歳以上ですか?にチェックを入れたタイミングで、動的アクションによりチェックボックス人間ドックをチェックし、その後無効化しています。

この状態でページを送信すると「人間ドックは値YおよびNに一致する必要があります。」というエラーが発生します。

エラーになる理由と対応方法を紹介します。

上記のページの実装を見てみます。

30歳以上ですか?のチェックボックスはP1_AGE_OVER_30として作成しています。識別タイプチェックボックスを選択しています。設定デフォルトの使用ONなので、チェックが入っているときは、ページ・アイテムの値はY、そうでないときはNになります。

人間ドックのチェックボックスはP1_CLINICAL_SURVEYです。

ページ・アイテムP1_AGE_OVER_30にチェックを入れた時(値がYに変わった時)、ページ・アイテムP1_CLINICAL_SURVEYの値もYにします。

ページ・アイテムP1_AGE_OVER_30に動的アクションを作成します。

識別名前Check ON/OFFとし、タイミングイベント変更選択タイプアイテムアイテムP1_AGE_OVER_30とします。


TRUEアクションとして値の設定を選択します。設定タイプの設定としてJavaScript Expressionを選択し、JavaScript式に以下を記述します。

apex.items.P1_AGE_OVER_30.value

影響を受ける要素選択タイプアイテムアイテムとしてP1_CLINICAL_SURVEYを指定します。

これで、P1_AGE_OVER_30がチェックされたら、P1_CLINICAL_SURVEYにもチェックが入るようになります。P1_AGE_OVER_30のチェックが外れたら、P1_CLINICAL_SURVEYもチェックが外れます。


TRUEアクションを作成し、アクションとして無効化を選択します。影響を受ける要素選択タイプアイテムアイテムP1_CLINICAL_SURVEYです。

クライアント側の条件としてタイプアイテム = 値アイテムP1_AGE_OVER_30を選択し、Yとします。これでページ・アイテムP1_AGE_OVER_30にチェックが入ったとき(値がYになったとき)、P1_CLINICAL_SURVEYもYになりページ・アイテムとして無効化されます。

ページ・アイテムP1_AGE_OVER_30の値がNになったときに、ページ・アイテムP1_CLINICAL_SURVEYを有効化するTRUEアクションも作成します。

識別アクション有効化クライアント側の条件Nになります。


以上で、チェックボックス自体は想定通りの動作になります。


30歳以上ですか?のチェックボックスにチェックをいれたときは、人間ドックのチェックボックスはYになります。

この状態で送信ボタンをクリックすると、ページ・アイテムP1_CLINICAL_SURVEYは無効化されているため、サーバーに送信されません。ページ・アイテムP1_CLINICAL_SURVEYの値はYでもNでもないので、エラーが発生します。

クラスapex_disabledを使用すると、画面上の操作を禁止しても、ページの送信の対象とすることができます。

TRUEアクションの無効化を以下に置き換えます。

識別アクションJavaScriptコードの実行とし、設定コードに以下を記述します。クラスapex_disabledはページ・アイテムP1_CLINICAL_SURVEY(要素としてはinput)ではなく、その親となる要素P1_CLINICAL_SURVEY_CONTAINERに追加しています。

document.getElementById("P1_CLINICAL_SURVEY_CONTAINER").classList.add("apex_disabled");


有効化も同様に、以下のコードに置き換えます。

document.getElementById("P1_CLINICAL_SURVEY_CONTAINER").classList.remove("apex_disabled");


以上で対応は完了です。

簡単なアプリケーションですが、以下のエクスポートを置きました。
https://github.com/ujnak/apexapps/blob/master/exports/checkbox-da-error.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。

2022年7月26日火曜日

APEX 22.1の新機能 - セッション・オーバーライドを使う

 Oracle APEX 22.1の新機能の中で、フロントエンドの開発を行う方々に人気の高い機能として、セッション・オーバーライドがあります。

セッション・オーバーライドについては、この機能を開発したVincent Morneauさんが解説されています。

How to use Session Overrides in Oracle APEX 22.1
https://youtu.be/tQSBKFUzIGs?t=35

New in APEX 22.1 (Part 5): UI, PWA and Mobile
https://youtu.be/ZU2i9lSgOyk?t=2539

こちらの記事で作り直した複数言語に翻訳したアプリケーションを使って、セッション・オーバーライドの機能を試してみます。アプリケーションのエクスポートは以下にあります。アプリケーションをインポートしたのち、翻訳済みアプリケーションをパブリッシュする必要があります。
https://github.com/ujnak/apexapps/blob/master/exports/world-diners.zip


言語を切り替える


アプリケーションを実行します。4つの言語(プライマリ言語は日本語、その他のEnglish、中国語(簡体)、韓国語は翻訳されたアプリケーションです)から、日本語を選んでサインインします。


特別な実装を加えない限り、アプリケーションの言語はサインイン時に選択します。つまり、言語を切り替えるためには、サインインをし直す必要があります。

 サインインすると、アプリケーションは日本語で表示されます。


開発者ツール・バーセッションをクリックして開き、セッション・オーバーライドを実行します。


セッション・オーバーライドを設定する画面が開きます。

セッション・オーバーライドの有効化ONにし、グローバリゼーションアプリケーション言語ONにします。アプリケーション言語は英語(en)に設定します。

以上で、保存をクリックします。


画面の表示が英語に切り替わります。セッション・オーバーライドの有効化ONのときは、開発者ツール・バーセッションのスイッチの表示がONになります。


アプリケーションが翻訳されていれば、他の言語にも表示を切り替えることができます。今回のサンプルでは、中国語(簡体)と韓国語を選択することができます。

中国語(簡体)の表示は以下になります。


韓国語の表示は以下になります。


セッション・オーバーライドによって上書きされるアプリケーション言語の設定は、アプリケーション定義アプリケーション言語の導出元の設定に関わらず有効です。

例えば、アプリケーション言語の導出先としてアプリケーションのプライマリ言語が選択されている場合、APEXアプリケーションはつねにアプリケーションのプライマリ言語で動作し、翻訳された他の言語を選択することはできません。しかし、セッション・オーバーライドでは、アプリケーションがそのような設定になっていても、アプリケーション言語を変更することができます。



タイムゾーンを切り替える



グローリゼーション関連ではアプリケーション言語の他に、タイムゾーンもオーバーライドできます。

Autonomous Databaseの場合、デフォルトのタイムゾーンはUTCです。


セッション・オーバーライドを使い、タイムゾーン+9:00に設定します。


セッション・オーバーライドの設定が、CURRENT_DATECURRENT_TIMESTAMPLOCALTIMESTAMPSESSIONTIMEZONEの値に反映されている(+9:00なので、日本時間で表示されている)ことが確認できます。


セッション・オーバーライドによるタイムゾーンの設定はアプリケーション言語と同様に、アプリケーション定義グローバリゼーション自動タイムゾーンの設定に関わらず、優先されます。


自動タイムゾーンONにしている場合、異なるタイムゾーンでの動作確認やデバッグを行うためには、OSのタイムゾーンを切り替える必要がありました。

それと比べると、非常に簡単にタイムゾーンの切り替えができるようになっています。


フォントを切り替える



以前にGoogle Fontsを使用する方法について記事を書いています。この手順では、アプリケーションのフォントを切り替えた表示を確認するだけでも、アプリケーション利用者の全員に影響します(利用者全員の表示フォントが変わる)。

セッション・オーバーライドを使うことにより、他の利用者に影響を与えることなくアプリケーションを変更できます。今回はフォントの切り替えを行いますが、フロントエンドのJavaScriptやCSSであれば、同様の手法により他に影響を与えることなく開発を進めることができます。

JavaScriptおよびCSSの編集にVS Codeを使用することを前提とします。他のエディタの場合は、ローカルホストで別途Webサーバーを実行する必要が出てくるかもしれません。

VS Codeに拡張機能のLive Serverを追加します。


VS Codeのワークスペースにfonts.cssというファイルを作成します。内容として、以下を記述します。
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;700&family=Noto+Serif+JP:wght@400;700&display=swap');

:root {
    --a-base-font-family: 'Noto Sans JP';
}


APEXアプリケーションに登録済みの静的アプリケーション・ファイルを、VS Codeのワークスペースからアクセスできるようにします。


静的アプリケーション・ファイルをすべてダウンロードします。

今回の例では、静的アプリケーション・ファイルはアプリケーション・アイコンのファイルで、名前および参照よりディレクトリiconsの下に置かれていることがわかります。


ワークスペースにフォルダiconsを作成し、ダウンロードした静的アプリケーション・ファイルを移動します。


HTMLファイルを作成し、Open with Live Serverを実行しHTTPサーバーよりアクセスできるようにします。今回の例では、index.htmlというファイルを作成しています。


ブラウザが開き、HTMLの内容が表示されます。(Live Serverのデフォルトでは)URLは以下のような形式になります。

http://127.0.0.1:5500/index.html


以上でVS Code側の設定は完了です。

これからセッション・オーバーライドを使って、これまでの設定をAPEXアプリケーションに適用します。

セッション・オーバーライドの設定画面を開きます。

ファイル・パスアプリケーション・ファイル#APP_FILES#ONに変更し、http://127.0.0.1:5500/を指定します。APEXアプリケーションの静的アプリケーション・ファイルではなく、VS CodeのLive Serverからファイルを参照します。

追加ファイルCSS URLONに変更し、#APP_FILES#fonts.cssを指定します。

以上で、保存をクリックします。


使用フォントがGoogle FontsのNoto Sans JPに置き換わります。


わかりにくいので、Noto Serif JPに変更します。VS Codeでfonts.cssを変更し、保存します。


APEXアプリケーションの画面をリフレッシュすると、フォントがNoto Serif JPに変更されていることを確認できます。


これらの変更は、この変更を実施した開発者だけに適用され、他の利用者に影響はありません。

セッション・オーバーライドの有効化をOFFにすると、セッション・オーバーライドでの設定は無効になり、元々のアプリケーションの動作に戻ります。


セッション・オーバーライドの追加ファイルJavaScript URLCSS URLは、


それぞれページ・プロパティJavaScriptファイルURLCSSファイルURLに対応します。


変更を全体に適用するために、fonts.css静的アプリケーション・ファイルとして作成し、それをCSSファイルURLとして登録します。

共有コンポーネント静的アプリケーション・ファイルを開き、ファイルの作成を実行します。


fonts.cssを選択し、作成をクリックします。


静的アプリケーション・ファイルが作成され、エディタが開きます。変更の保存をクリックします。


fonts.cssを保存すると、ミニファイルされたfonts.min.cssも同時に作成されます。


ページ・プロパティCSSファイルURLとして、静的アプリケーション・ファイル参照を記述します。

#APP_FILES#fonts#MIN#.css


Oracle APEX 22.1での小さな更新として、ページ・プロパティのJavaScriptやCSSのファイルURLの記述で、コメントアウトができるようになりました。

// #APP_FILES#fonts#MIN#.css

または

/*
#APP_FILES#fonts#MIN#.css
*/

といった記述が可能です。

セッション・オーバーライドの使用方法の紹介は以上になります。

VS Codeで記述しているJavaScriptやCSSは、通常のファイルとしてバージョン管理もできます。最終的にアプリケーションをデプロイする際には、静的アプリケーション・ファイルにすることになると思いますが、セッション・オーバーライドの機能は、フロントエンドの開発効率、特に共同作業での開発効率の向上に大きく貢献するでしょう。

2022年7月25日月曜日

Oracle APEX 22.1にて翻訳済みアプリケーションを作成する

 Oracle APEX 22.1にて新たに提供されたセッション・オーバーライドの機能を確認するため、以前に作成した翻訳済みアプリケーション(こちらのワークショップ)をOracle APEX 22.1で作り直してみました。

以下にAPEXのバージョンアップに関連して、変更が必要だった手順を記載します。


ログイン・ページに言語セレクタを作成する


Oracle APEX 22.1のアプリケーション作成ウィザードは、ログイン・ページ(ページ番号9999)に言語セレクタを作成してくれないようです。言語セレクタを手作業で作成する必要がありました。

ログイン名、パスワードを入力するページ・アイテムを含むリージョン(今回の例ではリージョン世界食堂)のサブ・リージョン(Sub Region)となるリージョンを作成します。

識別タイトル言語セレクタタイプとしてPL/SQL動的コンテンツを選択します。ソースのPL/SQLコードとして以下を記述します。

APEX_LANG.EMIT_LANGUAGE_SELECTOR_LIST;

レイアウト親リージョン世界食堂位置Sub Regionsとします。外観テンプレートとしてBlank with Attributesを選択し、リージョンのタイトルや枠の表示を省略します。


フォーム付きレポートの作成手順の変更


Oracle APEX 22.1ではページ作成ウィザードが簡素化され、ページの作成が簡単になっています。日時データとタイムゾーンの扱いを確認するために、表WR_ORDERSを扱うレポートとフォームのページを作成していますが、この手順が変わります。

新しいページ作成ウィザードによる手順は、以下になります。

ページ作成ウィザードを起動し、コンポーネントクラシック・レポートを選択します。


ページ定義にて、名前注文一覧ページ・モードとして標準を選択します。ページ・モードはレポートのページに適用されます。フォーム・ページを含めるONにするとフォームのページも同時に作成されますが、フォーム・ページはつねにモーダル・ダイアログになります。

フォーム・ページを含めるONにし、フォーム・ページ名注文とします。

データ・ソース表/ビューの名前WR_ORDERSを指定します。

ナビゲーションブレッドクラムナビゲーションONにします。これらの設定はレポートのページに適用されます。フォーム・ページはつねにモーダル・ダイアログであるため、ブレッドクラムおよびナビゲーションは不要です。

以上の設定を行い、に進みます。


主キー列1として、ID(Number)を選択します。ページの作成を実行します。

クラシック・レポートのページ注文一覧がページ番号、フォームのページ注文がページ番号として作成されます。表WR_ORDERSの列MENU_IDには表WR_MENUSのIDを参照する、外部キー制約が定義されています。そのため、共有コンポーネントLOVとしてWR_MENUS.MENU_NAMEが、自動的に作成されます。

クラシック・レポートの列MENU_ID識別タイプとしてプレーン・テキスト(LOVに基づく)が選択され、LOVとして共有コンポーネントWR_MENUS.MENU_NAMEが指定されています。


フォームに含まれるページ・アイテムP3_MENU_IDも同様に、識別タイプとして選択リストが選択され、LOVとして共有コンポーネントWR_MENUS.MENU_NAMEが指定されています。


自動的に作成された共有コンポーネントのLOVWR_MENUS.MENU_NAMEは、外部キー制約の定義を元にしています。そのため、表WR_MENUSがデータ・ソースになっています。

翻訳済みのビューWR_MENUS_VLが定義済みなので、ソース表/ビューの名前WR_MENUS_VLに置き換えることにより、選択リストがそれぞれの言語に翻訳されます。



自動タイムゾーンをONにする場合は、アプリケーションの別名に日本語を含まない



Oracle APEX 22.1でも、この点は修正されていないようです。

アプリケーション定義グローバリゼーション自動タイムゾーンONにします。


このように設定した場合、アプリケーションの別名には日本語を含まないようにします。




翻訳済みアプリケーションのインポート後はパブリッシュする



翻訳済みのアプリケーションをインポートしただけでは、翻訳が有効にならないようです。アプリケーションのインポート直後は、言語セレクタが表示されません。


共有コンポーネントグローバリゼーションアプリケーション翻訳を開きます。Oracle APEX 22.1からは、翻訳済みのアプリケーションの数も表示されます。アプリケーション世界食堂はメインの言語が日本語で、翻訳として英語、中国語(簡体)、韓国語を含んでいるため、その数はになっています。


翻訳アプリケーションのパブリッシュを開きます。


翻訳済アプリケーションすべて選択し、パブリッシュを実行します。


パブリッシュを実行した後にアプリケーションを実行すると、サインインの画面で言語セレクタが表示されます。



今回作成したアプリケーションを以下に起きました。
https://github.com/ujnak/apexapps/blob/master/exports/world-diners.zip

このアプリケーションを、Oracle APEX 22.1の新機能セッション・オーバーライドの説明に使用する予定です。

以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。