Integration
PostgreSQL als Etiketten-Datenquelle: eine Abfrage, tausende Etiketten
Die Artikelstammdaten liegen in PostgreSQL, die Etiketten sollen daraus entstehen. Der übliche Weg führt über einen CSV-Export, der jedes Mal veraltet ist, s…
Die Artikelstammdaten liegen in PostgreSQL, die Etiketten sollen daraus entstehen. Der übliche Weg führt über einen CSV-Export, der jedes Mal veraltet ist, sobald er fertig ist. Der bessere Weg: die Datenbank bleibt die Quelle, und der Etikettendruck fragt sie direkt.
Für MySQL und MariaDB gilt alles hier Beschriebene genauso - nur der Connection-String sieht anders aus.
Zwei Wege in die Datenbank
Über den Agenten, wenn die Datenbank im eigenen Netz steht. Der zplCloudCli-Agent baut eine ausgehende Verbindung zur Plattform auf, führt die Abfrage lokal aus und schickt nur die Ergebniszeilen zurück. Der Connection-String liegt ausschließlich auf deinem Rechner. Es braucht keine offenen Ports von außen.
Direkt aus der Cloud, wenn die Datenbank ohnehin erreichbar ist - etwa eine Azure Database for PostgreSQL oder Amazon RDS. Dann verbindet sich die Plattform selbst; der Connection-String liegt AES-verschlüsselt in der Plattform-Datenbank und wird nur zum Ausführen entschlüsselt.
Variante Agent: den Server bekanntmachen
Der Agent lernt seine Datenbanken über eine Option, eine Umgebungsvariable oder eine Datei. Alle drei sind gleichwertig.
# als Option beim Start
zplcloud proxy --agent "Lager" \
--postgres WMS="Host=pg.internal.lan;Database=wms;Username=zplcloud;Password=...;SSL Mode=Require"
# oder als Umgebungsvariable
export ZPLCLOUD_PG_WMS_CONNECTION="Host=pg.internal.lan;Database=wms;Username=zplcloud;Password=..."
zplcloud proxy --agent "Lager"
# oder als Datei pgservers.json neben der Binary bzw. unter ~/.zplcloud/
# { "postgresServers": { "WMS": "Host=pg.internal.lan;Database=wms;Username=zplcloud;Password=..." } }
Der Name hinter der Option (WMS) taucht später in der Auswahl auf. Für MySQL heißt die Option --mysql, für MariaDB --mariadb, mit entsprechenden Variablen und Dateien.
Ein Tipp aus der Praxis: lege in der Datenbank einen eigenen Benutzer mit Nur-Lese-Rechten auf genau die Tabellen an, die Etiketten brauchen. Der Agent führt ohnehin nur SELECT aus, aber ein Konto, das gar nicht mehr kann, ist die bessere Absicherung.
Datenquelle anlegen
Unter Datenhub → Datenquellen → Neu wählst du den Typ PostgreSQL (Agent) oder PostgreSQL (Cloud), dann den Agenten und den Server. In das Abfragefeld kommt ein einzelnes SELECT:
SELECT a.sku, a.bezeichnung, a.ean, l.lagerplatz, a.mhd
FROM artikel a
JOIN lager l ON l.artikel_id = a.id
WHERE a.aktiv = true
Mit Felder liest die Plattform die Spalten aus, ohne Daten zu laden - danach stehen sie im Designer als Bindings zur Verfügung. Mit Test prüfst du die Verbindung.
Was in der Abfrage erlaubt ist
Die Regeln sind bewusst eng, weil eine Datenquelle lesen und nicht schreiben soll:
- Nur ein einzelnes
SELECToderWITH, kein Semikolon, keine Kommentare, keine mehrfachen Anweisungen. - Filterwerte gehen immer als Parameter an die Datenbank, nie als zusammengesetzter Text. Damit ist SQL-Injection über die Filterzeile ausgeschlossen.
- Filter, Sortierung und
LIMIT/OFFSETwendet die Datenbank an, nicht die Plattform. Deine Indizes wirken also. - Höchstens 1000 Zeilen je Abruf, Zeitlimit 15 Sekunden.
Die 1000 Zeilen sind keine Obergrenze für den Druck: beim Massendruck holt die Plattform serverseitig einen Block nach dem anderen, bis zu 50.000 Etiketten am Stück. Im Speicher liegt trotzdem immer nur ein Block.
Wo die Daten ankommen
Eine fertige Datenquelle steht überall dort zur Verfügung, wo Daten gebraucht werden:
- Print Views - eine geschützte URL mit Formular, in der jemand nach EAN sucht und das gefundene Etikett druckt.
- Batch-Druck - alle Treffer einer Abfrage auf einmal, in Blöcken an den Drucker.
- Designer - als Bindungsdaten, damit die Vorschau echte Werte zeigt statt Platzhaltern.
Häufige Stolpersteine
- „Die Query muss mit SELECT beginnen." Ein Semikolon am Ende reicht schon aus. Weg damit.
- Keine Spalten gefunden. Berechnete Spalten brauchen einen Namen:
SELECT preis 1.19 AS bruttostattSELECT preis 1.19. - Verbindung schlägt fehl. PostgreSQL verlangt bei erreichbaren Servern meist TLS:
SSL Mode=Requiregehört in den Connection-String. - Agent nicht online. Der Agent hält die Verbindung selbst. In der Agent-Übersicht im Datenhub siehst du, welche gerade da sind und welche Server sie melden.