MySQL-Reporting in Access: So filtere ich Live-Daten aus WooCommerce & Co.

Warum Access?

Wenn Du WooCommerce-Daten auswerten willst, reicht ein Export selten.
Du brauchst Live-Zugriff, Filter, Abfragen, eigene Logik.
Und Access kann das – besser als Excel oder irgendein WordPress-Plugin.

Mit ODBC greifst Du direkt auf MySQL zu.
Und mit ein bisschen Jet-SQL und VBA machst Du daraus ein flexibles Reporting-Tool fĂŒr den Mittelstand.

Vorbereitung: MySQL-ODBC-Verbindung

Installiere den „MySQL ODBC 8.0 Unicode Driver“. Oder aktueller.
Dann in Access eine verknĂŒpfte Tabelle anlegen – oder den Zugriff per Code.

Beispiel ohne DSN:

Public Function MySQL_Open(sql As String) As DAO.Recordset
    Dim db As DAO.Database
    Set db = OpenDatabase("", False, False, _
        "ODBC;Driver={MySQL ODBC 8.0 Unicode Driver};" & _
        "Server=deinserver.de;Database=woocommerce;" & _
        "User=readonly;Password=geheim;Option=3;")

    Set MySQL_Open = db.OpenRecordset(sql)
End Function

WooCommerce: Die wichtigsten Tabellen

TabelleInhalt
wp_postsBestellungen (post_type = ’shop_order‘)
wp_postmetaZusatzdaten zu Bestellungen
wp_woocommerce_order_itemsPositionen in Bestellungen
wp_usersKunden
wp_usermetaKundendaten (Telefon, Adresse, etc.)

Bestellungen werden als post_type = 'shop_order' gespeichert.
Status wie wc-completed, wc-processing stehen im post_status.

Beispiel: Abfrage aller Bestellungen der letzten 7 Tage

SELECT ID, post_date, post_status
FROM wp_posts
WHERE post_type = 'shop_order'
AND post_date >= DATE_SUB(NOW(), INTERVAL 7 DAY)

Jet-SQL-Tipp: Views auf MySQL-Seite anlegen

Wenn Du komplexe Abfragen in Access machst, bremst Jet-SQL.
Also leg in MySQL eine View an:

CREATE VIEW vw_recent_orders AS
SELECT p.ID, p.post_date, pm1.meta_value AS order_total
FROM wp_posts p
LEFT JOIN wp_postmeta pm1 ON pm1.post_id = p.ID AND pm1.meta_key = '_order_total'
WHERE p.post_type = 'shop_order' AND p.post_status = 'wc-completed'

Dann in Access verknĂŒpfen.
Keine Performanceprobleme mehr. Kein Ärger mit SQL-Syntax.

Dynamische Filter in Access

In Deinem Access-Frontend kannst Du dann per Formular steuern, was gefiltert wird.

Beispiel: Filter auf Kundennummer oder Zeitraum

Dim sql As String
sql = "SELECT * FROM vw_recent_orders WHERE 1=1"

If Not IsNull(Me.txtKunde) Then
    sql = sql & " AND customer_id = " & Me.txtKunde
End If

If Not IsNull(Me.txtVon) Then
    sql = sql & " AND post_date >= #" & Format(Me.txtVon, "yyyy-mm-dd") & "#"
End If

If Not IsNull(Me.txtBis) Then
    sql = sql & " AND post_date <= #" & Format(Me.txtBis, "yyyy-mm-dd") & "#"
End If

Set Me.Form.Recordset = MySQL_Open(sql)

DatensÀtze zÀhlen, Summen bilden

Access kann das auch live ĂŒber ODBC – aber nur, wenn Du Views oder Server-Abfragen nutzt.

SELECT COUNT(*) AS Anzahl, SUM(meta_value) AS Umsatz
FROM wp_postmeta
WHERE meta_key = '_order_total'

Oder auf der Access-Seite:

Dim rs As DAO.Recordset
Set rs = MySQL_Open("SELECT SUM(order_total) FROM vw_recent_orders")
Me.lblUmsatz.Caption = Format(rs(0), "Currency")

Automatischer Export nach Excel

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, _
    "vw_recent_orders", "C:\Berichte\Umsatzbericht.xlsx", True

Oder als PDF:

DoCmd.OutputTo acOutputReport, "rpt_Umsatz", acFormatPDF, "C:\Berichte\Umsatz.pdf"

Sicherheit nicht vergessen

  • Nur lesende MySQL-User verwenden
  • Keine Kennwörter im Klartext speichern
  • Optional: Zugriff ĂŒber VPN oder SSH-Tunnel
  • Backup der MySQL-Datenbank regelmĂ€ĂŸig einplanen

Mein Fazit als DatenschÀfer

WooCommerce ist nicht fĂŒrs Reporting gebaut.
Access schon.
Wenn Du beides kombinierst, bekommst Du das Beste aus beiden Welten.

Das Web verkauft.
Access wertet aus.
Und der Schef weiß, wo der Umsatz liegt.

Kategorien:

Schlagwörter: