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
|19. März 20269 Min. Lesezeit2.0k Wörter|

Teil unserer Data Analytics & BI-Serie

Den vollständigen Leitfaden lesen

Odoo + Power BI: Vollständiger Analytics-Integrationsleitfaden

Odoo 19 Enterprise verfügt über eine solide integrierte Berichterstellung, aber für Unternehmen, die Self-Service-Analysen, systemübergreifende Datenmodellierung und Visualisierung auf Unternehmensniveau benötigen, ist Power BI die natürliche Ergänzung. Die Verbindung der Betriebsdaten von Odoo mit der Analyse-Engine von Power BI ermöglicht Erkenntnisse, die die nativen Berichte von Odoo nicht liefern können.

Dieser Leitfaden deckt alle Aspekte der Odoo-Power BI-Integration ab: Verbindungsarchitektur, Best Practices für die Datenmodellierung, Erstellung wichtiger Geschäfts-Dashboards, Erstellung von DAX-Kennzahlen, inkrementelle Aktualisierungskonfiguration und Bereitstellung in Microsoft Fabric für den Unternehmensbereich.

Wichtige Erkenntnisse

  • Drei Verbindungsmethoden: PostgreSQL direkt, Odoo REST API und ODBC über Odoos Export – Der DirectQuery-Modus liefert Echtzeitdaten; Der Importmodus bietet eine bessere Leistung für große Datensätze – Das PostgreSQL-Schema von Odoo erfordert eine Denormalisierung für effiziente Power BI-Datenmodelle – Inkrementelle Aktualisierung reduziert die Ladezeit für große Tabellen (account.move, stock.move) – Sicherheit auf Zeilenebene in Power BI spiegelt die Zugriffskontrolle auf Unternehmensebene von Odoo wider – Gateway-Bereitstellung für lokales Odoo erforderlich; Cloud Odoo verbindet sich direkt – Microsoft Fabric (Power BI Premium) ermöglicht Odoo-Daten im Enterprise Lakehouse
  • Schlüsselkennzahlen: Umsatz, Bruttomarge, Lagerumschlag, Forderungsalterung, OEE

Optionen der Integrationsarchitektur

Wählen Sie die richtige Verbindungsarchitektur basierend auf Ihren Odoo-Bereitstellungs- und Berichtsanforderungen.

Option 1: Direkte PostgreSQL-Verbindung (empfohlen)

Verbinden Sie Power BI über den PostgreSQL-Connector direkt mit der PostgreSQL-Datenbank von Odoo:

Vorteile:

  • Voller Zugriff auf alle Odoo-Tabellen und Rohdaten
  • Beste Leistung für komplexe Verknüpfungen
  • Unterstützt sowohl den Import- als auch den DirectQuery-Modus

Nachteile: – Erfordert Netzwerkzugriff vom Power BI Gateway auf PostgreSQL – Änderungen im Datenmodell von Odoo erfordern die Aktualisierung von Power BI-Abfragen

  • Der direkte Datenbankzugriff umgeht die Zugriffskontrolle von Odoo

Option 2: Odoo REST API

Stellen Sie eine Verbindung über den Web-Connector von Power BI mit der REST-API von Odoo her:

Vorteile:

  • Funktioniert ohne Netzwerkzugriff auf PostgreSQL
  • Respektiert die Zugriffsrechte von Odoo pro Benutzer
  • Keine Datenbankanmeldeinformationen erforderlich

Nachteile:

  • Langsamer als direktes PostgreSQL (ein API-Aufruf pro Tabelle) – Die Ratenbegrenzung wirkt sich auf große Datenmengen aus
  • Bei großen Datensätzen ist eine effiziente Paginierung schwierig

Option 3: Export ins Data Warehouse

ETL Odoo-Daten in ein dediziertes Data Warehouse (Azure Synapse, Snowflake, BigQuery):

Vorteile:

  • Maximale Leistung im großen Maßstab
  • Entkoppelt BI von ERP
  • Kann mehrere Quellsysteme integrieren

Nachteile:

  • Höchste Infrastrukturkosten und Komplexität – Die Datenlatenz hängt vom ETL-Zeitplan ab (normalerweise 1 Stunde bis 24 Stunden). – Erfordert die Wartung der ETL-Pipeline

Empfohlene Architektur für die meisten Organisationen: Direktes PostgreSQL mit Power BI Gateway (lokal) oder direkte Verbindung (Cloud Odoo), Importmodus mit inkrementeller Aktualisierung, geplante Aktualisierung alle 1–4 Stunden.


Einrichten der PostgreSQL-Verbindung

Schritt 1: Netzwerkzugriff

Für lokales Odoo:

  1. Installieren Sie das On-Premises Data Gateway auf einem Server mit Netzwerkzugriff auf PostgreSQL
  2. Konfigurieren Sie das Gateway mit Ihren Microsoft 365-Anmeldeinformationen
  3. Öffnen Sie den PostgreSQL-Port (5432 oder 5433) vom Gateway-Server zum Odoo-DB-Server

Für Cloud Odoo (AWS, Azure, GCP): – Konfigurieren Sie die Sicherheitsgruppe/Firewall so, dass eingehende Daten aus den IP-Bereichen von Power BI zugelassen werden – Oder: Verwenden Sie das lokale Gateway auf einer Cloud-VM in derselben VPC

Schritt 2: Erstellen Sie einen schreibgeschützten Datenbankbenutzer

Verbinden Sie Power BI niemals mit Ihrem Hauptbenutzer der Odoo-Datenbank. Erstellen Sie einen dedizierten schreibgeschützten Benutzer:

-- 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;

Schritt 3: In Power BI Desktop konfigurieren

  1. Öffnen Sie Power BI Desktop → Daten abrufen → PostgreSQL-Datenbank
  2. Geben Sie ein:
  • Server: Ihr PostgreSQL-Host (und Port, falls nicht 5432)
  • Datenbank: Ihr Odoo-Datenbankname
  • Benutzername: powerbi_reader
  • Passwort: das schreibgeschützte Benutzerpasswort
  1. Wählen Sie den Verbindungsmodus: Import (empfohlen) oder DirectQuery

Wichtige Odoo-Tabellen für Power BI

Das Verständnis des PostgreSQL-Schemas von Odoo ist für die Erstellung genauer Datenmodelle unerlässlich.

Finanztabellen:

TabelleBeschreibungSchlüsselfelder
account_moveRechnungen, Rechnungen, Journaleinträgemove_type, Staat, Rechnungsdatum, Betrag_Gesamtbetrag, Währungs-ID
account_move_lineEinzelposten in Journaleinträgenmove_id, account_id, lastschrift, kredit, menge, price_subtotal
account_accountKontenplanCode, Name, Kontotyp
account_paymentDebitoren-/KreditorenzahlungenBetrag, Zahlungsdatum, Bundesland, Partner-ID

Verkaufstabellen:

TabelleBeschreibungSchlüsselfelder
sale_orderKundenaufträgeName, Bundesland, Bestelldatum, Gesamtmenge, Partner-ID, Benutzer-ID
sale_order_lineVerkaufsauftragszeilenorder_id, product_id, product_uom_qty, price_subtotal
crm_leadCRM-MöglichkeitenName, Bühnen-ID, erwarteter_Umsatz, Wahrscheinlichkeit, Benutzer-ID

Inventartabellen:

TabelleBeschreibungSchlüsselfelder
stock_quantAktuelle LagerbeständeProdukt_ID, Standort_ID, Menge
stock_moveAlle LagerbewegungenProdukt-ID, Status, Datum, Menge_fertig
stock_pickingLiefer-/Empfangsdokumentepicking_type_id, Zustand, geplantes_Datum
product_templateProduktstammdatenName, Listenpreis, Kategorie-ID, Typ

Personalwesen und Gehaltsabrechnung:

TabelleBeschreibungSchlüsselfelder
hr_employeeMitarbeiterName, Abteilungs-ID, Job-ID, Firmen-ID
hr_attendanceZeiterfassungEmployee_id, check_in, check_out
hr_payslipGehaltsabrechnungenEmployee_id, date_from, date_to, state

Power BI-Datenmodelldesign

Star-Schema-Design für Odoo-Daten:

Konvertieren Sie das normalisierte Schema von Odoo in ein Sternschema für optimale Power BI-Leistung:

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

Power Query M-Code – Verkaufsfaktentabelle:

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

Wesentliche DAX-Kennzahlen

Umsatz und Marge:

// 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)

Bestandsmaßnahmen:

// 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
)

Alterung der Forderungen:

// 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
)

Wichtige Dashboard-Seiten

1. Executive-Dashboard

  • Umsatz vs. Budget (Messdiagramm)
  • Umsatztrend (Liniendiagramm, 13 Monate gleitend)
  • Bruttomarge % (KPI-Karte mit Trend)
  • Top 10 Kunden nach Umsatz (Balkendiagramm)
  • Top 10 Produkte nach Umsatz (horizontale Leiste)
  • Umsatz nach Region (ausgefüllte Karte)

2. Vertriebspipeline (CRM)

  • Pipeline nach Stufe (Trichterdiagramm)
  • Gewichteter Pipeline-Wert (KPI)
  • Gewinn-/Verlustrate (Donut-Diagramm)
  • Trend zur durchschnittlichen Geschäftsgröße
  • Leistung des Vertriebsmitarbeiters (Matrixtabelle)
  • Prognose vs. tatsächlich (Linie + Balken-Kombination)

3. Finanzübersicht

  • GuV-Zusammenfassung (Tabelle mit YTD, YoY)
  • Cash-Position (KPI)
  • Forderungsalterung (gestapelter Balken)
  • Fälligkeit der Verbindlichkeiten (gestapelter Balken)
  • DSO-Trend (Liniendiagramm)

4. Inventar-Dashboard

  • Bestandswert nach Kategorie (Treemap)
  • Lagerumschlag pro Lager (Bar)
  • Langsamdrehender Lagerbestand (Tabelle: Lagerbestand > 90 Tage)
  • Lagerbestandsrisikopositionen (Tabelle: Deckungstage < 7)
  • Punktwarnungen (Karten) nachbestellen

5. HR-Dashboard

  • Mitarbeiterzahl nach Abteilung (Bar)
  • Anwesenheit vs. geplante Stunden (Anzeige)
  • Auslastung des Urlaubsguthabens (Matrix)
  • Trend der Fluktuationsrate (Linie)

Inkrementelle Aktualisierung für große Tabellen

Die Tabellen account_move_line, stock_move und mail_message von Odoo wachsen auf Millionen von Zeilen an. Die inkrementelle Aktualisierung verhindert das Neuladen der gesamten Tabelle bei jeder Aktualisierung.

Inkrementelle Aktualisierung konfigurieren:

  1. Fügen Sie in Power Query die Parameter RangeStart und RangeEnd (DateTime-Typ) hinzu.
  2. Filtern Sie Ihre Datumsspalte: Table.SelectRows(Source, each [write_date] >= RangeStart and [write_date] < RangeEnd)
  3. Klicken Sie mit der rechten Maustaste auf die Tabelle im Bereich „Felder“ → „Inkrementelle Aktualisierung“.
  4. Einstellen: Letzte 12 Monate speichern, letzte 3 Tage aktualisieren

Odoo-Tabellen, die am meisten von der inkrementellen Aktualisierung profitieren:

  • account_move_line: Filtern nach date
  • stock_move: Filtern nach date
  • sale_order: Filtern nach date_order
  • mail_message: Filtern nach date

Sicherheit auf Zeilenebene

Implementieren Sie Row-Level Security (RLS) in Power BI, um die Zugriffskontrolle auf Unternehmensebene von Odoo widerzuspiegeln.

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

Erstellen Sie eine UserCompanyMapping-Tabelle (verwaltet in Power BI oder synchronisiert von Odoo), die E-Mail-Adressen autorisierten Unternehmens-IDs zuordnet.


Häufig gestellte Fragen

Kann ich DirectQuery mit der PostgreSQL-Datenbank von Odoo für Echtzeitdaten verwenden?

Ja, aber mit Vorbehalten. DirectQuery auf Odoos PostgreSQL ist für Dashboards mit einfachen Abfragen machbar. Komplexe Dashboards mit vielen Kennzahlen sind langsam, da jede Visualisierung neue SQL-Abfragen für Ihre Produktionsdatenbank auslöst. Für die meisten Anwendungsfälle ist der Importmodus mit 1-stündiger Aktualisierung der bessere Kompromiss zwischen Aktualität und Leistung.

Wie gehe ich mit den Mehrwährungsdaten von Odoo in Power BI um?

Odoo speichert Beträge sowohl in der Transaktionswährung als auch in der Unternehmenswährung. Verwenden Sie das Feld amount_currency für die Originalwährung und debit/credit (oder price_subtotal) für den Gegenwert in der Unternehmenswährung. Verwenden Sie für die Konsolidierung auf Gruppenebene in Power BI die Unternehmenswährungsbeträge von Odoo und wenden Sie eine separate Währungsumrechnungsdimensionstabelle für eine konsistente Berichterstattung an.

Welche Auswirkungen hat die Aktualisierung von Power BI auf die Leistung der PostgreSQL-Datenbank von Odoo?

Bei einer vollständigen Aktualisierung des Power BI-Datensatzes werden mehrere analytische Abfragen gleichzeitig für PostgreSQL ausgeführt. Bei großen Odoo-Datenbanken (>50 GB) kann dies während des Aktualisierungsfensters erhebliche E/A- und CPU-Leistungen beanspruchen. Best Practices: Planen Sie Aktualisierungen außerhalb der Hauptverkehrszeiten (z. B. 2:00–4:00 Uhr), verwenden Sie eine Lesereplikat von PostgreSQL für Power BI-Abfragen und implementieren Sie inkrementelle Aktualisierungen, um den Abfrageumfang zu minimieren.

Kann ich Power BI über PostgreSQL mit der Odoo Community (kostenlose Version) verbinden?

Ja. Power BI stellt eine Verbindung zu jeder PostgreSQL-Datenbank her, unabhängig davon, welche Anwendung sie verwaltet. Das PostgreSQL-Schema der Odoo Community ist nahezu identisch mit dem Enterprise-Schema (abzüglich einiger Nur-Enterprise-Tabellen). Die Verbindungsmethode ist dieselbe; Stellen Sie einfach sicher, dass der schreibgeschützte Datenbankbenutzer Zugriff auf die Community-Datenbank hat.

Wie halte ich mein Power BI-Datenmodell synchron, wenn Odoo auf eine neue Version aktualisiert wird?

Odoo-Versions-Upgrades können Datenbanktabellen umbenennen oder neu strukturieren, insbesondere für Module, die einer erheblichen Umgestaltung unterzogen wurden. Führen Sie nach jedem Odoo-Upgrade einen Vergleich der Tabellenschemata zwischen alten und neuen Versionen durch, aktualisieren Sie Power Query-Abfragen, um auf umbenannte Spalten zu verweisen, und validieren Sie alle DAX-Kennzahlen anhand des neuen Schemas. Erstellen Sie eine Schemaänderungsprüfung in Ihr Migrations-Runbook.


Nächste Schritte

Der Aufbau einer Odoo + Power BI-Integration in Produktionsqualität erfordert Fachwissen in der Datenmodellierung, PostgreSQL-Kenntnisse und ein tiefes Verständnis des Odoo-Schemas. Bei richtiger Umsetzung stellt es eine einheitliche Analyseplattform bereit, die die Art und Weise, wie Ihr Führungsteam Entscheidungen trifft, verändert.

ECOSIRE liefert End-to-End-Analyselösungen für Odoo + Power BI – von der Datenbankarchitektur und Datenmodellierung bis hin zum Dashboard-Design, der DAX-Entwicklung und der Bereitstellung. Unser Team vereint Odoo-Expertise und Power BI-Spezialisierung.

Sprechen Sie mit ECOSIRE über Ihre Odoo Analytics-Integration →

Entdecken Sie die Power BI-Dienste von ECOSIRE →

Teilen Sie uns Ihre Berichtsanforderungen mit und wir entwerfen eine Power BI-Architektur, die Ihrem Führungsteam Echtzeit-Einblick in alle Dimensionen Ihrer Odoo-Operationen verschafft.

E

Geschrieben von

ECOSIRE Research and Development Team

Entwicklung von Enterprise-Digitalprodukten bei ECOSIRE. Einblicke in Odoo-Integrationen, E-Commerce-Automatisierung und KI-gestützte Geschäftslösungen.

Chatten Sie auf WhatsApp