Invoke-EulUpsert #
ÜBERSICHT #
Fügt eine Zeile in eine EULANDA-Tabelle ein oder aktualisiert sie – erkannt am Schlüssel.
SYNTAX #
Invoke-EulUpsert [-Conn] <__ComObject> [-Table] <string> [-KeyColumns] <string[]> [-Mode] <string>
[[-Schema] <PSCustomObject[]>]
BESCHREIBUNG #
Generisches Upsert für Plugin-Skripte (Excel-Import, Massendaten-Pflege, Schnittstellen). Bestimmt anhand der angegebenen Schlüssel-Spalten, ob der Datensatz bereits existiert:
- Nicht vorhanden → INSERT
- Genau eine Treffer-Zeile → UPDATE
- Mehrere Treffer → Fehler (Schlüssel ist nicht eindeutig)
Identity-Spalten und berechnete Spalten (Computed Columns) werden automatisch erkannt (Get-EulTableSchema) und weder in INSERT-VALUES noch in UPDATE-SET aufgenommen. Schlüssel-Spalten werden beim UPDATE nicht überschrieben (sie stehen in der WHERE-Klausel). Spalten, die nicht in -Row enthalten sind, bleiben beim UPDATE unangetastet und werden beim INSERT auf den SQL-Default gesetzt.
Werte-Formatierung:
$nullund[DBNull]→NULLbool→1/0DateTime→'yyyy-MM-dd HH:mm:ss'- Zahlen (int, double, decimal) → Invariant-Culture (Punkt als Dezimaltrenner)
- Strings → ’ verdoppelt, in Hochkommata
PARAMETER #
-Conn #
Type: __ComObject
Offene ADODB-Verbindung. Caller-owns-Connection, wird NICHT geschlossen.
-Table #
Type: string
Tabellenname (z.B. ‘Artikel’, ‘Adresse’).
-KeyColumns #
Type: string[]
Eine oder mehrere Spalten, die zusammen den fachlichen Schlüssel bilden. Beispiel 'ArtNummer' oder @('AdresseId','ArtNummer').
-Row #
Hashtable oder PSCustomObject mit den Spalten/Werten des Datensatzes. Schlüssel-Spalten MÜSSEN enthalten sein. Identity- und Computed- Spalten werden still ignoriert, falls vorhanden.
-Mode #
Type: string
Default: 'Upsert'
Upsert (Default) – INSERT oder UPDATE je nach Existenz. InsertOnly – nur INSERT, wirft Fehler wenn Datensatz schon existiert. UpdateOnly – nur UPDATE, liefert Action=Skipped wenn Datensatz fehlt.
-Schema #
Type: PSCustomObject[]
Optional: vorab geladenes Schema (Get-EulTableSchema). Spart bei Schleifen über viele Zeilen einen Roundtrip pro Aufruf.
AUSGABEN #
[PSCustomObject] mit:
Action (string) ‘Inserted’ | ‘Updated’ | ‘Skipped’ Id (object) Identity-Wert der eingefügten/aktualisierten Zeile (bei Identity-Tabellen), sonst $null RowsAffected (int) Anzahl betroffener Zeilen aus dem SQL-Befehl
BEISPIELE #
# Artikel anlegen oder aktualisieren
Invoke-EulUpsert -Conn $conn -Table 'Artikel' `
-KeyColumns 'ArtNummer' `
-Row @{ ArtNummer='X1'; Kurztext1='Neuer Artikel'; Vk=12.5 }
# Mit vorab geladenem Schema in einer Schleife
$schema = Get-EulTableSchema -Conn $conn -Table 'Artikel'
foreach ($row in $rows) {
Invoke-EulUpsert -Conn $conn -Table 'Artikel' `
-KeyColumns 'ArtNummer' -Row $row -Schema $schema
}
# Nur Update – kein Anlegen bei Tippfehler in der Excel-Datei
Invoke-EulUpsert -Conn $conn -Table 'Adresse' `
-KeyColumns 'Match' `
-Row @{ Match='MUSTERMANN'; Name1='Mustermann GmbH' } `
-Mode UpdateOnly
HINWEISE #
Phase 4 Tier 1 – DB-Baustein für die Excel-Pipeline und andere Massenpflege-Skripte. Kein parameterisiertes SQL: Plugin-Autor ist für vertrauenswürdige Eingaben verantwortlich (keine End-User-SQL).