はじめに
Odooには、外部システムからデータへアクセスするための External API が備わっており、Excel VBA等を使ってOdooモデルのデータ操作や自動抽出が可能です。
Odooの進化に伴い、従来のJSON-RPC API(execute_kw 方式)から、より高速かつ統一された External JSON-2 API への移行が進んでいます。
-
旧仕様: External RPC API(
OdClient/OdRepository) -
新仕様: External JSON-2 API(
Od2Client/Od2Repository)
ライブラリ odoo-json-rpc-2-vba では、新旧いずれのAPIであってもファサードインターフェース(OdxRepository)を介すことで、VBAコード側の実装を変更することなく透過的に操作できるよう設計されています。
また、本ライブラリは JSON-RPCベースの通信処理 を行い、ADODB.Recordset の内部保持・双方向操作(追加・更新) や External ID(ir.model.data)の連携 にも対応しています。
アーキテクチャの概要
odoo-json-rpc-2-vba は、レイヤー構造によりネットワーク通信とVBA側でのデータ利用を疎結合に保っています。
主なモジュール
-
Od2Client/Od2Repository:
新しい External JSON-2 API 専用の通信クライアントおよびリポジトリ。データベース名とAPIキー/トークンを用いた効率的なJSON-RPC通信を行います -
OdxRepository(ファサード):- APIバージョンの違いを吸収し、スキーマの自動キャッシュ(
GetModelSchema)やCRUD操作を統一しています -
External ID(
ir.model.data)のサポート: 外部識別子(module.xml_id)からのモデル・レコードID解決や、外部IDベースでのUPSERT操作等に対応しています
- APIバージョンの違いを吸収し、スキーマの自動キャッシュ(
-
OdxModel:-
ADODB.Recordsetを内部に保持しており、取得したデータをそのままVBAの標準レコードセットとして扱えます - 単なる参照だけでなく、Recordset経由でのデータの追加(AddNew)や更新(Update)を行い、Odoo側へ変更を同期・反映させること(双方向操作)が可能です
- 階層的なリレーション追跡やExcelシートへのデータ展開を直感的に実現します
-
Odoo / ADODB データ型マッピングの仕様
Odooの各フィールド型は、ADODB.Recordsetに次のように自動変換されます。
| Odoo Field | ADODB Field | 変換・格納ルール |
|---|---|---|
| Boolean | adBoolean |
True / False
|
| Char / Selection | adVarWChar |
文字列 |
| Float | adDouble |
浮動小数点数(VBA Double) |
| Integer | adInteger |
32ビット整数(VBA Long) |
| Text / Html | adLongVarWChar |
改行コードを相互変換(Odoo: \n $\leftrightarrow$ ADODB: vbCrLf) |
| Monetary | adCurrency |
通貨型(演算誤差を防止) |
| Date | adDBDate |
日付文字列(YYYY-MM-DD)とVBA Date型の相互変換 |
| Datetime | adDate |
UTC日時文字列(YYYY-MM-DD HH:NN:SS)とVBA Date型(ローカル日時)の相互変換 |
| Many2one |
adInteger + adVarWChar
|
ID と 表示名 (Display Name) の2列を生成 |
| One2many / Many2many | adLongVarWChar |
関連ID群を JSON配列文字列(例: "[1, 2, 3]")として格納 |
ここに示した以外にも、Reference、Many2oneReference、Binary、Image の各フィールドに対応しています。
サンプルプログラム
Windows環境で、実際の動作を検証することができます。
開発環境の準備
1. クローンの取得
次のコマンドで、リポジトリのクローンを取得します。
git clone --recursive https://github.com/jp-rad/odoo-json-rpc-2-vba
2. Excelサンプルファイルの作成
次のコマンドを実行するとxlsmファイルとxlamファイルが作成されます。
cd odoo-json-rpc-2-vba
./create_workbook.bat
Excelの事前準備
create_workbook.batを実行する前に、Excelのセキュリティセンターを開き、「マクロの設定」 で、「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」 にチェックを入れてください。
詳しくは: Programmatic access to Office VBA project is denied
3. Excelファイルの参照設定
作成されたxlsmファイルとxlamファイルを開き、VBAエディタで、参照設定をします。
- xlsmファイル:
- Microsoft ActiveX Data Objects 6.1 Library
- OdooJsonRpc2VBA
- xlamファイル:
- Microsoft ActiveX Data Objects 6.1 Library
参照設定後、それぞれのファイルを保存してください。
4. odooの起動と準備
odoo-json-rpc-2-vbaは、Docker使って、odooを試すことができるようになっています。
次の手順でodooを起動し、準備を行います。
- Docker Desktopを起動する
- VS Codeでodoo-json-rpc-2-vba を開く
-
Reopen in ContainerでDockerを開始する - https://localhost/oreore にアクセスし、証明書をダウンロードする(オレオレ証明書)
- ダウンロードした証明書を「現在のユーザー」の 「信頼されたルート証明機関」ストア へインストールする
- VS Codeの
Run & Debugで、Odoo addonsを開始する - https://localhost/ にアクセスし、admin / admin でodooにログインする
- odooの左上のキューブアイコンから、
Settingsを選び、設定画面を開く - 設定画面の最下部にある
Activate the developer modeをクリックする - 設定画面の最下部に
Load demo dataが出現するので、それをクリックし、Yes, ...で実行する - odooの左上のキューブアイコンから、
Appsを選び、「Sales」 のActivateボタンをクリックし、販売アプリをインストールする
5. APIキーの生成と設定
External JSON-2 APIにアクセスするには、APIキーが必要です。
次の手順でAPIキーを生成し、設定ファイルに保存します。
-
odoo-json-rpc-2-vba example.xlsmファイルを開き、DoTutorialExternalApi2マクロを実行する(実行時エラーが発生するので、終了する) -
odoo-json-rpc-2-vba example.xlsm.secret.txtファイルが作成されるので、テキストエディタで開く - https://localhost/ にアクセスし、admin / admin でodooにログインする
- odooの右上のアバターアイコンから、
My Preferencesを選び、Securityタブを開く -
Create API Keyボタンをクリックし、 パスワード(admin)を入力する -
Key Nameに、VBA-Exampleなどと入力し、Create Keyで、APIキーを生成する - 生成されたAPIキーの文字列をコピーする(再度コピーできるようにダイアログは開いたままとする)
- コピーしたAPIキーを
odoo-json-rpc-2-vba example.xlsm.secret.txtファイルのAPIKEY=に続けて張り付ける(adminをAPIキーに置換する) - 再度、
odoo-json-rpc-2-vba example.xlsmファイルを開き、DoTutorialExternalApi2マクロを実行すると、正常に処理が終了する - APIキーを作成したダイアログを閉じる
以上で、開発環境の準備が整いました。
APIキー
APIキーはパスワードよりも厳重に管理してください。
odoo-json-rpc-2-vba example.xlsm.secret.txtファイルには、そのAPIキーが含まれていますので、絶対に公開しないでください。
もし、APIキーが漏れた と思ったら、すぐにMy Prreferences から、APIキーを削除してください。
対象のモデル構造
今回の販売アプリ(sale.order)を中心としたサンプルコードで扱うモデルおよびリレーション構造です。
実装例:データの取得、追加・更新、External ID連携、Excel出力
OdxModel を用いて、多段階のリレーションを含むデータの取得に加え、内部保持する ADODB.Recordset を通じたデータの参照・操作、およびExternal IDの活用を行うVBA実装例です。
標準モジュールExampleOdxTutrial の末尾に次のコードを追記し、実行してください。
Public Sub ExampleSaleOrder()
Dim oFacade As OdxRepository
Dim oModel As OdxModel
Dim wb As Workbook
' ==========================================
' 1. JSON-2 API クライアント & Repository の初期化
' ==========================================
Set oFacade = CreateOdxRepository(True)
' ==========================================
' 2. OdxModel の構築とフィールド定義
' ==========================================
' ---- sale.order (注文) ----
Set oModel = NewOdxModel(oFacade, "sale.order")
With oModel
' ---- External ID ----
.AddExternalIdField
' ---- 基本フィールド ----
.AddField "name"
.AddField "date_order"
.AddField "state"
.AddField "amount_total"
' ---- Many2one: currency_id (通貨マスタ) ----
.AddField "currency_id"
' ---- Many2one: partner_id (顧客マスタ) ----
With .AddField("partner_id")
.AddField "name"
.AddField "email"
.AddField "phone"
End With
' ---- One2many: order_line (注文明細) ----
With .AddField("order_line")
.AddField "name"
.AddField "product_uom_qty"
.AddField "price_unit"
.AddField "price_subtotal"
' ---- Many2one: product_id (商品マスタ) ----
With .AddField("product_id")
.AddField "name"
.AddField "default_code"
End With
End With
End With
' ==========================================
' 3. データ取得の実行 (Search & Read)
' ==========================================
oModel.FetchSearchAndReadRemote
' ==========================================
' 4. Excelファイルへの出力確認
' ==========================================
Set wb = Workbooks.Add
DebugPrintModelView wb, oModel
With oModel.GetRelatedModel("order_line", True)
DebugPrintModelView wb, .RefMe
End With
wb.Sheets(1).Select
wb.Sheets(1).Range("A1") = "sales.order = " & oModel.Recordset.RecordCount
wb.Saved = True
wb.Activate
' ==========================================
' 5. ADODB.Recordset による追加・更新の例
' ==========================================
' OdxModelが内部に保持する ADODB.Recordset に対して
' 新規追加 (AddNew) や更新 (Update) を行い、Odoo側へ同期させることが可能です。
Dim rs As ADODB.Recordset
Dim nCount As Long
Set rs = oModel.Recordset
rs.MoveFirst
rs.Fields("date_order") = Now()
rs.Update
Debug.Print "update: " & rs.Fields("name").Value
oModel.UpsertCurrentRecordRemote
nCount = rs.RecordCount + 2
rs.AddNew
rs.Fields("external_id").Value = "vba_example.sales_order_" & nCount
rs.Fields("name").Value = "VBA-Example-" & nCount
rs.Fields("date_order") = Now()
rs.Fields("state") = "draft"
rs.Fields("currency_id") = oFacade.GetModelAndIdFromExternalId("base.USD")("res_id")
rs.Fields("partner_id") = oFacade.GetModelAndIdFromExternalId("base.res_partner_1")("res_id")
rs.Update
Debug.Print "insert: " & rs.Fields("name").Value
oModel.UpsertCurrentRecordRemote
Debug.Print "new id= " & rs.Fields("id").Value
MsgBox "Odoo External JSON-2 API からのデータ抽出および操作が完了しました!", vbInformation
End Sub
おわりに
Odooのバージョンアップに伴うAPI仕様の変更(External JSON-2 APIへの対応)は、外部連携システムを構築する上で重要です。
odoo-json-rpc-2-vba を利用することで、Excel VBAからJSON-RPCベースで最新仕様のOdoo環境へスムーズに接続し、内部保持されるADODB.Recordsetを通じた双方向のデータ操作(追加・更新) や External ID連携 を活用した高度なシステムをクリーンなコードで構築できるようになります。Excel中心の業務システムや帳票出力をOdooと連携させたい方は、ぜひ導入を検討してみてください。
参考リンク
- ライブラリ仕様・ドキュメント: odoo-json-rpc-2-vba GitHub Pages
- GitHub リポジトリ: jp-rad/odoo-json-rpc-2-vba
- Odoo 公式ドキュメント: External RPC API / External JSON-2 API