0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Odooの新しい「External JSON-2 API」に対応したVBAライブラリでExcel業務システムと連携する(Recordset双方向操作・External ID対応)

0
Last updated at Posted at 2026-10-20

はじめに

Odooには、外部システムからデータへアクセスするための External API が備わっており、Excel VBA等を使ってOdooモデルのデータ操作や自動抽出が可能です。

Odooの進化に伴い、従来のJSON-RPC API(execute_kw 方式)から、より高速かつ統一された External JSON-2 API への移行が進んでいます。

ライブラリ odoo-json-rpc-2-vba では、新旧いずれのAPIであってもファサードインターフェース(OdxRepository)を介すことで、VBAコード側の実装を変更することなく透過的に操作できるよう設計されています。

また、本ライブラリは JSON-RPCベースの通信処理 を行い、ADODB.Recordset の内部保持・双方向操作(追加・更新) や External ID(ir.model.data)の連携 にも対応しています。

アーキテクチャの概要

odoo-json-rpc-2-vba は、レイヤー構造によりネットワーク通信とVBA側でのデータ利用を疎結合に保っています。

主なモジュール

  1. Od2Client / Od2Repository:
    新しい External JSON-2 API 専用の通信クライアントおよびリポジトリ。データベース名とAPIキー/トークンを用いた効率的なJSON-RPC通信を行います
  2. OdxRepository(ファサード):
    • APIバージョンの違いを吸収し、スキーマの自動キャッシュ(GetModelSchema)やCRUD操作を統一しています
    • External ID(ir.model.data)のサポート: 外部識別子(module.xml_id)からのモデル・レコードID解決や、外部IDベースでのUPSERT操作等に対応しています
  3. 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エディタで、参照設定をします。

  1. xlsmファイル:
    • Microsoft ActiveX Data Objects 6.1 Library
    • OdooJsonRpc2VBA
  2. xlamファイル:
    • Microsoft ActiveX Data Objects 6.1 Library

参照設定後、それぞれのファイルを保存してください。

4. odooの起動と準備
odoo-json-rpc-2-vbaは、Docker使って、odooを試すことができるようになっています。
次の手順でodooを起動し、準備を行います。

  1. Docker Desktopを起動する
  2. VS Codeでodoo-json-rpc-2-vba を開く
  3. Reopen in ContainerでDockerを開始する
  4. https://localhost/oreore にアクセスし、証明書をダウンロードする(オレオレ証明書)
  5. ダウンロードした証明書を「現在のユーザー」の 「信頼されたルート証明機関」ストア へインストールする
  6. VS CodeのRun & Debug で、Odoo addons を開始する
  7. https://localhost/ にアクセスし、admin / admin でodooにログインする
  8. odooの左上のキューブアイコンから、Settingsを選び、設定画面を開く
  9. 設定画面の最下部にある Activate the developer modeをクリックする
  10. 設定画面の最下部に Load demo data が出現するので、それをクリックし、 Yes, ... で実行する
  11. odooの左上のキューブアイコンから、Appsを選び、「Sales」 のActivate ボタンをクリックし、販売アプリをインストールする

5. APIキーの生成と設定
External JSON-2 APIにアクセスするには、APIキーが必要です。
次の手順でAPIキーを生成し、設定ファイルに保存します。

  1. odoo-json-rpc-2-vba example.xlsmファイルを開き、DoTutorialExternalApi2マクロを実行する(実行時エラーが発生するので、終了する)
  2. odoo-json-rpc-2-vba example.xlsm.secret.txtファイルが作成されるので、テキストエディタで開く
  3. https://localhost/ にアクセスし、admin / admin でodooにログインする
  4. odooの右上のアバターアイコンから、My Preferences を選び、Security タブを開く
  5. Create API Key ボタンをクリックし、 パスワード(admin)を入力する
  6. Key Name に、VBA-Example などと入力し、Create Key で、APIキーを生成する
  7. 生成されたAPIキーの文字列をコピーする(再度コピーできるようにダイアログは開いたままとする)
  8. コピーしたAPIキーをodoo-json-rpc-2-vba example.xlsm.secret.txtファイルのAPIKEY=に続けて張り付ける(adminをAPIキーに置換する)
  9. 再度、odoo-json-rpc-2-vba example.xlsmファイルを開き、DoTutorialExternalApi2マクロを実行すると、正常に処理が終了する
  10. 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 の末尾に次のコードを追記し、実行してください。

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と連携させたい方は、ぜひ導入を検討してみてください。

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?