2026年6月22日月曜日

APEXlang形式のエクスポート・ファイルに含まれる日本語について

Oracle APEX 26.1ではエクスポート・フォーマットとしてAPEXlangが採用されています。それまでもYAML形式などでエクスポートはできましたがインポートはできなかったため、出力されたファイルを積極的に読んだり、Gitで管理する(Gitに置くだけではなく、差分やマージを行う)ことは行われていなかったと思います。

APEXlang形式のファイルを扱っていて、ファイルに含まれる日本語について気になった点を記述します。APEXlangでのエクスポートやアプリケーションの翻訳を行わない場合は、あまり意識する必要はないでしょう。

APEXlangについては、以下のAPI Referenceを参照します。


アプリケーションの名前と別名



アプリケーション・ビルダーを使ってAPEXアプリケーションを作成する際に、アプリケーションの名前を日本語にします。通常、意識せずにアプリケーションの名前は日本語にしていると思います。


作成されたアプリケーションの名前アプリケーション別名に、作成時に指定したアプリケーションの名前が使用されます。(この他にもユーザー・インターフェースのロゴ、ホーム・ページのブレッドクラムの名前、ログイン・ページのリージョンの名前などにも反映されます)。


この部分のAPEXlangでの出力は以下でした。
app 世界食堂 (
    name: 世界食堂
    logo {
        type: text
        text: 世界食堂
    }
日本語のアプリケーション別名appに続く識別子になっています。アプリケーションの名前も本来、翻訳の対象とはならないため、日本語では無い方が望ましいと思います。

SQLclでapex exportを実行すると、アプリケーション別名が出力フォルダ名になるため、アプリケーション別名が日本語だと、日本語のフォルダが作成されます。フォルダ名が日本語だと、Gitで管理する上でも望ましく無いでしょう。

SQL> apex export -api 105 -exptype apexlang

ワークスペースAPEXDEVをエクスポートしています - アプリケーション105:世界食堂

ファイル世界食堂/application.apxが作成されました


SQL> !ls

世界食堂


SQL> 


APEX 26.1以前でも、簡易URL(friendly URLs)が有効な場合、URLにアプリケーション別名が現れます。そのため、日本語のアプリケーション別名は(アクセスできないわけでは無いが)、避けるべきでした。


上記より、APEXアプリケーションを作成したら、すぐにアプリケーション別名は英数字(およびURLに含めることが許される一部の記号)による識別子として設定すべきです。


アプリケーション別名を変更すると、エクスポートされるフォルダ名およびURLに含まれる文字列は、英数字の識別名に変わります。

SQL> apex export -api 105 -exptype apexlang

ワークスペースAPEXDEVをエクスポートしています - アプリケーション105:世界食堂

ファイルworld-diner/application.apxが作成されました


SQL> !ls

world-diner

世界食堂


SQL> 


ビューAPEX_APPLICATIONSの列ALIASおよびAPEXlangの出力では、アプリケーション別名は英大文字ですが、フォルダ名やURLとなる文字列は英子文字になります。

SQL> select application_name, alias from apex_applications;


APPLICATION_NAME    ALIAS          

___________________ ______________ 

世界食堂                WORLD-DINER    


SQL>


APEXlangのリファレンスのappの項目を見ると、appに続く名前とは別にaliasが必須プロパティとなっていますが、APEX 26.1での出力はそのようになっていません。

アプリケーション別名の変更はプロパティの変更ではなく、識別子の変更にあたります。識別子の変更は、Gitなどでアプリケーションを管理している場合は影響が大きいです。アプリケーションの名前はアプリケーションのプロパティのひとつという扱いで、翻訳の対象ではありません。


ページの名前と別名



新規にページを作成する際に、ページ定義名前は日本語にすると思います。以下ではページの名前ダッシュボードとしています。


作成されたページでは、名前ダッシュボード別名ダッシュボードタイトルダッシュボードになります。


APEXlang形式でエクスポートすると、ファイル名にp00002-ダッシュボード.apxのように日本語が含まれ、プロパティnamealiastitleが日本語になります。
page 2 (
    name: ダッシュボード
    alias: ダッシュボード
    title: ダッシュボード
    appearance {
        pageTemplate: @/standard
        templateOptions: #DEFAULT#
    }
名前Dashboard別名DASHに変更します(別名DASHBOARDにするとファイル名にどちらが採用されている分からないので、あえて名前と別名を変えています)。タイトルはページに表示される文字列で、アプリケーションの翻訳を行わない限り変更する必要はありません。


APEXlang形式の出力ファイルの名前はページの別名が使用され、p00002-dash.apxでした。ページの内容は以下のように変更されています。
page 2 (
    name: Dashboard
    alias: DASH
    title: ダッシュボード
    appearance {
        pageTemplate: @/standard
        templateOptions: #DEFAULT#
    }
ビューAPEX_APPLICATION_PAGESの列PAGE_ALIASを確認すると、別名は英大文字で保存されていますが、ファイル名およびURLに現れる文字列ともに英子文字になります。


ページの識別子はページ番号なので(API Referenceのpage参照)、ページ番号が変わらなければ同じページですが、ページの別名が変わると出力ファイルが変わります。結果として差分やマージが困難になります。ページの名前はページのプロパティのひとつですが、これも翻訳対象ではありません。


リージョンの名前と静的ID



リージョンの名前タイトルは、ページ・デザイナではリージョンを作成した後にそれぞれ設定します。タイトルを設定していないとリージョンの名前がページに表示されるため、以前からのAPEX開発者であれば、リージョンにタイトルを設定せず名前をそのまま使用している場合も多いでしょう。


APEX 26.1ではAPEXlangのサポートの関係で、それまでの詳細静的IDHTML DOM IDという名称に変更し、新たに静的IDをプロパティとして加えています。

静的IDはリージョンの新規作成時に設定した名前から決まります。上記の例であれば、リージョンの名前MENUとしているため、静的IDmenuとなっています。

一度設定されたリージョンの静的IDはロック(変更禁止)され、リージョンの名前を変更しても静的IDは変更されません。


静的IDを変更するには、最初にロックを解除する必要があります。


APEXlang形式の出力を意識せず、APEX 26.1以前と同じようにリージョンの名前に日本語(ここではメニュー)を使用し、タイトルを空白としてリージョンを作成したとします。


この場合、静的IDは日本語のメニューになります(リージョンの新規作成後、編集するページを切り替えるまでは静的IDはロックされません)。


APEXlangでの出力は以下になります。静的IDがリージョンの識別子であるため、日本語が識別子に採用されます。
    region メニュー (
        name: メニュー
        type: classicReport
        source {
            location: localDatabase
            tableName: WR_MENUS_VL
        }
リージョンの識別子を後から変更すると、別のリージョンという扱いになります。そのため、リージョンの新規作成時には、設定される静的IDに注意する必要があります。


ウィザードが割り当てるデフォルトの識別子について



アプリケーション・ビルダーを日本語で使用していると、アプリケーション作成ウィザードページ作成ウィザードいった、APEXのウィザードが生成するページやコンポーネントの識別子が日本語になっているものがあります。

例えば認証スキームOracle APEXアカウントは、名前が識別子となるためAPEXlangにそのまま出力されます。


APEXlangでの出力は以下になります。authenticationの識別子に日本語が含まれます。
authentication oracle-apexアカウント (
    name: Oracle APEXアカウント
    type: oracleApexAccounts
)
リストの出力例です。
list ナビゲーション-バー (
    name: ナビゲーション・バー

    entry app-user (
        label: &APP_USER.
        icon {
            imageIconCssClasses: fa-user
        }
        layout {
            sequence: 10
        }
        link {
            target: {
                type: url
                url: #
            }
        }
        userDefinedAttributes {
            2: has-username
        }
    )

    entry list_item (
        label: ---
        layout {
            sequence: 20
            parentEntry: @app-user
        }
        link {
            target: {
                type: url
                url: separator
            }
        }
        serverSideCondition {
            type: userIsAuthenticated
        }
    )

    entry サインアウト (
        label: &{サインアウト}.
        icon {
            imageIconCssClasses: fa-sign-out
        }
        layout {
            sequence: 30
            parentEntry: @app-user
        }
        link {
            target: {
                type: url
                url: &LOGOUT_URL.
            }
        }
        serverSideCondition {
            type: userIsAuthenticated
        }
    )

)

list ナビゲーション-メニュー (
    name: ナビゲーション・メニュー

    entry ホーム (
        label: &{ホーム}.
        icon {
            imageIconCssClasses: fa-home
        }
        layout {
            sequence: 10
        }
        link {
            target: {
                page: 1
            }
        }
    )

)
アプリケーション作成ウィザード機能や、ページ作成ウィザード機能で追加したページも、ページ名やページに含まれるリージョンの静的IDは日本語になります。


ページの名前別名タイトルともに日本語になります。


リージョンの名前静的IDも日本語になります。


APEXlang形式のファイルをGitで管理したりテキスト・メッセージベースの翻訳を検討する場合は、これらの標準コンポーネントについても対応を検討する必要があるでしょう。

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

2026年6月19日金曜日

APEX BlueprintsからAPEXlang形式のAPEXアプリケーションを生成する

Oracle APEX 26.1の新機能にBlueprintsが含まれています。以下の記事で、Oracle CorporationがGitHubで公開しているOrdery Entryの機能要件定義書や、自前で作成した従業員管理の機能要件定義書からブループリントを生成し、そのブループリントをAPEXワークスペースにインポートしてAPEXのアプリケーションを生成しています。

Order Entry版: Oracle APEX 26.1のBlueprintの生成とインポートを試してみる

現状ではブループリントからAPEXのアプリケーションを生成するには、アプリケーション・ビルダーからブループリントをインポートする必要があります。ブラウザでの作業になるため、スクリプトに組み込んで実行できません。

APEX 26.1には、ブループリントからAPEXlang形式のアプリケーションを生成するパッケージAPEX_GENDEVが含まれています。

APEX 26.1のAPI Referenceにはまだ記載されていません。そのため、仕様については今後変わる可能性がありますが、このパッケージを呼び出してブループリントからAPEXアプリケーションを生成するORDS RESTサービスを作成してみます。

ORDSモジュールとしてblueprint、テンプレートとしてprocessを作成し、マークダウンのテキストを受け付け、APEXアプリケーションのZIPファイルを返すPOSTハンドラを作成します。

以下のスクリプトを実行します。


APEXワークスペースに紐づく、パーシング・スキーマに接続して実行します。こちらの記事「サンプル・データセットのEMP/DEPTを元にAPEX Blueprintを作成しBlueprintからAPEXアプリケーションを生成する」から継続して作業を行なっていることを前提としています。

sql -name local-26ai-apexdev @ords-blueprint-process.sql

RESTサービスを呼び出すURLは以下になります。

https://ホスト名/ords/<ORDS別名=APEXワークスペース>/blueprint/process

blueprint-emp-dept % sql -name local-26ai-apexdev @ords-blueprint-process.sql


SQLcl: 金 6月 19 15:12:24 2026のリリース26.1 Production


Copyright (c) 1982, 2026, Oracle.  All rights reserved.


接続先:

Oracle AI Database 26ai Free Release 23.26.1.0.0 - Develop, Learn, and Run for Free

Version 23.26.1.0.0



PL/SQLプロシージャが正常に完了しました。


SQL> exit

Oracle AI Database 26ai Free Release 23.26.1.0.0 - Develop, Learn, and Run for Free

Version 23.26.1.0.0から切断されました

blueprint-emp-dept % 


作業ディレクトリにブループリントとしてemployees-management-blueprint.mdがあるとします。

curlコマンドを実行してブループリントをアップロードし、生成されたAPEXアプリケーションをapp.zipとして保存します。
curl -X POST -H "Content-Type: text/markdown; charset=UTF-8" -o app.zip \
--data-binary @employees-management-blueprint.md \
http://localhost:8181/ords/apexdev/blueprint/process

blueprint-emp-dept % curl -X POST -H "Content-Type: text/markdown; charset=UTF-8" -o app.zip --data-binary @employees-management-blueprint.md http://localhost:8181/ords/apexdev/blueprint/process

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100 55533    0 49375  100  6158    99k  12720 --:--:-- --:--:-- --:--:--  112k

blueprint-emp-dept % 


出力されたapp.zipの内容を確認します。

unzip -l app.zip

blueprint-emp-dept % unzip -l app.zip

Archive:  app.zip

  Length      Date    Time    Name

---------  ---------- -----   ----

      974  06-19-2026 06:19   application.apx

       33  06-19-2026 06:19   .apex/apexlang.json

       32  06-19-2026 06:19   deployments/default.json

     1619  06-19-2026 06:19   shared-components/themes/universal-theme/theme.apx

     4780  06-19-2026 06:19   shared-components/static-files/icons/app-icon-144-rounded.png

     5951  06-19-2026 06:19   shared-components/static-files/icons/app-icon-192.png

     9655  06-19-2026 06:19   shared-components/static-files/icons/app-icon-256-rounded.png

      643  06-19-2026 06:19   shared-components/static-files/icons/app-icon-32.png

    20119  06-19-2026 06:19   shared-components/static-files/icons/app-icon-512.png

      101  06-19-2026 06:19   shared-components/authentications.apx

       55  06-19-2026 06:19   shared-components/build-options.apx

      405  06-19-2026 06:19   shared-components/static-files.apx

     1483  06-19-2026 06:19   shared-components/lists.apx

      290  06-19-2026 06:19   shared-components/breadcrumbs.apx

      336  06-19-2026 06:19   shared-components/lovs.apx

      222  06-19-2026 06:19   page-groups.apx

     8634  06-19-2026 06:19   pages/p00001-employee-list.apx

    10582  06-19-2026 06:19   pages/p00002-employee-form.apx

     5665  06-19-2026 06:19   pages/p09999-login.apx

---------                     -------

    71579                     19 files

blueprint-emp-dept % 


application.apxが含まれており、正常なAPEXアプリケーションになっていることが確認できます。

app.zipはAPEXアプリケーションなので、SQLclを使用してAPEXワークスペースにインポートできます。

apex import -input app.zip

SQL> apex import -input app.zip

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

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


SQL> 


ブループリントからAPEXアプリケーションを生成する作業を、コマンドラインから実行できるようになりました。

機能要件定義書の修正からAPEXアプリケーションの生成までを、人手を解さずに実行することで、作業の繰り返しが楽になりました。

この実装では、ORDS RESTサービスを保護していません。必要に応じて、OAuthなどで保護を追加する必要があります。

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

APEX 26.1で採用されたAPEXlangのリファレンス

Oracle APEX 26.1から採用されているAPEXアプリケーションのエクポート・フォーマットであるAPEXlangについて、見つけることができたリファレンスを紹介します。

APEXlangの紹介


APEX Office HoursでのScott Spendoliniさんのセッションが、分かりやすいと思います。

Part 2: What's new in Oracle APEX 26.1

APEXlangの紹介から動画は始まります。その後、OpenAI Codexを使ったデモに移ります。

以下、デモ部分です。
  • APEXlang形式で出力したファイルの編集 [1030s]
  • 差分、マージ、競合解消 [1236s]
  • アプリケーションの翻訳 [1592s]
  • スクリーンショットからの画面レイアウト生成 [1686s]
  • APEX AI Agentsの生成 [1778s]
  • Codex Browser Useを使ったSide-by-Side編集デモ [1917s]
Oracle Corporationの公式ブログに、APEXlangの紹介記事が掲載されています。

Introducing APEXlang: The Future of Generative Application Development with Oracle APEX
https://blogs.oracle.com/apex/introducing-apexlang-the-future-of-generative-application-development-with-oracle-apex

APEXlang API Reference


Oracle CorporationのKris RiceさんがLInkedInで紹介していました。

https://docs.oracle.com/en/database/oracle/apex/26.1/apxln/


注) Typestringのとき、DetailsmaxLenが記載されています。確認したところ、数値はバイト数です。そのため、例えばmaxLen=255であれば、UTF-8の日本語では80文字程度に制限されることがあります。

EBNF(Extended Backus–Naur Form)で記述された言語仕様をダウンロードできます。

同じくKris Riceさんによる紹介記事です。
APEXlang now has a published EBNF grammar, and here's what it unlocks


APEXlang Atlas


Oracle APEXのコンポーネントとプロパティを学習するためのインタラクティブなツールです。APEXlangの構造に対応しています。

https://oracleapex.com/ords/r/apex_pm/apexlang-atlas/atlas


Oracle CorporationのSteve Meunchさんによる、APEXlang Atlasの紹介記事です。

APEXlang Atlas Interactive Learning Tool
https://blogs.oracle.com/apex/apexlang-atlas-interactive-reference

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

2026年6月18日木曜日

APEX 26.1で追加されたボタンの属性「無効として表示」を確認する

Oracle APEX 26.1でボタンの属性として「無効として表示」が追加されました。オンラインヘルプの説明は以下です。
定義されたサーバー側の条件がFALSEと評価される場合に、ボタンまたはメニュー・エントリを非表示にするのではなく、無効としてレンダリングするかどうかを指定します。

今ひとつピンとこなかったので、動作について確認してみました。

以下のようにページを作成し、ページ・アイテムP1_ITEM1P1_ITEM2の間にボタンBUTTONを配置します。


このとき、ボタンの外観無効として表示オフ(これが26.1以前の設定です)で、サーバー側の条件falseになるとき、ページは以下のように表示されます。ボタン要素は生成されず、ページにボタン要素が無いため、ページに表示されません。


このとき都合が悪いのは、ページのレイアウトが崩れることです。

APEX 26.1で新たに追加された無効として表示オンにすると、サーバー側の条件falseのときに、ボタンは無効の状態で表示されます。ページのレイアウトは変わりません。


サーバー側の条件でボタンを除外するのは、単に無効にするだけではなく、ボタンに紐づけた動作の呼び出しをブラウザから直接実行されるのを防ぐ効果があります。ボタン要素がページ上に存在しないので、JavaScriptコンソールから直接呼び出してクリックすることはできません。

レイアウトを崩さないようにするため、サーバー側の条件の代わりにページ・ロード時にボタンを無効化する動的アクションを作成できます。


このようにした場合、以下のように表示上は同じであり、ボタンはクリックできなくなっています。


しかし、動的アクション有効化を呼び出すか、それと等価な処理をブラウザ上で実行すると、ボタンを押せるようになります。


ボタンを押せるようになると、ブラウザのJavaScriptコンソールより以下のようなコードを実行することで、ボタンに紐づいたアクションを実行できます(ボタンにHTML DOM IDとしてmyButtonを割り当ててあります - 26.1から詳細静的IDHTML DOM IDという属性名に変わっています)。

document.getElementById("myButton").click();


ボタンの外観無効として表示オンとし、サーバー側の条件falseのときに表示されているボタンは、ボタンとして有効化しても、アクションを呼び出すことはできません。

ボタンを有効化すると見た目は有効に見えるようになりますが、画面上でボタンをクリックしても、JavaScriiptでclick()を呼び出しても、ボタンに紐づいたアクションは呼び出されません。


JavaScriptコンソールから以下を実行しても、動作しません。

document.getElementById("myButton").click();


サーバー側の条件による除外で期待されているセキュリティ面での要件を満たしつつ、ページ・レイアウトは崩さない設定になっています。

簡単なアプリケーションですが、動作確認に使用したAPEXアプリケーションのエクスポートを以下に置きました。


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

APEX 26.1で追加されたボタンによるメニューを実装する

Oracle APEX 26.1ではボタンの動作として2つのタイプが設定されました。標準メニューです。


標準はボタンをクリックしたときに、設定したアクションを実行します。これは26.1までのボタンの動作です。タイプとしてメニューを選択すると、ボタンにエントリとして作成されたメニューを表示します。

26.1までは、このような動作をするボタンは、メニュー・ポップアップやメニュー・ウィジェットを使って実装していました。以下の2本の記事で、メニューの実装を紹介しています。

記事1:メニュー・ポップアップから任意の処理を呼び出す

以下のGIF動画は、メニューをAPEX 26.1の動作タイプメニューのボタンで実装した動作です。動作自体は、それまでの実装とほとんど変わりません(メニュー・ウィジェットの実装では、選択されたエントリにマークを付けたり、メニュー・エントリを動的に生成することができます)。


オラクル社のToufiq Mohammedさんが、公式ブログの記事「Trigger Actions Bring Declarative Interactivity to Oracle APEX」の中(Buttons Now Support Declarative Menus)で、このメニューについて紹介されています。この記事自体は、主にAPEX 26.1で追加されたトリガー・アクションについて解説しています。記事中でトリガー・アクションでは(動的アクションとは異なり)、デフォルトで2重クリックが発生しないように対応済みと紹介されています。

以前の記事を読み返しましたが、メニュー・ポップアップとメニュー・ウィジェットの双方とも、手の込んだ実装になっていると感じました。

以下より、APEX 26.1でのメニューの実装方法について紹介します。今までの方法とは異なり、宣言的に実装できます。

ボタンSELECT_JOB動作タイプとしてメニューを選択します。


タイプメニューを選択すると、ボタンの下にノードとしてメニューが現れます。

その上でコンテキスト・メニューを表示し、メニューの作成を実行します。


メニューとしてANALYSTCLERKSALESMANMANAGERPRESIDENTを作成します。レポートの表示を絞り込む条件として、これらのメニューを選択します。

メニューの動作タイプとしてトリガー・アクションを選択します。


トリガー・アクションとして値の設定を選びます。

設定タイプ設定静的割当てを選択し、としてANALYSTメニュー名に合わせます)を設定します。

この値の設定先となるコンポーネントを影響を受ける要素に設定します。選択タイプアイテムを選び、アイテムとしてP4_JOBを設定します。この設定により、このメニューを選択したときにアイテムP4_JOBに値ANALYSTが設定されます。

検索条件の一部であるP4_JOBの値が変更されたときにレポートEmployeesがリフレッシュされるように、変更イベントの禁止オフにします。


ページ・アイテムP4_JOB動的アクションを作成します。タイミングイベント変更です。


動的アクションのTrueアクションとしてリフレッシュを選択します。影響を受ける要素選択タイプリージョンを選び、リージョンとしてEmployeesを設定します。

以上で、ボタンSELECT_JOBのメニューのエントリが選ばれたときに、ページ・アイテムP4_JOBに値が設定され、そのページ・アイテムの値の変更をトリガーとして、リージョンEmployeesの表示が更新されるようになりました。

JavaScriptによるコーディングはすべて削除しています。


APEX 26.1で追加された機能のひとつ、APEXlangビューを実行してJavaScriptのコードがページに含まれていないことを確認します。


APEXlangではコードは```で囲まれますが、APEXlangで出力したページにはJavaScriptに限らず、コードが含まれていないことが確認できます。


APEX 26.1ではメニューの作成が宣言的になり、簡単に実装できるようになりました。

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

以前のメニューの実装も含めた、APEX 26.1のメニューの実装例を以下にエクスポートしました。


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