Data Analytics & 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 の場合:
- PostgreSQL にネットワーク アクセスできるサーバーに オンプレミス データ ゲートウェイ をインストールします
- Microsoft 365 資格情報を使用してゲートウェイを構成します
- ゲートウェイ サーバーから 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 で構成する
- Power BI Desktop を開く → データの取得 → PostgreSQL データベース
- 次のように入力します。
- サーバー: PostgreSQL ホスト (および 5432 でない場合はポート)
- データベース: Odoo データベース名
- ユーザー名: powerbi_reader
- パスワード: 読み取り専用ユーザーのパスワード
- 接続モードを選択します: インポート (推奨) または 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_小計 |
| コード0 | CRM の機会 | 名前、ステージ 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_line、stock_move、mail_message テーブルは数百万行まで増加します。増分リフレッシュにより、リフレッシュのたびにテーブル全体がリロードされるのを防ぎます。
増分更新を構成します:
- Power Query で、パラメーター
RangeStartおよびRangeEnd(DateTime 型) を追加します。 - 日付列をフィルターします:
Table.SelectRows(Source, each [write_date] >= RangeStart and [write_date] < RangeEnd) - [フィールド] ペインでテーブルを右クリック → [増分更新]
- 設定: 過去 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 アーキテクチャを設計します。
執筆者
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
関連記事
BMF Programmablaufplan Lohnsteuer 2026: ドイツの公式賃金税計算の実装 (XML、API、Odoo)
BMF Programmablaufplan Lohnsteuer 2026 の開発者ガイド: PAP とは何か、XML 疑似コード形式、公式テスト サービス、Odoo 給与へのマッピング。
2026 年の CRM システムのコストはいくらですか? 40 以上の導入から得られる実際の価格
40 以上の実装から得た実際の CRM 価格: ユーザーあたりのライセンス費用、導入費用、隠れたコスト、Odoo、HubSpot、Salesforce などの 3 年間の TCO。
eMAG Odoo 統合: ルーマニア最大のマーケットプレイスを ERP (注文、在庫、e-Factura) に接続します。
eMAG Marketplace を Odoo ERP に接続: オファーと注文の同期、AWB 発送、返品、在庫と価格の更新、さらに売り手向けのルーマニア e-Factura コンプライアンス。
Data Analytics & BIのその他の記事
Microsoft Fabric と Power BI: 違いは何ですか? 2026 年に実際に必要なものは何ですか?
Microsoft Fabric と Power BI について、意思決定者向けに、両者の関係、F-SKU で何が変わったのか、Pro ライセンスで十分な場合、2026 年のコスト シナリオについて説明しました。
Power BI コンサルタント vs 社内チーム: コスト、スピード、ヘルプを雇うタイミング (2026)
Power BI コンサルタントを雇うべきですか、それとも社内で構築するべきですか? 2026 年のコスト比較、速度と品質のトレードオフ、ハイブリッド モデル、企業を雇う際の危険信号。
Power BI Embedded: コスト、容量サイジング、および独自のダッシュボードの構築に適した時期
2026 年の ISV および SaaS チームの Power BI Embedded コストの内訳: A-SKU と F-SKU の価格設定、ユーザー負荷別の容量サイジング、およびシナリオを使用した構築と購入の計算。
2026 年の Power BI の導入コストはいくらですか?実際のプロジェクト予算の説明
2026 年の Power BI 実装コスト: 実際の予算は、企業規模、コンサルタント料金、ライセンス項目、隠れたコスト要因、回収スケジュールによって異なります。
Power BI vs Tableau vs Looker (2026): 実装チームによる正直な比較
価格設定、モデリング レイヤー、ガバナンス、埋め込み、2026 年の総コスト シナリオの 3 つすべてを実装するチームによる Power BI、Tableau、Looker の比較。
Power BI for Odoo: 運用環境に対応した 12 の DAX パターン
Power BI の Odoo データ用の 12 の実績のある DAX パターン: タイム インテリジェンス、顧客コホート、在庫の経年劣化、複数企業の損益計算書、複合キー結合。