Datenanalyse über Systemgrenzen: So kombiniere ich Access-Abfragen mit WordPress-E-Commerce-Daten

Warum ich das mache

In vielen KMU-Projekten liegt der operative Kern in Access.
Dort leben Artikel, Lieferanten, Preise, Produktionsdaten.
Verkäufe, Kunden und Bestellungen kommen aus WooCommerce.
Wenn Du sauber analysieren willst, musst Du beides zusammenbringen.

Architektur: Zwei Systeme, ein Ziel

SystemDatenbereich
AccessArtikelstamm, Preiskalkulation
WooCommerceKunden, Bestellungen, Umsätze

Ich kombiniere beides regelmäßig – für Umsatzreports, Topseller, Lagerreichweiten.

1. WooCommerce-Daten per REST-API laden

Ich nutze die offizielle WooCommerce-REST-API.

Beispiel: Abruf aller Bestellungen der letzten 30 Tage

Function LadeWooBestellungen() As String
    Dim http As Object
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

    http.Open "GET", "https://shop.de/wp-json/wc/v3/orders?after=" & Format(Now - 30, "yyyy-mm-dd") & "T00:00:00", False
    http.SetRequestHeader "Authorization", "Basic " & Base64BenutzerPW()
    http.Send

    If http.Status = 200 Then
        LadeWooBestellungen = http.ResponseText
    Else
        LadeWooBestellungen = ""
    End If
End Function

Parser: VBA-JSON (JsonConverter.bas) – Standard.

Dann importiere ich die Daten in tbl_woo_bestellungen und tbl_woo_positionen.

2. Daten mit Access verknüpfen

Jetzt liegt der Charme im Access-System: dort ist alles verknüpfbar.

Beispiel: Abfrage mit Access-Artikeln

SELECT a.artikelnummer, a.bezeichnung, Sum(wp.menge) AS verkauft, a.lagerbestand
FROM tbl_woo_positionen wp
INNER JOIN tbl_artikel a ON wp.sku = a.artikelnummer
GROUP BY a.artikelnummer, a.bezeichnung, a.lagerbestand

So sehe ich auf einen Blick:

  • was gut läuft
  • was nachbestellt werden muss
  • ob es Preisabweichungen gibt

3. Zusatz: Verkaufspreise gegenkalkulieren

Ich habe in Access oft den Einkauf + Kalkulationslogik.

SELECT a.artikelnummer, a.einkaufspreis, a.aufschlag_faktor, 
       Round(a.einkaufspreis * a.aufschlag_faktor, 2) AS soll_vk,
       wp.preis_je_einheit AS ist_vk
FROM tbl_woo_positionen wp
INNER JOIN tbl_artikel a ON wp.sku = a.artikelnummer
WHERE Abs(wp.preis_je_einheit - (a.einkaufspreis * a.aufschlag_faktor)) > 0.05

So finde ich falsch eingepflegte Produkte oder veraltete Preise.

4. Kundengruppen aus Access zurückspielen

Nicht alles lebt im Web. Manche Kundengruppen pflege ich in Access.

Sub AktualisiereWooKundengruppe(kundenID As Long, gruppe As String)
    Dim http As Object
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

    Dim payload As String
    payload = "{""meta_data"":[{""key"":""kundengruppe"",""value"":""" & gruppe & """}]}"

    http.Open "PUT", "https://shop.de/wp-json/wc/v3/customers/" & kundenID, False
    http.SetRequestHeader "Authorization", "Basic " & Base64BenutzerPW()
    http.SetRequestHeader "Content-Type", "application/json"
    http.Send payload
End Sub

Dann baue ich in Access Regeln: z. B. B2B-Kunden = Netto, B2C = Brutto.
Die Info steht dann sauber im Shop.

5. Kombination in einem Bericht

Ich baue regelmäßig Access-Berichte mit:

  • Artikeln (aus Access)
  • Verkäufen (aus WooCommerce)
  • Lagerbestand (Access)
  • Durchschnittspreis (Woo)
  • Ertrag (Access-Kalkulation – Woo-VK)

Ein typischer Bericht basiert auf dieser Abfrage:

SELECT a.artikelnummer, a.bezeichnung, 
       Sum(wp.menge) AS verkauft,
       Round(Sum(wp.menge * wp.preis_je_einheit),2) AS umsatz,
       Round(Sum(wp.menge * a.einkaufspreis),2) AS einkauf,
       Round(Sum(wp.menge * (wp.preis_je_einheit - a.einkaufspreis)),2) AS deckung
FROM tbl_woo_positionen wp
INNER JOIN tbl_artikel a ON wp.sku = a.artikelnummer
GROUP BY a.artikelnummer, a.bezeichnung

Die fertige Liste geht dann als PDF an die GL.
Oder als CSV an den Einkauf.

6. Mein Tuning-Tipp

WooCommerce-Daten vorab filtern.
Nicht 10.000 Orders holen, wenn Du nur 30 Tage brauchst.
Und: Nur id, sku, line_items, total abrufen – nicht das ganze JSON-Monster.

Kategorien:

Keine Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert