Odoo + Power BI: Complete Analytics Integration Guide

Connect Odoo 19 to Power BI for enterprise analytics. Covers DirectQuery, Import mode, data modeling, DAX measures, live dashboards, and deployment architecture.

E
ECOSIRE Research and Development Team
|2026年3月19日6 分で読める1.3k 語数|

Data Analytics & BIシリーズの一部

完全ガイドを読む

Odoo + Power BI: 完全な分析統合ガイド

Odoo 19 Enterprise には堅牢な組み込みレポート機能が含まれていますが、セルフサービス分析、クロスシステム データ モデリング、エンタープライズ レベルの視覚化を必要とする組織にとって、Power BI は自然な補完手段となります。 Odoo の運用データを Power BI の分析エンジンに接続すると、Odoo のネイティブ レポートでは提供できない洞察が得られます。

このガイドでは、接続アーキテクチャ、データ モデリングのベスト プラクティス、主要なビジネス ダッシュボードの構築、DAX メジャーの作成、増分更新構成、エンタープライズ規模向けの Microsoft Fabric への展開など、Odoo-Power BI 統合のあらゆる側面について説明します。

重要なポイント

  • 3 つの接続方法: PostgreSQL 直接、Odoo REST API、Odoo のエクスポート経由の ODBC
  • DirectQuery モードはリアルタイム データを提供します。インポート モードは大規模なデータセットのパフォーマンスを向上させます
  • Odoo の PostgreSQL スキーマでは、効率的な Power BI データ モデルのために非正規化が必要です
  • 増分更新により、大きなテーブルのロード時間が短縮されます (account.move、stock.move)
  • Power BI の行レベルのセキュリティは、Odoo の企業レベルのアクセス制御を反映しています
  • オンプレミスの Odoo にはゲートウェイの展開が必要です。クラウド Odoo は直接接続します
  • Microsoft Fabric (Power BI Premium) により、エンタープライズ レイクハウスで Odoo データが有効になります
  • 主要な指標: 収益、粗利益、在庫回転率、売掛金の経年劣化、OEE

統合アーキテクチャのオプション

Odoo の展開とレポートのニーズに基づいて、適切な接続アーキテクチャを選択してください。

オプション 1: PostgreSQL への直接接続 (推奨)

PostgreSQL コネクタを使用して、Power BI を Odoo の PostgreSQL データベースに直接接続します。

長所:

  • すべての Odoo テーブルと生データへの完全アクセス
  • 複雑な結合で最高のパフォーマンスを実現
  • インポート モードと DirectQuery モードの両方をサポート

短所:

  • Power BI Gateway から PostgreSQL へのネットワーク アクセスが必要
  • Odoo のデータ モデルを変更するには、Power BI クエリの更新が必要です
  • データベースへの直接アクセスは Odoo のアクセス制御をバイパスします

オプション 2: Odoo REST API

Odoo の REST API を使用して Power BI の Web コネクタ経由で接続します。

長所:

  • PostgreSQL へのネットワーク アクセスなしで動作します
  • ユーザーごとの Odoo のアクセス権を尊重します
  • データベースの認証情報は必要ありません

短所:

  • 直接 PostgreSQL よりも遅い (テーブルごとに 1 つの API 呼び出し)
  • レート制限は大規模なデータのプルに影響します
  • 大規模なデータセットの効率的なページネーションが困難

オプション 3: データ ウェアハウスへのエクスポート

ETL Odoo データを専用データ ウェアハウス (Azure Synapse、Snowflake、BigQuery) に変換します。

長所:

  • 大規模なパフォーマンスで最大のパフォーマンスを実現
  • BI を ERP から切り離す
  • 複数のソースシステムを統合可能

短所:

  • インフラストラクチャのコストと複雑さが最も高い
  • データ遅延は ETL スケジュールによって異なります (通常は 1 時間から 24 時間)
  • ETL パイプラインのメンテナンスが必要

ほとんどの組織に推奨されるアーキテクチャ: Power BI Gateway (オンプレミス) または直接接続 (クラウド Odoo) を使用した直接 PostgreSQL、増分更新を伴うインポート モード、1 ~ 4 時間ごとにスケジュールされた更新。


PostgreSQL 接続のセットアップ

ステップ 1: ネットワーク アクセス

オンプレミスの Odoo の場合:

  1. PostgreSQL にネットワーク アクセスできるサーバーに オンプレミス データ ゲートウェイ をインストールします
  2. Microsoft 365 資格情報を使用してゲートウェイを構成します
  3. ゲートウェイ サーバーから Odoo DB サーバーへの PostgreSQL ポート (5432 または 5433) を開きます。

クラウド Odoo (AWS、Azure、GCP) の場合:

  • Power BI の IP 範囲からの受信を許可するようにセキュリティ グループ/ファイアウォールを構成する
  • または: 同じ VPC 内のクラウド VM でオンプレミス ゲートウェイを使用します。

ステップ 2: 読み取り専用データベース ユーザーを作成する

Power BI をメインの Odoo データベース ユーザーに接続しないでください。専用の読み取り専用ユーザーを作成します。

-- Create read-only user for Power BI
CREATE USER powerbi_reader WITH PASSWORD 'strong_password_here';

-- Grant connection to database
GRANT CONNECT ON DATABASE your_odoo_db TO powerbi_reader;

-- Grant schema usage
GRANT USAGE ON SCHEMA public TO powerbi_reader;

-- Grant SELECT on all current and future tables
GRANT SELECT ON ALL TABLES IN SCHEMA public TO powerbi_reader;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT ON TABLES TO powerbi_reader;

ステップ 3: Power BI Desktop で構成する

  1. Power BI Desktop を開く → データの取得 → PostgreSQL データベース
  2. 次のように入力します。
  • サーバー: PostgreSQL ホスト (および 5432 でない場合はポート)
  • データベース: Odoo データベース名
  • ユーザー名: powerbi_reader
  • パスワード: 読み取り専用ユーザーのパスワード
  1. 接続モードを選択します: インポート (推奨) または DirectQuery

Power BI の主要な Odoo テーブル

Odoo の PostgreSQL スキーマを理解することは、正確なデータ モデルを構築するために不可欠です。

財務表:

説明主要なフィールド
コード0請求書、請求書、仕訳帳move_type、state、invoice_date、amount_total、currency_id
コード0仕訳帳の明細move_id、account_id、借方、貸方、数量、価格小計
コード0勘定科目表コード、名前、アカウントの種類
コード0顧客/ベンダーの支払い金額、支払い日、州、パートナー ID

販売テーブル:

説明主要なフィールド
コード0販売注文名前、州、注文日、合計金額、パートナー ID、ユーザー ID
コード0販売注文明細order_id、product_id、product_uom_qty、price_小計
コード0CRM の機会名前、ステージ ID、期待収益、確率、ユーザー ID

在庫テーブル:

説明主要なフィールド
コード0現在の在庫レベル製品 ID、場所 ID、数量
コード0すべての在庫移動製品 ID、状態、日付、完了数量
コード0納品・受領書類選択タイプ ID、状態、予定日
コード0製品マスターデータ名前、リスト価格、カテゴリID、タイプ

人事と給与:

説明主要なフィールド
コード0従業員名前、部門 ID、ジョブ ID、会社 ID
コード0時間と出席従業員 ID、チェックイン、チェックアウト
コード0給与明細従業員 ID、開始日、終了日、州

Power BI データ モデルの設計

Odoo データのスター スキーマ設計:

Power BI のパフォーマンスを最適化するために、Odoo の正規化スキーマをスター スキーマに変換します。

[Date Table] (dimension)
     ↓
[Sales Fact Table]
     ↓
[Product Dimension] ← [Product Category Dimension]
     ↓
[Customer Dimension] ← [Country Dimension]
     ↓
[Salesperson Dimension]
     ↓
[Company Dimension]

Power Query M コード — 販売ファクト テーブル:

let
    Source = PostgreSQL.Database("your-odoo-server:5433", "your_db"),
    SaleOrderLine = Source{[Schema="public", Item="sale_order_line"]}[Data],
    SaleOrder = Source{[Schema="public", Item="sale_order"]}[Data],
    ProductTemplate = Source{[Schema="public", Item="product_template"]}[Data],
    ProductProduct = Source{[Schema="public", Item="product_product"]}[Data],

    // Join order lines with orders
    JoinWithOrder = Table.NestedJoin(
        SaleOrderLine, {"order_id"},
        SaleOrder, {"id"},
        "Order", JoinKind.Inner
    ),

    // Expand order columns needed
    ExpandOrder = Table.ExpandTableColumn(
        JoinWithOrder, "Order",
        {"name", "state", "date_order", "partner_id", "user_id", "company_id"},
        {"order_name", "order_state", "date_order", "partner_id", "user_id", "company_id"}
    ),

    // Filter: confirmed and done orders only
    FilterState = Table.SelectRows(
        ExpandOrder,
        each [order_state] = "sale" or [order_state] = "done"
    ),

    // Select and rename final columns
    SelectColumns = Table.SelectColumns(FilterState, {
        "id", "order_id", "product_id", "date_order", "partner_id",
        "user_id", "company_id", "product_uom_qty", "price_unit",
        "price_subtotal", "price_tax", "price_total"
    }),

    // Change types
    ChangedTypes = Table.TransformColumnTypes(SelectColumns, {
        {"date_order", type datetime},
        {"price_subtotal", type number},
        {"product_uom_qty", type number}
    })
in
    ChangedTypes

重要な DAX 対策

収益と利益率:

// Total Revenue (Net)
Revenue = SUMX(SalesFact, SalesFact[price_subtotal])

// Revenue MTD
Revenue MTD =
CALCULATE([Revenue], DATESMTD(DateTable[Date]))

// Revenue YTD
Revenue YTD =
CALCULATE([Revenue], DATESYTD(DateTable[Date]))

// Revenue vs Prior Period
Revenue vs PY =
VAR CurrentRevenue = [Revenue]
VAR PriorYearRevenue =
    CALCULATE([Revenue], SAMEPERIODLASTYEAR(DateTable[Date]))
RETURN
DIVIDE(CurrentRevenue - PriorYearRevenue, PriorYearRevenue, 0)

// Gross Margin
Gross Margin =
SUMX(SalesFact,
    SalesFact[price_subtotal] -
    (RELATED(ProductDim[standard_price]) * SalesFact[product_uom_qty])
)

// Gross Margin %
Gross Margin % =
DIVIDE([Gross Margin], [Revenue], 0)

在庫対策:

// Current Stock Value
Stock Value =
SUMX(
    StockQuant,
    StockQuant[quantity] * RELATED(ProductDim[standard_price])
)

// Inventory Turnover (annualized)
Inventory Turnover =
DIVIDE(
    [COGS Annualized],
    [Average Inventory Value],
    0
)

// Days of Inventory Outstanding
DIO =
DIVIDE(365, [Inventory Turnover], 0)

// Stockout % (products with zero stock)
Stockout Rate =
DIVIDE(
    COUNTROWS(FILTER(StockQuant, StockQuant[quantity] <= 0)),
    COUNTROWS(StockQuant),
    0
)

債権の経過期間:

// Current (0-30 days)
AR Current =
CALCULATE(
    SUM(ARFact[amount_residual]),
    ARFact[days_overdue] <= 0
)

// 1-30 days overdue
AR 1-30 Days =
CALCULATE(
    SUM(ARFact[amount_residual]),
    ARFact[days_overdue] >= 1 && ARFact[days_overdue] <= 30
)

// Days Sales Outstanding
DSO =
DIVIDE(
    SUM(ARFact[amount_residual]),
    [Revenue] / 365,
    0
)

主要なダッシュボード ページ

1.エグゼクティブ ダッシュボード

  • 収益と予算 (ゲージ チャート)
  • 収益傾向 (折れ線グラフ、13 か月ローリング)
  • 粗利益率 % (傾向のある KPI カード)
  • 売上高上位 10 社の顧客 (棒グラフ)
  • 売上高上位 10 製品 (横棒)
  • 地域別の収益 (塗りつぶされた地図)

2.販売パイプライン (CRM)

  • ステージ別のパイプライン (ファネル チャート)
  • 加重パイプライン値 (KPI)
  • 勝敗率(ドーナツチャート)
  • 平均取引規模の傾向
  • 営業担当者の業績(マトリックス表)
  • 予測と実績 (ライン + バーの組み合わせ)

3.財務概要

  • 損益概要(YTD、YoYの表)
  • キャッシュポジション(KPI)
  • 売掛金の経過期間(積み上げバー)
  • 買掛金の経過期間(積み上げバー)
  • DSO トレンド (折れ線グラフ)

4.在庫ダッシュボード

  • カテゴリ別株価(ツリーマップ)
  • 倉庫別在庫回転率(バー)
  • 動きの遅い在庫 (表: 在庫 > 90 日)
  • 在庫切れのリスク項目 (表: カバー日数 < 7)
  • ポイントアラート(カード)を並べ替えます

5.人事ダッシュボード

  • 部門別の従業員数 (バー)
  • 出席者数と予定時間数 (ゲージ)
  • 休暇残高利用状況(マトリックス)
  • 離職率の推移(線)

大規模なテーブルの増分リフレッシュ

Odoo の account_move_linestock_movemail_message テーブルは数百万行まで増加します。増分リフレッシュにより、リフレッシュのたびにテーブル全体がリロードされるのを防ぎます。

増分更新を構成します:

  1. Power Query で、パラメーター RangeStart および RangeEnd (DateTime 型) を追加します。
  2. 日付列をフィルターします: Table.SelectRows(Source, each [write_date] >= RangeStart and [write_date] < RangeEnd)
  3. [フィールド] ペインでテーブルを右クリック → [増分更新]
  4. 設定: 過去 12 か月を保存、過去 3 日間を更新

増分更新から最も恩恵を受ける Odoo テーブル:

  • account_move_line: date によるフィルター
  • stock_move: date によるフィルター
  • sale_order: date_order によるフィルター
  • mail_message: date によるフィルター

行レベルのセキュリティ

Power BI に行レベル セキュリティ (RLS) を実装して、Odoo の企業レベルのアクセス制御を反映します。

// RLS filter: user sees only their assigned companies
[company_id] IN
    CALCULATETABLE(
        VALUES(UserCompanyMapping[company_id]),
        UserCompanyMapping[user_email] = USERPRINCIPALNAME()
    )

電子メール アドレスを承認された企業 ID にマッピングする UserCompanyMapping テーブル (Power BI で維持されるか、Odoo から同期される) を作成します。


よくある質問

リアルタイム データ用に Odoo の PostgreSQL データベースで DirectQuery を使用できますか?

はい、ただし注意点があります。 Odoo の PostgreSQL 上の DirectQuery は、単純なクエリを含むダッシュボードに使用できます。多くのメジャーを含む複雑なダッシュボードは、各ビジュアルが運用データベースに対して新しい SQL クエリをトリガーするため、速度が遅くなります。ほとんどのユースケースでは、1 時間更新のインポート モードが、鮮度とパフォーマンスの間のより良いトレードオフです。

Power BI で Odoo の複数通貨データを処理するにはどうすればよいですか?

Odoo は、取引通貨と会社通貨の両方で金額を保存します。元の通貨には amount_currency フィールドを使用し、同等の会社通貨には debit/credit (または price_subtotal) を使用します。 Power BI でグループレベルの連結を行う場合は、Odoo の会社通貨金額を使用し、一貫したレポートを作成するために別の通貨換算ディメンション テーブルを適用します。

Power BI が更新されると、Odoo の PostgreSQL データベースのパフォーマンスにどのような影響がありますか?

Power BI データセットを完全に更新すると、PostgreSQL に対して複数の分析クエリが同時に実行されます。大規模な Odoo データベース (>50GB) の場合、更新ウィンドウ中に大量の I/O と CPU が消費される可能性があります。ベスト プラクティス: オフピーク時間 (午前 2 時から午前 4 時など) に更新をスケジュールし、Power BI クエリに PostgreSQL のリード レプリカを使用し、増分更新を実装してクエリの範囲を最小限に抑えます。

PostgreSQL 経由で Power BI を Odoo Community (無料版) に接続できますか?

はい。 Power BI は、管理するアプリケーションに関係なく、任意の PostgreSQL データベースに接続します。 Odoo Community の PostgreSQL スキーマは Enterprise とほぼ同じです (一部の Enterprise 専用テーブルを除く)。接続方法は同じです。読み取り専用データベース ユーザーがコミュニティ データベースにアクセスできることを確認するだけです。

Odoo が新しいバージョンにアップグレードされたときに、Power BI データ モデルの同期を保つにはどうすればよいですか?

Odoo のバージョンをアップグレードすると、特に大幅なリファクタリングが行われたモジュールの場合、データベース テーブルの名前が変更されたり、再構成されたりする可能性があります。 Odoo のアップグレード後: 古いバージョンと新しいバージョンの間でテーブル スキーマの比較を実行し、名前が変更された列を参照するように Power Query クエリを更新し、新しいスキーマに対してすべての DAX メジャーを検証します。スキーマ変更チェックを移行 Runbook に組み込みます。


次のステップ

運用グレードの Odoo + Power BI 統合を構築するには、データ モデリングの専門知識、PostgreSQL の知識、Odoo のスキーマについての深い理解が必要です。正しく実行されれば、経営陣の意思決定方法を変える統合分析プラットフォームが提供されます。

ECOSIRE は、データベース アーキテクチャとデータ モデリングからダッシュボード設計、DAX 開発、展開に至るまで、エンドツーエンドの Odoo + Power BI 分析ソリューションを提供します。私たちのチームは、Odoo の専門知識と Power BI の専門分野の橋渡しをします。

Odoo Analytics の統合について ECOSIRE にご相談ください →

ECOSIRE の Power BI サービスを詳しく見る →

レポート要件を共有していただければ、Odoo 運用のあらゆる側面をリーダー チームがリアルタイムで把握できる Power BI アーキテクチャを設計します。

E

執筆者

ECOSIRE Research and Development Team

ECOSIREでエンタープライズグレードのデジタル製品を開発。Odoo統合、eコマース自動化、AI搭載ビジネスソリューションに関するインサイトを共有しています。

WhatsAppでチャット