2026年7月2日木曜日

APEX 26.1でのAPEXlang形式のエクスポートにパブリックおよびプライベート・レポートが含まれない

Oracle APEX 26.1のリリース・ノートに記載されていますが、APEXlang形式のエクスポートには、パブリック・レポート、プライベート・レポート、レポート・サブスクリプション、ワークフロー・インスタンス、タスク・インスタンスが含まれません。

Release Note, Release 26.1


Note

In APEX 26.1, exporting runtime data such as Public Reports, Private Reports, Report Subscriptions, Workflow Instances, and Task Instances is not supported for APEXlang exports.


ただし、APEXlang Atlasで確認すると、APEXlangとしては、regionコンポーネントにsavedReportコンポーネント(app.page.region.sasvedReport)を含むように定義されていることが確認できます。
そのため、遠くない将来にこれらのレポートもエクスポート/インポートの対象になることが期待できます(逆に言うと、APEXlangの仕様に含まれていないものは、近日中の対応が期待できない)。

将来的に対応されるとしても、APEXlang形式のエクスポートにパブリック・レポートやプライベート・レポートが含まれていない現状は、対策が必要です。

1番の対策は、APEXアプリケーションをバックアップ用途でエクスポートする際に、SQL形式のフル・エクスポートを取得する、ことです。

SQL形式のフル・エクスポートがあれば、APEXアプリケーションを回復できます。

以下より、パブリック・レポートとプライベート・レポートの回復手順を確認します。

確認するために、対話モード・レポートと対話グリッドのページを含んだAPEXアプリケーションSaved Report Checkを作成しました。それぞれのレポートに、パブリック・レポートとして「部門給与総額チャート」、プライベート・レポートとして「部門SALES一覧」を作成しています。

https://github.com/ujnak/apexapps/blob/master/exports/saved-reports-check.zip

データ・ソースとして、サンプル・データセットEMP/DEPTに含まれるビューEMP_DEPT_Vを使用しています。

対話モード・レポートのパブリック・レポート「部門給与総額チャート」は、以下のように表示されます。


対話モード・レポートのプライベート・レポート「部門SALES一覧」は、以下のように表示されます。


対話グリッドのパブリック・レポート「部門給与総額チャート」は、以下のように表示されます。


注記)

対話グリッドで、パブリック・レポート「部門給与総額チャート」に切り替えた直後、チャートが表示されません。


チャートの編集をクリックし、設定の保存をし直すとチャートが表示されます。


また、チャートのソート基準を設定してAPEXアプリケーションをエクスポートしていますが、インポートするとソート基準がラベルに戻ります。


対話グリッドでは、APEXlang形式でパブリック・レポートのエクスポートとインポートができました。APEXlangによるエクスポート・インポートでも上記のように動作します。SQLでのエクスポート/インポートで発生することより、この事象についてはAPEXlang特有ではなさそうです。

注記終わり

対話グリッドのプライベート・レポート「部門SALES一覧」は以下のように表示されます。


このAPEXアプリケーションSaved Report Checkを、APEXlang形式でエクスポートします。

エクスポートにはSQLclを使用します。ワークスペースのスキーマに接続します。

インポートしたアプリケーションSaved Report CheckのアプリケーションIDを確認します。

apex list

SQL> apex list

WORKSPACE_ID        WORKSPACE    APPLICATION_ID    APPLICATION_NAME          BUILD_STATUS       LAST_UPDATED_ON  LAST_UPDATED_BY    

7098825076992820    APEXDEV      101               Saved Report Check        Run and Develop                                        

7098825076992820    APEXDEV      109               Projects                  Run and Develop    26-06-29         APEXDEV            

7098825076992820    APEXDEV      110               Projects - Home           Run and Develop    26-06-29         APEXDEV            

7098825076992820    APEXDEV      111               Projects - Main           Run and Develop    26-06-29         APEXDEV            

7098825076992820    APEXDEV      113               My Themes                 Run and Develop    26-06-29         APEXDEV            

7098825076992820    APEXDEV      114               Projects - Boilerplate    Run and Develop    26-06-29         APEXDEV            



SQL> 


見つけたアプリケーションIDを指定し、APEXlang形式でアプリケーションをエクスポートします。上記ではアプリケーションIDが101なので、101を対象とします。

オプションに-exppubreports -expsavedreportsをつけて、エクスポートの対象にパブリック・レポートとプライベート・レポートを含めるようにします。

apex export -applicationid 101 -exptype apexlang -exppubreports -expsavedreports

SQL> apex export -applicationid 101 -exptype apexlang -exppubreports -expsavedreports

ワークスペースAPEXDEVをエクスポートしています - アプリケーション101:Saved Report Check

ファイルsaved-report-check/application.apxが作成されました


SQL> 


アプリケーションIDを変えて、エクスポートしたAPEXアプリケーションをインポートします。

apex import -id 102 -input saved-report-check

パブリック・レポートの部門給与総額チャートという名前が英数字ではないと怒られます。

SQL> apex import -id 102 -input saved-report-check

アプリケーションID: 102をワークスペース: APEXDEVにインポートしています

APEXLangコンパイル・エラー:

ファイル: pages/p00002-interactive-grid.apx

行: 195

列: 8

タイプ: INVALID_EXTERNAL_IDENTIFIER

エラー: Invalid external identifier: 部門給与総額チャート

Static Identifier contains invalid characters. Only letters, numbers and underscores are supported.




SQL> 


エラーを回避するためファイルp00002-interactive-grid.apxを開き、パブリック・レポートの名前をTotalSalByDnameChartに変更します。

!vi saved-report-check/pages/p00002-interactive-grid.apx

p00002-interactive-grid.apxの以下の部分を
        savedReport 部門給与総額チャート (
            visibility: alternative
            name: 部門給与総額チャート
            view {
                chart: true
                default: chart
            }
以下に変更します。
        savedReport TotalSalByDnameChart (
            visibility: alternative
            name: TotalSalByDnameChart
            view {
                chart: true
                default: chart
            }
レポート名を英数字の名前に変更すると、インポートに成功します。

SQL> apex import -id 102 -input saved-report-check

アプリケーションID: 102をワークスペース: APEXDEVにインポートしています

インポートに成功しました。


SQL> 


アプリケーションを実行し、インポートされたレポートを確認します。

対話モード・レポートについてはレポートがインポートされていません。

p00001-home.apxの内容を確認すると、そもそもsavedReportとしてエクスポートされているのはprimaryのみで、その他のレポートはエクスポート自体されてません。


対話グリッドはパブリック・レポートのTotalSalbyDnameChartのみが見つかります。プライベート・レポートはエクスポート自体されていません。


パブリック・レポートやプライベート・レポートがAPEXlang形式のエクスポートに含まれていれば、将来APEXが更新されてレポートをインポートできるようになる可能性があります。しかし、実際にはエクスポート自体に含まれていないので、将来のAPEXで回復できるようになることはありません。

これまでの作業を実施していると、パブリック・レポートとプライベート・レポートを含むAPEXアプリケーションが101として存在し、そのアプリケーションをAPEXlang形式でエクスポートしたのちインポートし直したAPEXアプリケーションが102として存在しています。

海外のブログ記事ですが、Rafal Grzegorczykさんがアプリケーション間でレポートをコピーする手順を紹介されています。

Lost all your Oracle APEX public/private reports? Here’s how to recover them.

この記事に記載されている、レポートをコピーするコードの変数l_old101l_new102を指定して実行します。このスクリプトはスキーマAPEX_260100への読み書きを行うため、SYSDBA権限を持つユーザーで実施します。

上記の記事に記載されている作業を行うと、対話モード・レポートについてはパブリック・レポート「部門給与総額チャート」とプライベート・レポート「部門SALES一覧」が回復します。


または、SQL形式のエクスポートをインポートしてAPEXアプリケーションを作成したのち、APEXlang形式のエクポートを同じアプリケーションIDでインポートすると、レポートの設定を維持したまま、アプリケーションが入れ替えられるようです。

動作を確認します。

SQL形式のエクスポート・ファイルsaved-report-check.zipをインポートします。新規アプリケーションIDを自動割当てします。


アプリケーションがインポートされたら、アプリケーションIDを確認します。


APEXlang形式のエクスポートを上書きインポートします。

apex import -id 112 -input saved-report-check

SQL> apex import -id 112 -input saved-report-check

アプリケーションID: 112をワークスペース: APEXDEVにインポートしています

インポートに成功しました。


SQL> 


アプリケーションを確認します。パブリック・レポートを呼びプライベート・レポートが維持されていることが確認できます。


対話モード・レポートについては、パブリック・レポートの名前「部門給与総額チャート」が「TotalSalbyDnameLocal」に変わっていますが、パブリック・レポートおよびプライベート・レポート共に、維持されています。


APEX 26.1で導入されたAPEXlangですが、APEXアプリケーションのバックアップ用途には十分とは言えません。アプリケーションのバックアップを目的としている場合は、SQL形式でエクスポートしておくと安心です。

今回の記事は以上になります。

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