Flows for APEXを使って作った経費精算のAPEXアプリケーションをデモ・アプリケーションとして公開するにあたり、見栄えを少々改善しました。
https://apex.oracle.com/pls/apex/japancommunity/r/expenseclaim/
作業中に気がついたことをメモします。
プロセス変数を設定するプラグインで通貨を扱えない
経費精算を申請する画面を以下のように整えてみました。
支払額を入力するページ・アイテムの書式マスクとして、金額を表す
FM$999G999G999G999G990D00
を設定しています。
こうすると、ORA-6502が発生しました。
ORA-06502: PL/SQL: 数値または値のエラー: 文字から数値への変換エラー。が発生しました
Flows for APEXが提供しているプロセス・プラグインFlows for APEX - Manage Flow Instance Variables [プラグイン]で、通貨を適切に数値に変換できないことが原因のようです。
ワークアラウンドとして、直接APIを呼び出すプロセスに置き換えます。
begin
flow_process_vars.set_var(
pi_prcs_id => flow_globals.process_id
, pi_var_name => 'EXPENSE_AMOUNT'
, pi_num_value => to_number(:P3_EXPE_AMOUNT,'FML999G999G999G999G990D00')
);
end;
プロセスのタイプをコードの実行に変更し、上記のPL/SQLコードを記述します。
Flows for APEXはオープンソースのプロジェクトとしてGitHubでホストされているので、Issueとして登録したり、自力で修正してプルリクエストをあげることもできます。
https://github.com/flowsforapex/apex-flowsforapex/
ビルド・オプションのコメント・アウト
最近のAPEX Office Hourにて、開発者のNeil Fernandezさんが紹介しているビルド・オプションの使い方です。
前のセクションで説明したように、Flows for APEXのプロセス・プラグインで通貨をプロセス変数としと保存できませんでした。そのため、ワークアラウンドとしてPL/SQLコードを記述しています。不具合が修正されたら、PL/SQLコードからプラグインに簡単に戻せるように、プラグイン自体は削除したくありません。
サーバー側の条件のタイプとしてなしを選ぶことにより、常に実行をしない設定にすることもできますが、すでにサーバー側の条件が設定済みの場合は条件を変更する必要があります。
このような場合、ビルド・オプションにコメント・アウトを設定します。
この設定で、プロセスが処理の対象から外れます。
共有コンポーネントのビルド・オプションを開くと、コメント・アウトの定義を確認することができます。
ビルド・オプションによる評価の方が、サーバー側の定義よりも負荷の軽い処理になります。そのため、単に処理対象から除外する場合は、ビルド・オプションの使用が推奨されます。
通貨記号の変更
通貨記号はNLSパラメータのNLS_CURRENCYで決まっています。Oracle APEXのアプリケーションでは、アプリケーションのプライマリ言語またはアプリケーション言語の導出元から決まる言語より、NLS_CURRENCYが決まります。
言語が日本語であれば、NLS_CURRENCYは¥になります。各種の日付書式(アプリケーション日付書式、アプリケーションのタイムスタンプ書式、アプリケーションのタイムスタンプ・タイムゾーン書式)とは異なり、グローバリゼーションのページには、NLS_CURRENCYを独立して設定する項目はありません。
経費精算のアプリケーションのプライマリ言語は日本語ですが、通貨は米ドルを扱います。そのため、NLS_CURRENCYを$に設定します。
アプリケーションのセキュリティ属性のデータベース・セッションに、以下の初期化PL/SQLコードを記述します。
begin
execute immediate 'alter session set nls_currency = ''$'' ';
end;
APEXのページ処理は常にデータベース内で行われます。その処理を行うデータベース・セッションの初期化時に、必ずNLS_CURRENCYに$を設定します。結果として言語環境は日本語ですが、通貨の表記は$になります。
例えば、申請された経費精算の一覧は以下のようになり、申請額は$200.00と表示されます。