2023年11月6日月曜日

Oracle APEXのテンプレート処理について

Oracle APEXのクラシック・レポートに適用できる従来のテンプレートと、APEX 23.1より利用できるテンプレート・コンポーネントについて、簡単に紹介します。

サンプル・データセットのEMP/DEPTに含まれる表EMPをクラシック・レポートで表示します。

アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前APEXのテンプレート処理とします。

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


ページ作成ウィザードを起動し、表EMPデータ・ソースとしたクラシック・レポートのページを作成します。

ページの作成をクリックします。


クラシック・レポートを選択します。


ページ定義名前Standardとします。クラシック・レポートを作成すると、レポート・テンプレートはデフォルトでStandardが選択されます。データ・ソース表/ビューの名前としてEMPを指定します。それ以外は、デフォルトの設定を適用します。

ページの作成を実行します。


クラシック・レポートを含むページが作成されます。

クラシック・レポートのリージョンを選択し、プロパティ・エディタの属性タブを開きます。外観テンプレートとしてStandardが選択されていることが分かります。


テンプレートの定義は共有コンポーネントテンプレートに含まれています。


テンプレートのタイプがレポートのテンプレートStandardが見つかります。


レポート・テンプレートのテンプレートStandardは、汎用列(列テンプレート)というタイプです。


ページ・デザイナからテンプレート・オプションとして指定できるCSSクラスが定義されています。


行の前として、レポートの先頭に出力されるHTMLが定義されています。


列ヘッダーとして表のヘッダー行として出力されるHTMLが定義されています。汎用列の場合、置換文字列#COLUMN_HEADER#列のヘッダー名に置き換えられます。


各行の前として<tr>が定義されています。


列テンプレートが定義されています。汎用列の場合、置換文字列#COLUMN_VALUE#列の値に置き換えられます。

列テンプレートの条件を指定することにより、最大4つの列テンプレートに切り替えることができます。


各行の後として</tr>が定義されています。


行の後として、レポートの末尾に出力されるHTMLが定義されています。


ページ送りの表示を除けば、上記の設定でHTMLのTABLE要素が完成します。

Oracle APEXが提供する装飾を除いた、単純なTABLE要素を生成するテンプレートを作成します。

テンプレート一覧より作成をクリックします。


テンプレート・タイプとしてレポートを選択します。


通常は既存のテンプレートのコピーを修正して新しいテンプレートを作る方が容易です。今回は仕組みを説明するためにテンプレートを作成するため、レポート・テンプレートの作成最初からを選択します。

へ進みます。


新しく作成するテンプレートの名前Simple Table 1とします。テンプレート・タイプとして汎用列(列テンプレート)を選択します。

テーマ42. Universal Themeです。テンプレート・クラス標準を選択します。Oracle APEX 5.0以前は複数のテーマがサポートされていたため、この選択肢が残っています。最近のOracle APEXのテーマはUniversal Themeのみであるため、この選択肢にそれほど意味はありません。

作成をクリックします。


レポート・テンプレートとしてSimple Table 1が作成されます。


作成したテンプレートSimple Table 1を開き、HTMLのTABLEを表示するための最低限の設定を行います。説明を簡単にするため、ページ送りの表示は除きます。

行の前<table>です。


列ヘッダーの前<thead>列ヘッダー・テンプレート<th>#COLUMN_HEADER#</th>列ヘッダーの後</thead><tbody>です。


各行の前<tr>です。


列テンプレート<td>#COLUMN_VALUE#</td>です。列テンプレートの条件を使用することにより、列のデータを参照してテンプレートを切り替えたり、偶数行と奇数行で適用するテンプレートを切り替えることができます。

Oracle APEX 23.1で導入されたテンプレート・コンポーネントでは、テンプレート・ディレクティブを使って表示形式を切り替えることができるようになりました。そのため、最大4つのテンプレートしか切り替えれらないという制限は無くなりました。


各行の後</tr>です。


行の後</tbody></table>です。


以上で(ページ送りを除いて)表EMPの内容を、最も単純な形でHTMLのTABLE要素として表示できるようになりました。

先ほど作成したStandardテンプレートを使ったページをコピーし、レポート・テンプレートとして今回作成したSimple Table 1を適用します。ページ区切りタイプページ区切りなし(すべての行の表示)に変更します。


表示する列を全て選択し、ソート可能オフにします。ソート可能オンの場合、置換文字列COLUMN_HEADERにソートを適用するためのHTMLタグが追加されます。


上記の変更を行い、表EMPのレポートを表示します。

出力されたHTMLを確認すると、定義したテンプレートに表EMPの値が埋め込まれたHTMLが、ほぼそのまま出力されていることが確認できます。


例えば、列テンプレート1の定義のstyleとしてmin-width: 400pxを与えてみます。

<td style="min-width: 400px">#COLUMN_VALUE#</td>


レポートの表示は以下のように、TD要素のstyleとしてmin-width: 400pxが適用された表示に変わります。


Oracle APEXは、定義されたテンプレートにデータを穴埋めしてHTMLを出力します。そのため、テンプレート定義を変更すると表示形式を自由に変更できます。ただし、標準のテンプレートでのCSSクラスの割り当てを変更すると、表示がレスポンシブ(デバイスやブラウザの表示領域の大きさに従って自動的にレイアウトを調整する)で無くなる可能性が高くなります。

先ほど作成したレポート・テンプレートのタイプは汎用列(列テンプレート)でした。

同じHTMLを生成するレポート・テンプレートを、もう一つのタイプ名前付き列(行テンプレート)で作成してみます。

先ほどと同様にテンプレートの作成を開始します。

今回は名前Simple Table 2テンプレート・タイプとして名前付き列(行テンプレート)を選択します。

作成をクリックします。


テンプレート・タイプ名前付き列(行テンプレート)の場合は、行テンプレート1として、以下の1行を記述します。

<tr><td>#ENAME#</td><td>#JOB#</td><td>#MGR#</td><td>#HIREDATE#</td><td>#SAL#</td><td>#COMM#</td><td>#DEPTNO#</td></tr>


最初の行の前と最後の行の後のテキストとして以下を記述します。

行の前です。

<table>
    <thead>
        <tr><th>ENAME</th><th>JOB</th><th>MGR</th><th>HIREDATE</th><th>SAL</th><th>COMM</th><th>DEPTNO</th></tr>
    </thead>
    <tbody> 

行の後です。

    </tbody>
</table>

作成したレポート・テンプレートをクラシック・レポートに適用すると、以下の表示になります。


名前付き列のテンプレートはテンプレートに列名が埋め込まれていることにより、汎用列のテンプレートのようにデータ・ソースの定義を選ばない用途では使えません。

名前付き列の場合は汎用列とは異なり、一行の単位で書式を決めることができます。簡単な例では、列ENAMEだけmin-width: 400pxを適用するといったことが可能です。列テンプレートの条件を設定する必要はありません。

<tr><td style="min-width: 400px">#ENAME#</td><td>#JOB#</td><td>#MGR#</td><td>#HIREDATE#</td><td>#SAL#</td><td>#COMM#</td><td>#DEPTNO#</td></tr>


レポートは以下のように表示されます。


Oracle APEX 23.1の新機能として、テンプレート・コンポーネントが追加されています。テンプレート・コンポーネントは、レポート・テンプレートの名前付き列(行テンプレート)の汎用性の無さを解消しています。

同じ出力を行うテンプレート・コンポーネントを作成します。

テンプレート・コンポーネントは共有コンポーネントプラグインに含まれます。


作成をクリックします。


プラグインの作成として最初からを選択します。

へ進みます。


作成するプラグインの名前Simple Table TCとします。タイプとしてテンプレート・コンポーネントを選択します。レポートで使用するため、テンプレート次として使用可能複数(レポート)チェックを入れます。


テンプレート部分に以下を記述します。今回は遅延ロードの対応は含めません。

<td>#ENAME#</td><td>#JOB#</td><td>#MGR#</td><td>#HIREDATE#</td><td>#SAL#</td><td>#COMM#</td><td>#DEPTNO#</td>

レポート本文に以下を記述します。#APEX$ROWS#は、次に記述するレポート行が複数生成されたデータに置換されます。

<table>
    <thead>
        <tr>
            <th>ENAME</th><th>JOB</th><th>MGR</th><th>HIREDATE</th><th>SAL</th><th>COMM</th><th>DEPTNO</th>
        </tr>
    </thead>
    <tbody>
    #APEX$ROWS#
    </tbody>
</table>

レポート行に以下を記述します。#APEX$PARTIAL#部分に置換されます。

<tr #APEX$ROW_IDENTIFICATION#>#APEX$PARTIAL#</tr>

プライグインの作成をクリックします。


プラグインとしてSimple Table TCが作成されます。開いて内容を確認します。


テンプレート部分に含まれている置換文字列より、カスタム属性が設定されています。

Hiredateを開き、設定を変更します。


デフォルト値ヘルプ・テキストおよびデモ値といった設定ができます。

今回は設定データ型日付にします。

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


テンプレート・コンポーネントSimple Table TCが作成されました。

作成したテンプレート・コンポーネントSimple Table TCを使って、レポートを表示します。

テンプレート・コンポーネントを使用する場合は、リージョンの識別タイプとしてSimple Table TCを設定します。


プロパティ・エディタ属性タブを開き、設定属性と列のマッピングを設定します。レポート・テンプレートとは異なり、テンプレート内の置換文字列と列名が一致している必要はありません。遅延ロードの処理をテンプレート・コンポーネントに記載していないため、これはオフにします。


作成したページを実行すると、ほぼ同じ表示になります。


名前付き列(行テンプレート)と同様に、テンプレート部分を以下のように書き換えると、レポートの表示が変わります。

<td style="min-width: 400px;">#ENAME#</td><td>#JOB#</td><td>#MGR#</td><td>#HIREDATE#</td><td>#SAL#</td><td>#COMM#</td><td>#DEPTNO#</td>


Oracle APEXのテンプレート処理の紹介は以上になります。

今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sample-apex-templating.zip

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