2023年6月2日金曜日

APEX 23.1の新機能コンテキスト依存ヘルプの日本語対応

 Oracle APEX 23.1の新機能に、コンテキスト依存ヘルプというものがあります。

Oracle APEXのオンライン・ヘルプにドキュメントの表示というボタンが含まれている場合ががあります。このボタンをクリックすると、今までは製品ドキュメントのトップ・ページが開いたのですが、23.1からは関連するページが開かれるようになっています。

便利になりましたが、いかんせん英語のドキュメントが開きます。

仕組みを調べて、日本語のドキュメントが開くようにしてみました。

製品ドキュメントの位置は、管理サービスにサインインした後、インスタンスの設定より実施します。


インスタンスの設定のヘルプのセクションに、ヘルプのURLの指定が含まれます。


今までは、ボタンドキュメントの表示をクリックしたときに、このヘルプのURLとして設定されているURLを開いていました。23.1からは、製品ドキュメントを開く際に?context=コンテキストという引数が与えられています。

例えば、本記事の最初の画像にある製品ドキュメントは、以下のURLより呼び出されています。

https://apex.oracle.com/doc231?context=4000:510

このコンテキストの値と呼び出されるURLの対応は、以下のファイルに記述されています。

https://docs.oracle.com/en/database/oracle/apex/23.1/context-sensitive-help.js

コンテキストとURLの対応は英語のドキュメントが元になっています。とはいえ、URLやアンカーは日本語のドキュメントでも維持されているはずなので、この対応をそのまま使います。

一番最初に、コンテキストとURLの対応を保存する表CSH_CONTEXT_SENSITIVE_HELPを作成します。
create table csh_context_sensitive_help
(
    context varchar2(40) not null,
    url     varchar2(400) not null
);

context-sensive-help.jsを読み込んで、コンテキストとURLの対応を作成した表CSH_CONTEXT_SENSITIVE_HELPに書き込みます。JavaScriptのファイルの位置はAPEXのバージョンに依存して変更されます。また、内容に関してもAPEXがバージョン・アップされると変更される可能性はあります。

SQLワークショップのSQLコマンドより実行します。


コンテキスト依存ヘルプのリクエストを受け付けて、適切な製品ドキュメントのURLを返すRESTサービスを作成します。

SQLワークショップのRESTfulサービスを開き、モジュールの作成を実行します。


モジュール名はContext Sensitive Help、ベース・パスは/help/とし、モジュールの作成をクリックします。


モジュールContext Sensitive Helpが作成されます。完全なURLにモジュール名が含まれているようですが、表示上の問題なので無視できます。

続けて、テンプレートの作成をクリックします。


URIテンプレートとしてpageを指定します。

テンプレートの作成をクリックします。


テンプレートpageが作成されます。

ハンドラの作成をクリックします。


作成するハンドラのメソッドとしてGETを選択します。ソース・タイプはPL/SQLです。ソースとして、以下を記述します。Oracle APEX 23.1の製品ドキュメントはまだ日本語訳が無いため、代わりにOracle APEX 22.2の日本語ドキュメントのURLをC_BASE_URLに設定しています。

パラメータとしてcontextを受け付け、表CSH_CONTEXT_SENSITIVE_HELPよりリダイレクト先を見つけて、クライアントにリダイレクトを要求しています。


リダイレクト先をHTTPの応答ヘッダーのLocationとして返すため、パラメータを追加します。

行の追加をクリックし、パラメータをひとつ追加します。

追加したパラメータの名前はLocation、バインド変数はlocation、アクセス・メソッドはOUT、ソース・タイプとしてHTTP HEADER、データ型としてSTRINGを指定します。


以上でハンドラの作成を実行します。

作成されたハンドラの完全なURLをコピーします。


このURLをAPEXのインスタンスの設定のヘルプのURLとして設定します。

管理サービスにサインインし、ヘルプのURLを変更します。


以上の変更で、コンテキスト依存ヘルプとして日本語の製品ドキュメントが開くようになります。


本記事は以上になります。

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

完

2023年6月1日木曜日

Oracle APEXのアップグレード(5) - アプリケーションのアップグレード

Oracle APEXのアップグレードに伴い、作成済みのアプリケーションで必要になる対応についてまとめてみます。

カナダにあるパートナーのInsum(現在はフランスのTalanという会社の一部)の方が、APEXアプリケーションのアップグレードについて記事を書いてます。参考になります。

10 steps to upgrading your Oracle APEX applications
https://www.insum.ca/10-steps-to-upgrading-oracle-apex/

上記の記事では、最初にリリース・ノートを読むことを推奨しています。

例えば、Oracle APEX 23.1のリリース・ノートは以下です。

https://docs.oracle.com/en/database/oracle/apex/23.1/htmrn/

リリース・ノートが日本語に翻訳されるまでにはタイムラグがあるため、英語で確認する必要があります。

New Featuresについてはapex.oracle.comのトップページから辿れる場所に、わかりやすい形でまとめられることが多いため、そちらを参照することができます。

Changed Behavior、Deprecated Features、Desupported Features、Open Bugs and Known Issuesなどは要確認です。


アップグレード前に必ずバックアップを取得する


アップグレードに限りませんが、アプリケーションの改変を行う前にバックアップを取得しましょう。特にアップグレードの場合は、バックアップからリストアする以外に元に戻す方法はありません。

最初にアプリケーションをエクスポートすることにより、バックアップを取得してみます。

アプリケーション・ビルダーでアップグレードする対象のアプリケーションを開き、エクスポート/インポートを実行します。

実行するタスクとして、エクスポートを選択します。

エクスポートを実行すると、アプリケーションがファイルとしてダウンロードされます。複数のファイルに分割をオンにすると、ZIP形式のファイルとしてアプリケーションがエクスポートされます。オフの場合は、ひとつのSQLスクリプトがエスクポートされます。

バックアップの取得を忘れていた場合には、現在から〇〇分前(5分程度の遅延あり)に数値を設定した上でエクスポートを行うと、過去の時点のアプリケーションのエクスポートを取得できます。遡れる時間はUNDO保存期間とUNDO表領域の容量に依存します。

また、エクスポートはしたのだけれどファイルを無くしてしまったような場合(上書きなど)、そのファイルをインポートしてアプリケーションを作成した実績があれば、エクスポート・リポジトリに保存されているかもしれません。諦める前に確認してみましょう。

アプリケーションのバックアップとしてエクスポート以外に、アプリケーションのコピーもバックアップとして使えるでしょう。コピーしたアプリケーションを、アップグレードのテストに使用するケースの方が多いかもしれません。

アプリケーションのコピーは、アプリケーション・ビルダーより呼び出します。


Oracle APEX 20.1からは、アプリケーションのバックアップ機能が標準で提供されています。この機能の説明はこちらの記事で紹介しています。

アプリケーション・ビルダーのバックアップの管理、またはユーティリティのバックアップの管理から、バックアップの取得/リストアを実施します。

ワークスペースのユーティリティにバックアップの管理が含まれます。

対象となるアプリケーションのバックアップを作成します。

バックアップの作成をクリックします。


コメントを入力し、バックアップをクリックします。


作成されたバックアップが一覧に表示されます。このバックアップを使った、リストアやダウンロードを実施できます。

コマンドライン・ツールのSQLclが使用できる場合は、ワークスペースに存在するAPEXアプリケーションを一括でエクスポートすることも可能です。こちらの記事で、その方法を紹介しています。


テーマのリフレッシュ


アップグレード対象のアプリケーションの共有コンポーネントを開くと、テーマのリフレッシュとラベルが振られたボタンが表示されます。以下のように説明されています。

新しいバージョンのユニバーサル・テーマを使用できます。テーマをリフレッシュすると、新しい機能、機能拡張およびバグ修正が有効になります。


テーマをリフレッシュすると新しい機能、機能拡張、バグ修正が有効になります。これはテンプレート・ファイルが置き換えられるためですが、結果としてアプリケーションのルック&フィールが変わる可能性があります。Oracle APEX自体のアップグレードよりも、既存のアプリケーションに与える影響が大きいです。本番利用しているアプリケーションでは、テーマをリフレッシュする前に十分な検証を行いましょう。

共有コンポーネントのテーマからユニバーサル・テーマ(Universal - Theme 42)を開いて、テーマのリフレッシュを実行することによって変更される内容を確認します。

テーマの編集画面にテーマのリフレッシュを行うボタンがあります。こちらはアップグレードに関係なく、いつでも実施可能です。


現在のテーマが参照している静的ファイルは、#IMAGE_PREFIX#themes/theme_42/21.1/以下に配置されてます。


テーマに含まれているテンプレートの更新日付を見てみます。大抵の場合、Oracle APEXがアップグレードされる以前に日付になっていて、APEXのアップグレードによって更新されていないことが確認できるはずです。


テーマのリフレッシュを行います。

アプリケーションの互換性モードに、現在のAPEXのバージョンが含まれていないとテーマのリフレッシュに失敗します。

今回はAPEX 21.1から23.1へのアップグレードを試みているため、互換性モードを更新する必要があります。


互換性モードの違いは、リリース・ノートのCompatibility Modeで説明されています。


互換性モードの21.2 / 22.1 / 22.2 / 23.1での変更として、以下の説明がされています。

Prior to Oracle Application Express 21.2, all processes of the current processing point have been executed regardless of the added errors.

In Oracle Application Express 21.2, calling APEX_ERROR.ADD_ERROR in a process stops further processes from executing and immediately displays the inline errors.

APEX 21.2以降は、APEX_ERROR.ADD_ERRORを呼び出した時点で後続の処理をせず、エラーを表示するような動作に変わった、と説明されています。

変更点に問題がないことを確認し、アプリケーション定義のプロパティの互換性モードを変更します。


再度、テーマのリフレッシュを実行すると、今度はテンプレートおよびテンプレート・オプションがマスター・テーマからリフレッシュされました。と表示されます。


リフレッシュ後の静的ファイルは、#IMAGE_PREFIX#themes/theme_42/23.1/以下を参照するようになっています。


テーマに含まれているテンプレートは、すべて更新されています。


Oracle APEXの画面で使用しているJavaScriptやCSSのライブラリなどは、セキュリティ上の修正を有効にするため、テーマのリフレッシュの実施にかかわらず更新されるものがあります。そのため、テーマのリフレッシュをしなければ100%以前のユーザー・インターフェースを維持できる、ということではありません。

Oracle APEXは、おおまかに言うと、保存されているHTMLのテンプレート・ファイルにSQLの実行結果を埋め込むことにより、完全なHTMLページを生成します。Oracle DatabaseがアップグレードされていなければSQLの実行結果は変わりませんし、テンプレートが変わっていなければ、その穴埋めした結果も変わりません。そのため、まずはOracle APEX自体はアップグレードして、テーマのリフレッシュを行う前に十分にテストを実施する、といった段階を分けたアップグレードのアプローチが有効です。

テーマのリフレッシュを実施しAPEXのバージョンとユニバーサル・テーマのバージョンを一致させていないと、ページ・デザイナを使ったアプリケーションの修正が制限されることがあります。そのため、APEXのアップグレード後にアプリケーションを修正する場合は、最初にテーマのリフレッシュを実施することをお勧めします。


コンポーネントのアップグレード



更新可能なコンポーネントの一覧は、アプリケーション・ビルダーのユーティリティに含まれる、アプリケーションのアップグレードから確認およびアップグレードが可能です。

ユーティリティを開きます。


アプリケーションのアップグレードを開きます。


主に今回のアップグレードで提供されている新機能を適用できる候補がリストされます。


ここにリストされているコンポーネントのアップグレードは必ず実施しなければいけない、といったものではありませんが、検討する価値はあります。

以下のアップグレード・タイプについて、どのような更新が行われるのか確認してみます。

URLでJavaScriptのかわりに宣言型確認ダイアログを使用するためのボタンのアップグレード

候補オブジェクトの数値をクリックし、アップグレードの対象を一覧します。


DELETEボタンの設定がアップグレード対象であることがわかります。

DELETEボタンの設定を確認すると、動作のターゲットとしてjavascriptが埋め込まれていることがわかります。


このjavascriptにより、削除ボタンを押したときにポップアップを表示しています。


アップグレードを実行します。


アップグレードが実施され、候補として表示されなくなりました。


DELETEボタンのターゲットからjavascriptの記述は除かれ、確認の要求にチェックが入れられています。メッセージもjavascriptに埋め込まれていましたが、置換文字列で置き換えられています。


更新されたページを実行すると、以下のように表示されます。


メッセージが英語になりましたが、アプリケーション言語が英語(en)の設定であるため、この表示が正しいです。アプリケーション言語を日本語(ja)に変更し、確認のスタイルをデフォルトから危険に変えてみます。


アップグレードされたAPEXに含まれる新機能を、比較的簡単に適用することができました。

Insumの記事では、以下の検討を推奨しています。

  1. 新たに提供されているAPEXのPL/SQL APIやJavaScript APIを確認し、有用なものがあれば過去のコードを書き換える。
  2. 3rdパーティのツールにOliver Lemmさんが作成したAPEX Visualizerというものがあります。これを使うと、非推奨やデサポートになった機能を一覧できるとのことです。
  3. アプリケーションが使用しているプラグインを確認する。
  4. アプリケーションのテストをすること。
アプリケーション定義のユーザー・インターフェースのJavaScriptのセクションで、非推奨またはサポート対象外になったJavaScript関数を含むがチェックされている、jQuery移行を含めるがオンでないことを確認します。

そのような古い関数を使うJavaScriptのコードを書いている場合は、書き直しの検討をお勧めします。


Oracle APEXのアップグレードに関する説明は以上になります。

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

完

Oracle APEXのアップグレード(4) - ADBのAPEXのクローンとアップグレード

 Autonomous Databaseのクローン作業を確認します。Always Free枠のAutonomous Databaseは2インスタンスまで作成できるため、使用中のAutonomous Databaseをクローンし、アプリケーションの更新やテストを行うことができます。

Autonomous Databaseのクローンを作成するには、他のアクションのクローンの作成を実行します。


アップグレードのテストに使用する場合は、クローン・タイプとしてフル・クローンを選択します。ソースのクローニングとしてデータベース・インスタンスからのクローニングを選択します。クローンはインスタンスを実行したまま実施できます。

表示名およびデータベース名を指定します。以下の例では表示名はClone-of-APEXDEV、データベース名はAPEXTESTとしています。


管理者資格証明のパスワードを設定します。


ネットワーク・アクセスの選択、ライセンスとOracle Databaseエディションの選択などを選択し(Always Freeの場合はほとんど選択肢はありません)、Autonomous Databaseのクローンの作成を実行します。


しばらく待つと、クローンであるAutonomous Databaseのインスタンスが作成されます。


作成されたAutonomous Databaseのインスタンスを使って、APEXのアップグレード前のテストを行うことができます。

APEXの管理サービスにサインインすると、APEXのアップグレードの猶予期間が表示されます。Always Freeのインスタンスでは、新しいバージョンのAPEXが利用可能になってからAPEXのアップグレードが実施されるまでに、45日の猶予期間が与えられています。猶予期間の延長はできません。

この期間の間にアップグレードのテストを完了する必要があります。猶予期間が満了すると、APEXは自動的にアップグレードされます。


有償のAutonomous Databaseの場合は、猶予期間を45日から90日に延長することができます。

使用可能な更新の案内に表示されている歯車のアイコンをクリックします。


アップグレード・ウィンドウを90日に変更し、変更の適用をクリックします。


以上で新しいバージョンのAPEXが利用可能になったときの猶予期間が延長されました。


アップグレードの猶予期間は、新しいバージョンのAPEXが利用可能になった後に延長することとはできません。延長された猶予期間は、次のアップデート・サイクルから適用されます。

この設定は、APEXのインスタンス・パラメータのUPGRADE_DEFERREDに相当します。90日に延長されている場合は、値がYになります。

begin
dbms_output.put_line(apex_instance_admin.get_parameter('UPGRADE_DEFERRED'));
end;



値を変更するには、apex_instance_admin.set_parameterを呼び出します。

begin
apex_instance_admin.set_parameter('UPGRADE_DEFERRED','N');
end;


API呼び出しにて変更された設定は、管理サービスでの表示に反映されます。


Autonomous DatabaseのAPEXアプリケーションは、最大でも90日の間にアップグレードの検証を完了する必要があります。

管理サービスの使用可能な更新に表示されている即時アップグレードをクリックすると、APEXはアップグレードされます。


確認のダイアログが表示されるので、即時アップグレードをクリックします。


管理サービスのページに、アップグレードが開始された旨、表示されます。


開発環境にサインインすると、以下のメッセージを確認できます。

Oracle APEXインスタンスを新しいリリースにアップグレード中です。 アプリケーションへの変更は、アップグレード・プロセスの間は無効化されます。アプリケーションおよびOracle APEX開発環境へのアクセスは、最大3分間中断されます。
アップグレードの最中は、アプリケーションの変更は実施すべきではありません。


アップグレードの作業自体は、apexins.sqlの実行と等価と考えて良いので、後はアップグレードの終了を待つだけになります。

バージョンの切り替え時はページ・アクセスの際にエラーが発生します。最大でも3分間で解消します。


バージョンの切り替えが終わった後に、言語リソースのロードが始まります。そのため、開発環境にアクセスすると、当初は英語だけになります。


ロードされているのは開発ツールの言語リソースなので、作成済みのアプリケーションの日本語表示に影響はありません。また、ユーザーが作成したアプリケーションは利用可能です。

ロードが完了した言語リソースから利用可能になります。


すべての言語リソースがロードされるまでにかなりの時間がかかりますが、最終的には10言語が利用可能になります。


続く