ラベル 対話モード・レポート の投稿を表示しています。 すべての投稿を表示
ラベル 対話モード・レポート の投稿を表示しています。 すべての投稿を表示

2025年4月15日火曜日

パッケージAPEX_IRのEXPORT_SAVED_REPORTSとIMPORT_SAVED_REPORTSを使ってみる

パッケージAPEX_IRのAPIリファレンスを参照したところ、このようなファンクションやプロシージャはあったかな?というのを見つけました。EXPORT_SAVED_REPORTSとIMPORT_SAVED_REPORTSです。Oracle APEXのいつのバージョンから追加されたのか、ChatGPTに聞いてみました。

「Oracle APEX: from which version provides IMPORT_SAVED_REPORTS and EXPORT_SAVED_REPORTS in PL/SQL package APEX_IR?」

ChatGPTによる回答としては、23.2からとのこと。23.1と23.2のAPIリファレンスを確認したところ、確かに23.2から追加された機能でした。

The IMPORT_SAVED_REPORTS and EXPORT_SAVED_REPORTS procedures in the APEX_IR PL/SQL package were introduced in Oracle APEX version 23.2. These procedures allow developers to programmatically import and export saved interactive reports, including both default and user-defined reports, facilitating easier migration and backup of report configurations.

For detailed information on these procedures, you can refer to the Oracle APEX 23.2 documentation:

APIリファレンスの説明には、EXPORT_SAVED_REPORTSには「This function exports multiple saved reports from the current app and workspace. Exports default or user-saved reports.」、IMPORT_SAVED_REPORTSには「This procedure imports saved reports into an app in the current workspace. Supports importing default or user-saved reports.」と書いてあるだけで、インポートできるレポートの条件が記載されていません。

調べたところ、レポートをインポートできる条件は以下でした。
  • 同じワークスペースまたはワークスペースIDが同じワークスペース(この場合インスタンスは異なる)にあり、元のIDをオンにしてエクスポートしたファイルをインポートしたアプリケーション間で、対話モード・レポートに作成したレポートのエクスポートとインポートができる。
  • アプリケーションIDは異なっていても、対話モード・レポートに作成したレポートのエクスポートとインポートができる。
  • ワークスペースが異なる(つまりインスタンスが異なる)場合、同じ公開鍵と秘密鍵を元にWeb資格証明のキー・ペアを作成する必要がある。
手短に言うと、対話モード・レポートで作成したレポートのエクスポートとインポートは、同一もしくは同一と見做せるAPEXアプリーション間で実施できます。

APEXアプリケーションを作成し、動作を確認してみました。作成したAPEXアプリケーションのエクスポートは、以下に置いています。
https://github.com/ujnak/apexapps/blob/master/exports/ir-report-export-and-import.zip

最初にopensslを使ってRSAのキー・ペアを生成します。秘密鍵がprivate.pem、公開鍵がpublic.pemとして作成されます。

openssl genrsa -out private.pem 4096
openssl rsa -in private.pem -outform PEM -pubout -out public.pem

% openssl genrsa -out private.pem 4096                            

% openssl rsa -in private.pem -outform PEM -pubout -out public.pem


writing RSA key

% ls

private.pem public.pem

% 


認証タイプがキー・ペアのWeb資格証明を作成します。

共有コンポーネントのWeb資格証明を開きます。


作成をクリックします。


名前はAPIリファレンスの例にあったmy_API_key_pairにします。静的IDも同じ値にします。認証タイプにキー・ペアを選択します。

公開キーに先ほど生成したpublic.pemの内容を貼り付けます。秘密キーおよび秘密キーの検証にprivate.pemの内容を貼り付けます。

以上で作成をクリックします。


Web資格証明としてmy_API_key_pairが作成されます。


検証を行うAPEXアプリケーションを紹介します。

ページに表EMPをソースとした対話モード・レポートをひとつ作成しています。その他に以下のコンポーネントを作成しています。
  1. 対話モード・レポートに作成されているレポートを選択するポップアップLOVのページ・アイテムP1_REPORT_IDS
  2. 上記のポップアップLOVで選択したレポートを、テキスト領域のページ・アイテムにエクスポートするボタンEXPORT
  3. テキスト領域のページ・アイテムの内容を、対話モード・レポートのレポートとしてインポートするボタンIMPORT
  4. インポートするレポートの新しい所有者を指定するページ・アイテムP1_NEW_OWNER
  5. レポートの出力先であるテキスト領域のページ・アイテムP1_EXPORT_CONTENT


アプリケーション内でWeb資格証明を置換文字列G_CREDENTIALで指定できるように、アプリケーション定義の置換に、置換値としてmy_API_key_pairを設定します。


エクスポートするレポートの選択にはタイプがポップアップLOVのページ・アイテムP1_REPORT_IDSを使用します。ラベルはReport IDsとします。

APEX_IR.EXPORT_SAVED_REPORTSは複数のレポートを一度にエクスポートできるため、複数の値のタイプに区切りリストを選択し、セパレータに':'を指定します。

ポップアップLOVにレポート名とレポート・タイプを表示するため、共有コンポーネントのLOVとしてIR_REPORTSを作成し、それをLOVに設定します。


共有コンポーネントのLOVとしてIR_REPORTSを作成します。ソースのSQL問合せに以下を記述します。サインインしたユーザーが所有しているレポートと、公開レポートを選択できる対象としています。
select
    report_id
    ,report_name
    ,report_type
from apex_application_page_ir_rpt
where application_id = :APP_ID and page_id = :APP_PAGE_ID
and (
    status = 'PUBLIC'
    or /* status = 'PRIVATE' and */
    report_type = 'PRIVATE' and application_user = :APP_USER
)
列のマッピングの戻り値にREPORT_IDを選択し、それに加えて追加表示列としてREPORT_NAMEとREPORT_TYPEを含めています。


ボタンEXPORTをクリックしたときに、プロセスEXPORTを実行します。プロセスEXPORTではタイプにAPI呼出しを選択し、APEX_IR.EXPORT_SAVED_REPORTSを呼び出します。


ファンクションの結果はページ・アイテムP1_EXPORT_CONTENTに出力します。


引数p_report_idsには、値のPL/SQL式として以下を設定します。

apex_string.split_numbers(:P1_REPORT_IDS,':')


引数p_credential_static_idには静的値として&G_CREDENTIAL.を設定します。


ボタンIMPORTをクリックしたときに、プロセスIMPORTを実行します。プロセスIMPORTではタイプにAPI呼出しを選択し、APEX_IR.IMPORT_SAVED_REPORTSを呼び出します。


引数p_export_contentにはページ・アイテムP1_EXPORT_CONTENTを指定します。それ以外の引数p_replace_report、p_new_application_idはAPIデフォルト、p_new_ownerにはページ・アイテムP1_NEW_OWNERを割り当て変更できるようにしていますが、通常は無指定にしてサインインしたユーザーを対象にします。


作成したAPEXアプリケーションの説明は以上です。

アプリケーションを実行し、レポートのエクスポートとインポートの動作を確認します。

最初に対話モード・レポートに表示する列としてEmployee Name、Job、Salary、Commissionを選択し、Employee Name = SCOTTのフィルタ条件を設定します。


アクション・メニューのレポートからレポートの保存を開きます。


名前付きレポートとして保存を選択し、名前にMy Reportを指定します。

適用をクリックします。


対話モード・レポートに設定されている条件が、レポートMy Reportとして保存されます。


ポップアップLOVをクリックすると、作成したレポートMy Reportが選択できます。タイプはPRIVATEです。


My Reportを選択しボタンExportをクリックします。Export ContentにエクスポートされたレポートがJSONドキュメントとして表示されます。


保存されたレポート = "My Report"の右に表示されている X をクリックします。


「これらのレポート設定を削除しますか。」と聞かれるので、適用をクリックします。


レポートMy Reportは削除されますが対話モード・レポートに設定された条件は残るので、一旦レポートをリセットします。


今度はExport Contentに出力されているJSONドキュメントを、レポートとしてインポートします。

ボタンImportをクリックします。


レポートがインポートされ、対話モード・レポートに適用されます。


同一のアプリケーションへのレポートのエクスポート/インポートが確認できました。

アプリケーション間でレポートをコピーするには、エクスポート時に元のIDをオンにしたエクスポートを元にアプリケーションを作成する必要があります。


インスタンスが異なる場合は、コピーするワークスペースの間でIDが一致している必要があります。また、双方のワークスペースにWeb資格証明が必要です。

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

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

完

2025年2月6日木曜日

APEX 24.2で追加された対話モード・レポートのページ区切りの保持について

Oracle APEX 24.2では動的アクションのリフレッシュの設定として、ページ区切りの保持が新設されました。


APEX 24.2では対話モード・レポートに限定されますが、リージョンのリフレッシュ時に表示されているページ区切り(ページ位置)が維持されます。

この新機能の最初の印象は「もともと、そういう動きをしていなかった?」です。なので、24.2でページ区切りの保持をオンにして動作を確認した後、24.2以前の動作も確認してみました。

最初に24.2でページ区切りの保持をオンにしたときの動作を確認しました。

サンプル・データセットの表EMPをソースとした、フォーム付き対話モード・レポートのページを作成しました。


ページ区切りを有効にするため、ページごとの行数に5を設定します。


1ページのレポートに5行表示されるようになりました。次のページを2回クリックします。


レポートには11から14行目が表示されます。(誰でもよいのですが)従業員TURNERのCommissionを100に変更するため、編集フォームを開きます。


Commissionを100に変更し、変更の適用をクリックします。


対話モード・レポートは行11から14までが表示されています。TURNERのCommissionは100に変更されています。


もともと、こういう動きだと思い込んでいたので、24.1で同じ作業をしてみます。

24.1のリフレッシュにはページ区切りの保持という設定がありません。


同じ作業を行うと、ページが先頭に戻りました。


もともと、そういう動きでした。

Oracle APEX 22.1からですが、リリース・ノートにIdeas App Implementationsのセクションが含まれています。このセクションにはOracle APEXのIdeasアプリケーションに登録されたものの中から、実際に実装されたものが一覧されています。


この機能はFR-1843 Refresh Region: Keep Pagination and Scroll Positionとして登録されたアイデア(つまりエンハンスメント・リクエスト)です。

少し気になったので、従業員の追加を行ってみました。ページ区切りが保持されると、追加した従業員はどこに表示されるのか確認します。


レポートは従業員名の昇順で一覧するように設定されているので、追加した従業員はその条件で表示されます。今回は従業員名をALLEEとしたので、先頭ページに表示されます。


従業員の追加直後のレポートではページ区切りは保持され、それまで10行目から14行目にあったデータが、11行目から15行目としてレポートに表示されています。

また、ページ区切りの保持をオンにすると、レポートの高さが固定されているときのスクロール位置も保持されます。

レポートの高さを固定するには、属性のヘッダーの固定にリージョンを選択し、最大のレポートの高さとしてピクセル数を設定します。今回は200とします。


ページごとの行数を10に変更します。


レポートの高さが200ピクセルだと、ページごとの行数が10でも表示されるのは最大6行です。レポート全体を表示するにはレポートをスクロールさせます。

最も下の行が表示されるようにスクロールし、従業員MILLERの給与を更新します。


給与を変更し、変更の適用をクリックします。


ページ区切りの保持がオンであれば、レポートのリフレッシュ後もスクロール位置は変わりません。


APEX 24.2以前、またはページ区切りの保持がオフであれば、スクロール位置は先頭に戻ります。


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

完

2024年7月25日木曜日

各種レポートでのソート設定について

Oracle APEXで一般に使用されている対話モード・レポート、対話グリッド、クラシック・レポートでは、ソースのSQL問合せにORDER BY句を含めず、列に対してソートの設定を行なうことが推奨されています。

以下より、サンプル・データセットのEMP/DEPTに含まれる表EMPをソースとした対話グリッド、対話モード・レポート、クラシック・レポートのそれぞれで、給与の降順で10人だけをレポートに表示する設定を紹介します。

対話グリッド


ソースのSQL問合せを以下とします。

select * from emp


列SALのユーザーの有効化のソートをオンにします。


対話グリッドの属性のページ区切りのタイプをページにします。スクロールの場合、対話グリッドに表示される行数はリージョンの大きさで決まります。ページにすると表示される行数を指定できます。


対話グリッドのアクションのデータからソートを開きます。


ソート列としてSalを追加し、方向に降順を選択して保存します。


アクションの書式のページごとの行数を開き、10を選択します。


これでレポートに給与の降順で10行が(最初に)表示されるようになりました。

アクションのレポートの保存を実行し、デフォルトのレポート形式として設定します。




対話モード・レポート



ソースのSQL問合せを以下とします。

select * from emp


列SALのユーザーの有効化のソートをオンにします。


対話モード・レポートのアクションのデータからソートを開きます。


1番目の列にSal、方向に降順を選択し、適用します。


アクションの書式のページごとの行数を開き、10を選択します。


これでレポートに給与の降順で10行が(最初に)表示されるようになりました。

アクションのレポートのレポートの保存を開きます。


保存(開発者にのみ表示)にデフォルトのレポートとして保存を選択し、適用します。


デフォルトのレポート・タイプとして主を選択し、適用します。


これで、現在のレポートがデフォルトの表示形式として保存されました。


クラシック・レポート



ソースのSQL問合せを以下とします。

select * from emp


列SALを選択し、ソートのデフォルト順序に1、方向に降順を設定します。ユーザーによるソート方向の変更を許可しない場合は、ソート可能をオフにします。

クラシック・レポートではレポートの表示形式を保存することができず、デフォルトの表示形式というのもありません。ソート順を限定する場合は、他の列のソートのソート可能をオフにする必要があります。


クラシック・レポートの属性のレイアウトの行数のタイプに静的値を選択し、行数として10を設定します。


これでレポートに給与の降順で10行が(最初に)表示されるようになりました。


クラシック・レポートではOrder by項目(並替え基準)を設定できます。並替え基準については以下の記事で紹介しています。

APEX 22.1の新機能 - 並替え基準を使う

完