Oracle DatabaseにはXMLを扱う機能が組み込まれています。この機能を使って、デジタル庁が提供しているPeppolのデジタルインボイスのサンプルを表形式で表示してみます。
デジタルインボイスの標準仕様(JP PINT)については、デジタル庁のサイトで説明されています。
デジタルインボイスのサンプルは、こちらのサイトからダウンロードできるファイルpint-jp-resources-dev.zipに含まれています。
pint-jp-resources-dev.zipを展開すると、
trn-invoice/example以下に9つのサンプルがあります。これらのファイルをOracle Databaseに読み込み、ファンクションXMLTABLEを使ってXMLから表形式のデータに変換します。
20945 10-25-2022 00:35 trn-invoice/example/Japan PINT Invoice UBL Example6-CorrInv.xml
9210 10-25-2022 00:35 trn-invoice/example/Japan PINT Invoice UBL Example2-TaxAcctCur.xml
16042 10-25-2022 00:35 trn-invoice/example/Japan PINT Invoice UBL Example4-SumInv2.xml
21151 10-25-2022 00:35 trn-invoice/example/Japan PINT Invoice UBL Example5-AllowanceCharge.xml
21655 10-25-2022 00:35 trn-invoice/example/Japan PINT Invoice UBL Example9-SumInv1 and O.xml
19305 10-25-2022 00:35 trn-invoice/example/Japan PINT Invoice UBL Example3-SumInv1.xml
9817 10-25-2022 00:35 trn-invoice/example/Japan PINT Invoice UBL Example1-minimum.xml
12551 10-25-2022 00:35 trn-invoice/example/Japan PINT Invoice UBL Example7-Return.Quan.ItPr.xml
29603 10-25-2022 00:35 trn-invoice/example/Japan PINT Invoice UBL Example.xml
デジタルインボイスであるXMLファイルを保存するための表PEPPOL_DOCUMENTSを作成します。
以下のDDLを実行します。
アップロードしたファイルは列CONTENTにBLOBとして保存します。アップロードしたファイルをBLOBに保存したあとに、BLOBからXMLTYPEに変換し列INVOICEに保存します。
XMLTYPEで保存されているインボイスを表形式に変換します。XMLTABLEはビューから呼び出すように実装しました。以下のビューを作成します。左がビュー名、右が対応しているXML要素です。
XPathと列名の対応の確認を容易にするため、表名や列名に長い名前を付けています。識別子が30バイトまでという制限のある、古いOracle Databaseでは実行できません。
peppol_invoice_v:/Invoice
peppol_invoice_billing_reference_v:/Invoice/cac:BillingReference
peppol_invoice_additional_document_reference_v:/Invoice/cac:AdditionalDocumentReference
peppol_invoice_accounting_supplier_party_v:/Invoice/cac:AccountingSupplierParty
peppol_invoice_accounting_customer_party_v:/Invoice/cac:AccountingCustomerParty
peppol_invoice_payee_party_v:/Invoice/cac:PayeeParty
peppol_invoice_tax_representative_party_v:/Invoice/cac:TaxRepresentativeParty
peppol_invoice_delivery_v:/Invoice/cac:Delivery
peppol_invoice_payment_means_v:/Invoice/cac:PaymentMeans
peppol_invoice_payment_terms_v:/Invoice/cac:PaymentTerms
peppol_invoice_prepaid_payment_v:/Invoice/cac:PrepaidPayment
peppol_invoice_allowance_charge_v:/Invoice/cac:AllowanceCharge
peppol_invoice_tax_total_v:/Invoice/cac:TaxTotal
peppol_invoice_tax_total_tax_subtotal_v:/Invoice/cac:TaxTotal/cac:TaxSubtotal
peppol_invoice_invoice_line_v:/Invoice/cac:InvoiceLine
peppol_invoice_invoice_line_document_reference_v:/Invoice/cac:InvoiceLine/cac:DocumentReference
peppol_invoice_invoice_line_allowance_charge_v:/Invoice/cac:InvoiceLine/cac:AllowanceCharge
peppol_invoice_invoice_line_item_additonal_item_property_v:/Invoice/cac:InvoiceLine/cal:Item/cac:AdditionalItemProperty
peppol_invoice_invoice_line_item_classified_tax_property_v:/Invoice/cac:InvoiceLine/cal:Item/cac:ClassifiedTaxProperty
peppol_invoice_invoice_line_item_commodity_classification_v:/Invoice/cac:InvoiceLine/cal:Item/cac:CommodityClassification
ビューを作成するDDLは、記事の最後に添付します。
作成した表とビューを使って、デジタルインボイスのサンプルのアップロードと表示を行うAPEXアプリケーションを作ります。
アプリケーション作成ウィザードを起動します。名前はPeppolとします。
デフォルトで作成されるホーム・ページを削除し、代わりに対話モード・レポートのページを追加します。
ページ名はDocumentsとします。表またはビューにPEPPOL_DOCUMENTSを選択します。
上記の設定でアプリケーションの作成をクリックします。
アプリケーションが作成されたら、ファイルのアップロードに関係する設定を修正します。
対話モード・レポートのページを開き、列CONTENTを選択します。
BLOB属性のMIMEタイプ列、ファイル名列、最終更新列、文字セット列として、それぞれCONTENT_MIMETYPE、CONTENT_FILENAME、CONTENT_LASTUPD、CONTENT_CHARSETを設定します。
フォームのページを開き、ページ・アイテムP2_CONTENTに同様の設定を行ないます。
ファイルのアップロード後に、BLOBをXMLTYPEに変換し保存するプロセスを作成します。
フォームのページでプロセス・ビューを開き、プロセスの作成を実行します。
作成したプロセスはプロセス・フォームPeppol Documentsとダイアログを閉じるの間に配置します。識別の名前はバイナリXMLで保存、タイプはコードを実行を選択します。
ソースのPL/SQLコードとして、以下のコードを記述します。BLOBのデータを、XMLTYPEに変換して列INVOICEに保存しています。
update peppol_documents
set invoice = sys.xmltype(content, NLS_CHARSET_ID('AL32UTF8'))
where id = :P2_ID;
サーバー側の条件のタイプにリクエストは値に含まれるを選択し、値としてCREATE,SAVEを指定します。ボタン作成または変更の適用を押した時に、このプロセスが実行されます。
以上でサンプルのデジタルインボイスのアップロードができるようになりました。
アプリケーションを実行し、サンプルのファイルをアップロードします。
デジタルインボイスの内容を表示するページを作成します。
ページの作成を実行します。
空白のページを選択します。
ページ番号は
3、
名前は
Invoiceとします。
ページ・モードは
標準で、
ナビゲーションはデフォルトのまま、変更しません。
ページの作成をクリックします。
ページInvoiceが作成されます。
最初にページ・プロパティのナビゲーションの保存されていない変更の警告をOFFにします。表示するインボイスを切り替えたときに、警告が表示されないようになります。
表示するインボイスを選択するページ・アイテムを作成します。
識別の名前はP3_INVOICE_ID、タイプとして選択リストを選びます。ラベルはInvoiceとします。
設定の選択時のページ・アクションとして、Redirect and Set Valueを選択します。
LOVのタイプにSQL問合せを選択し、SQL問合せとして以下を記述します。
select content_filename d, id r from peppol_documents
追加値の表示をOFF、NULL値の表示をON、NULL表示値として-- Select Invoice --を記述します。
ビューPEPPOL_INVOICE_Vをソースとした対話モード・レポートを作成します。
作成した対話モード・レポートの識別のタイトルはInvoiceとします。タイプは対話モード・レポートです。ソースの表名にPEPPOL_INVOICE_Vを選択します。
WHERE句に以下を記述し、ページ・アイテムP3_INVOICE_IDで選択されているインボイスの内容が表示されるように限定します。(サンプルは9つだけなので、未選択の場合はすべてのインボイスについて表示します。)
:P3_INVOICE_ID is null or invoice_id = :P3_INVOICE_ID
外観のテンプレートにStandardを選択し、テンプレート・オプションのRemove Body Paddingにチェックを入れます。テンプレートIntractive Reportの場合、レポートのタイトルが表示されません。
この時点でアプリケーションを実行すると、以下のようにビューPEPPOL_INVOICE_Vから参照できる情報がレポートに表示されます。
残り16個のビューについても、同様に対話モード・レポートを作成します。
重複を使うと作業が早くできます。
以上でアプリケーションは完成です。アプリケーションを実行すると、記事の先頭のGIF動画のように動作します。
今回作成したAPEXアプいケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/peppol.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完
ビューを作成するDDL