2023年6月29日木曜日

いろいろなQRコードの生成方法

 最近のAPEXのOffice HourでOracle Database 23cから使用できるサーバー側のJavaScriptの使い方を紹介しています。

APEX 23.1 and server-side JavaScript: Explore the power of GraalVM/MLE
https://asktom.oracle.com/pls/apex/asktom.search?oh=20943

このセッションの中で、QRコードを生成する機能をサーバー側のJavaScriptモジュールとして作成し、APEXのアプリケーションでQRコードを生成しています。

なんとなくQRコードを生成するには、Oracle Database 23cのMLEが必要と誤解されそうな気がしたので、QRコードの生成方法をいくつか紹介します。

QRコードを生成する方法として、大きく3通りあります。
  1. ブラウザ側のJavaScriptで生成する。
  2. サーバー側のPL/SQLで生成する。
  3. サーバー側のJavaScriptで生成する。(これがDB 23cより可能になった)
アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前QR Codeとします。


アプリケーションが作成されたら、ページを作成してそれぞれの実装を行います。


ブラウザ側のJavaScriptで生成する



ブラウザ側のJavaScriptの処理でQRコードの生成を行います。以下のように動作します。


空白ページを作成します。ページ名はBrowser JSとします。

QRコードの生成には、以下のライブラリを使用します。
https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode#MIN#.js

ページ・プロパティJavaScriptファイルURLに、上記のURLを記載します。また、ファンクションおよびグローバル変数の宣言に以下を記述します。

var qrcode = null;


QRコードにエンコードする文字列を与えるページ・アイテムを作成します。

識別名前P2_SOURCEタイプテキスト・フィールドラベルSourceとします。


QRコードの生成を行なうボタンを作成します。

識別ボタン名GENERATEラベルGenerateとします。動作アクションとして動的アクションで定義を選択します。


生成したQRコードを表示するリージョンを作成します。

識別タイトルQR Codeタイプ静的コンテンツソースHTMLコードとして以下を記述します。

<div id="qrcode"></div>


ボタンGENERATEを押した時に、P2_SOURCEからQRコードを生成する処理を実装します。

ボタンGENERATE動的アクションを作成します。

名前onClick Generateタイミングはボタンのデフォルトである、イベントクリックで実行されます。


TRUEアクションJavaScriptコードの実行を選択し、設定コードに以下を記述します。



以上で実装は完了です。


サーバー側のPL/SQLで生成する



QRコードを生成するPL/SQLのパッケージを作成し、それを呼び出してサーバー側でQRコードを生成します。


パッケージは以下より入手します。
https://github.com/zorantica/plsql-qr-code

package以下にZT_QR.pksZT_QR.pkbがあります。ぞれぞれパッケージZT_QRの定義部と本体です。
https://github.com/zorantica/plsql-qr-code/tree/master/package

APEXのアイテム・プラグインも提供されていますが、今回は(リージョンにQRコードを表示するため)プラグインは使いません。ページ・アイテムにQRコードを表示する場合は、プラグインを活用できます。

ZT_QR.pks、ZT_QR.pkbは、SQLワークショップSQLスクリプトを使ってアップロードと実行を行います。


パッケージZT_QRの作成ができたら、準備は完了です。

空白ページを作成します。ページ名Server PL/SQLとします。

先ほどのブラウザ側のJavaScriptと同様に、エンコードする文字列を与えるページ・アイテムをP3_SOURCEとして作成します。


同様に、QRコードを生成するボタンをGENERATEとして作成します。


QRコードを表示するリージョンを作成します。

識別名前QR Codeタイプ動的コンテンツソース言語としてPL/SQLを選択し、CLOBを返すPL/SQLファンクション本体として以下を記述します。

ZT_QR.F_QR_AS_HTML_TABLEを呼び出し、QRコードとなるイメージを生成しています。

送信するページ・アイテムとしてP3_SOURCEを指定します。


ボタンGENERATEを押した時に、リージョンQR Codeがリフレッシュされるようにします。

ボタンGENERATEに動的アクションを作成します。

名前onClick Generateとします。タイミングはボタンのデフォルトです。


TRUEアクションとしてリフレッシュを選択します。影響を受ける要素選択タイプリージョンリージョンとしてQR Codeを選択します。


以上で実装は完了です。


サーバー側のJavaScriptで生成する



サーバー側のJavaScriptの処理でQRコードの生成を行います。Oracle Database 23cとOracle APEX 23.1が必要です

以下のように動作します。


QRコードを生成するJavaScriptのライブラリからMLEモジュールを作成します。その後、MLE環境を作成し、作成したMLEモジュールをインポートします。

SQLワークショップオブジェクト・ブラウザを開き、MLEモジュール - JavaScriptを作成します。


MLEモジュールの名前QRCODEとします。バージョンの指定は不要ですが、ここでは1.4.4を入力しています。

ソース・タイプとしてURLを選択し、URLとして以下を指定します。

https://cdn.jsdelivr.net/npm/qrcode-generator@1.4.4/+esm

MLEモジュールの作成をクリックします。


MLEモジュールQRCODEが作成されます。


MLE環境の作成を実行します。


環境名QRCODEENVとします。MLE環境の作成を実行します。


MLE環境QRCODEENVが作成されます。インポートの追加をクリックし、MLEモジュールQRCODEをインポート対象に追加します。


モジュール所有者APEXのワークスペース・スキーマを選択します。モジュール名QRCODEインポート名qrcodeとします。

作成をクリックします。


インポートが作成されます。


以上で、QRコードを生成する処理をJavaScriptのコードから呼び出すことができるようになりました。

動作を確認してみます。

SQLワークショップSQLコマンドを開き、言語としてJavaScript(MLE)環境としてQRCODEENVを選択します。

以下のコードを実行します。


結果としてdata:image/gif;base64,で始まる文字列が表示されれば、MLEモジュールと環境は正しく作成されています。


APEXアプリケーションから、作成したMLEモジュールQRCODEを呼び出せるようにするため、ML環境を設定します。

アプリケーション定義セキュリティを開き、データベース・セッションMLE環境としてQRCODEENVを設定します。


以上で、APEXアプリケーションにQRコードの生成を実装する準備ができました。

空白ページを作成します。ページ名Server JSとします。

今までの実装と同様に、エンコードする文字列を与えるページ・アイテムをP4_SOURCEとして作成します。


QRコードを生成するボタンをGENERATEとして作成します。動作アクションページの送信とします。


QRコードを表示するページ・アイテムを作成します。ページ・アイテムのイメージの表示は、先ほどのテストで出力されたdata:image/gif;base64,で始まる文字列をイメージとして表示します。

識別名前P4_QRタイプイメージの表示ラベルQRとします。設定基準としてImage URL stored in Page Item Valueを選択します。外観テンプレートとしてHiddenを選択します。


プロセス・ビューを開き、QRコードを生成するプロセスを作成します。

識別名前Generate QR Codeタイプコードを実行とします。

ソース言語としてJavaScript (MLE)を選択し、JavaScriptコードに以下を記述します。


サーバー側の条件ボタン押下時としてGENERATEを指定します。


以上で実装は完了です。

それぞれ簡単に実装できる方法を選んでいます。QRコードの生成自体はJavaScriptやPL/SQLのパッケージによって行われているため、ボタンのクリック以外でもQRコードの生成を呼び出すことはできます。

QRコードの生成方法の紹介は以上になります。

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

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