2022年4月22日金曜日

Ajaxコールバックでのダウンロードはapex.server.processでは呼び出せない件について

 以下のような相談がありました。画面上に入力した文字を、ボタンをクリックしてファイルに落としたい、とのことです。

ダウンロード処理はAjaxコールバックとして実装します。PL/SQLコードは以下になります。

このAjaxコールバックをボタンDOWNLOADから呼び出します。

ここで、ページ・アイテム(この例ではP1_TEXT)の値をAjaxコールバックに渡すために、apex.server.processを使うとエラーが発生します。


これはapex.server.processは、JSONが返されることを期待しているためです。ファイルのダウンロードを行う場合、応答はAjaxの呼び出し元ではなく、ブラウザへ戻す必要があります。

よって、ボタンDOWNLOADターゲットタイプこのアプリケーションのページページ&APP_PAGE_ID.とし、リクエストAPPLICATION_PROCESS=DOWNLOADを指定する形で、Ajaxコールバックを呼び出します。


この方法で呼び出した場合、変更されたページ・アイテムP1_TEXTの値がサーバーには保存されていないため、Ajaxコールバックで参照できません。(ページをロードしたときの値が参照される)。

この状況を回避するため、ページ・アイテムP1_TEXTに、値が変更されたらサーバーに送信して保存する動的アクションを作成しておきます。

値が変更されたときに、サーバー側のコードを実行します。実際にはページ・アイテムの値が送信されていれば良いので、送信するアイテムP1_TEXTを指定し、コードnull;とします。


以上が、ファイルをダウンロードするAjaxコールバックを呼び出す際の注意点でした。

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