JTL Workflow Export/Import

Technische Dokumentation & Benutzerhandbuch

Dokument-Version: 1.1 .NET Framework 4.7.2 SQL Server (JTL-Wawi)

Überblick

Dieses Tool ermöglicht das Exportieren, Analysieren (Preview/Dry-Run) und Importieren von JTL-Wawi-Workflows inklusive Bedingungen und Aktionen. Es arbeitet ausschließlich auf den JTL-Datenbanktabellen (tWorkflow*) und benötigt keine internen JTL-APIs.

Zentrale Idee: Beim Import werden die Workflows standardmäßig anhand der in der Datei enthaltenen nObjekt und nEvent automatisch in die richtige Kategorie einsortiert. Fehlt das Ziel-Event im System, wird es in tWorkflowEvent automatisch angelegt. Namenskonflikte (cName) sind je Datei konfigurierbar (KeepBoth / Overwrite / Abort).

Schlüsselbegriffe

  • nObjekt – Modul/Tab in der Wawi (z. B. Artikel, Aufträge, Versand, Rechnungen …). Gespeichert in tWorkflow.nObjekt und tWorkflowEvent.nObjekt.
  • nEvent – Auslöser innerhalb eines Objekts (z. B. Erstellt, Geändert, Manuell …). Gespeichert in tWorkflowEvent.nEvent und tWorkflow.nEvent.
  • cDisplayName – Anzeigename der Event-Gruppe in der Wawi-UI (tWorkflowEvent.cDisplayName).
  • kWorkflow – Identity-ID eines Workflows (Primärschlüssel in tWorkflow).

Tabellen

TabelleBeschreibung
tWorkflowStammdaten zum Workflow (Name, nObjekt, nEvent, Schedulerfelder …).
tWorkflowBedingungBedingungen, referenzieren kWorkflow.
tWorkflowAktionAktionen, referenzieren kWorkflow.
tWorkflowEventDefiniert pro Objekt die vorhandenen Event-Gruppen inkl. Anzeige-Namen.

Funktionen

  • Baum laden: Lädt dynamisch alle Workflows aus der DB und gruppiert nach tWorkflowEvent. (Nur Lesen)
  • Export: Einzel- oder Mehrfach-Export – pro Workflow eine JSON inkl. Bedingungen/Aktionen und optionaler Event-Zeilen.
  • Einzel-Import: Ohne Dialog – nutzt nObjekt/nEvent aus der Datei; Event-Auto-Anlage; konfigurierbarer Konfliktmodus.
  • Batch-Import (Modus B – je Datei): Mehrere JSONs, pro Datei Konfliktmodus wählbar. Checkbox: „Ziel aus Datei übernehmen (nObjekt/nEvent)“ (Standard: AN). Alternativ manuelle Ziel-IDs in der Tabelle.
  • Preview/Dry-Run: Vorschau/Analyse und optionaler Dry-Run mit Rollback – keine Änderungen an der DB.
  • Log: Detailausgaben pro Datei und zusammengefasste Statusanzeige.

Installation & Voraussetzungen

  • Windows, .NET Framework 4.7.2
  • Zugriff auf die JTL-Datenbank (SQL Server). Benutzer benötigt SELECT/INSERT/DELETE auf tWorkflow*.

Bedienung

1) Verbindung testen

  1. Server, Datenbank, Benutzer, Passwort eintragen.
  2. Test Verbindung klicken.

2) Workflows laden

Baum laden – der Baum zeigt alle Workflows aus der DB (read-only). Checkboxen erlauben Mehrfachauswahl für den Export.

3) Export

  1. Ein oder mehrere Workflows markieren (Checkboxen oder ausgewählter Blattknoten).
  2. Export Name und Version eingeben.
  3. Export klicken – pro Workflow wird eine eigene JSON erzeugt (Dateiname: ExportName_kWorkflow_YYYYMMDD_HHMMSS.json im Programmordner).

4) Einzel-Import (ohne Dialog)

  1. JSON wählen (), Import klicken.
  2. Das Ziel wird automatisch aus der Datei übernommen (nObjekt/nEvent). Fehlt die Event-Zeile im Zielsystem, wird sie automatisch in tWorkflowEvent angelegt.
  3. Konfliktmodus ist aktuell KeepBoth (du kannst in der Anwendung auf Overwrite umstellen, falls angeboten).

5) Batch-Import (Modus B – je Datei)

  1. Batch-Import… öffnen.
  2. Dateien hinzufügen… – mehrere JSONs auswählen.
  3. Standardmäßig ist „Ziel aus Datei übernehmen (nObjekt/nEvent)” aktiv. Dann werden Ziel-Spalten automatisch aus der Quelle gesetzt und sind gesperrt. Deaktiviere die Checkbox, um Ziel-IDs pro Datei manuell zu ändern.
  4. Pro Datei in der Spalte Konfliktmodus wählen: KeepBoth / Overwrite / Abort.
  5. Preview für eine textuelle Zusammenfassung; Dry-Run (Checkbox) führt den Import in einer Transaktion aus und rollt zurück.
  6. Import starten – bei aktivem Dry-Run werden alle Änderungen verworfen; andernfalls wird committed.

Technik & Verhalten

  • Kategoriesortierung: Die Einsortierung in der Wawi erfolgt ausschließlich über tWorkflow.nObjekt (Objekt/Maske) und tWorkflow.nEvent (Event-Gruppe). Der Baum in der App liest die vorhandenen Events dynamisch aus tWorkflowEvent und ordnet Workflows daran an.
  • Event-Auto-Creation: Existiert die Kombination (nObjekt,nEvent) im Ziel nicht, wird in tWorkflowEvent automatisch ein Eintrag angelegt. cDisplayName und nSortierung werden, falls vorhanden, aus der Exportdatei übernommen; sonst „Event X“ und 0.
  • Konflikte (Name):
    • Overwrite – Löscht vorhandene Workflows gleichen Namens im Ziel inkl. Bedingungen/Aktionen (DELETE in tWorkflowAktion, tWorkflowBedingung, tWorkflow).
    • KeepBoth – Fügt zusätzlich ein (gleichnamig erlaubt).
    • Abort – Bricht den Import der Datei ab.
  • Positionsvergabe (nPos): Kommt keine sinnvolle Position mit, setzt der Importer automatisch MAX(nPos)+1 pro (nObjekt,nEvent). Falls eine valide nPos in der Datei enthalten ist, kann sie genutzt werden.
  • Transaktionen: Preview und Dry-Run führen alle SQL-Operationen in einer Transaktion aus und rollen immer zurück. Regulärer Import committet am Ende des Batches.
  • Integrität: Identity-/Rowversion-Spalten werden nicht übernommen. Bedingungen/Aktionen werden beim Import auf die neue kWorkflow remappt.
  • Batch-Zielquelle: Checkbox „Ziel aus Datei übernehmen (nObjekt/nEvent)“ aktiviert ⇒ Ziel wird aus tWorkflow der JSON gezogen (Standard). Deaktiviert ⇒ Zieleingabe pro Zeile (manuell) in der Tabelle.

Architektur & Codepfad

  • DynamicTreeBuilder – Lädt Events (tWorkflowEvent) und Workflows (tWorkflow) und baut den UI-Baum.
  • WorkflowExportImportManager – Exportiert einen Workflow (inkl. Bedingungen/Aktionen + passende Eventzeile) in JSON.
  • WorkflowImporter – Kernlogik für Analyse/Import:
    • Analyze(): ermittelt, ob Event angelegt wird & Konflikte (ohne Änderungen).
    • ImportSingleWorkflow(): erzwingt Ziel (nObjekt,nEvent), legt Event ggf. an, behandelt Konflikte, fügt tWorkflow ein und remappt tWorkflowBedingung/tWorkflowAktion.
    • Einfügen von tWorkflow via parametrisierter SQL-Anweisung inkl. Auto-nPos.
  • Einzel-Import (MainForm): Liest JSON → entnimmt nObjekt/nEvent → ruft WorkflowImporter.ImportSingleWorkflow() ohne Dialog auf.
  • Batch-Import (BatchImportForm): Lädt mehrere JSONs in eine Grid-Liste → optional Ziel aus DateiPreview/Dry-Run per Transaktion → Import commit/rollback.

JSON-Struktur (Exportdatei)

Pro Workflow entsteht eine Datei mit folgendem Aufbau:

{
  "ExportName": "MyExport_123",
  "Version": "1.0",
  "Category": "Standard-Export",
  "WorkflowTables": {
    "tWorkflow": [
      {
        "kWorkflow": 123,
        "cName": "AUTOVERSAND - DHL zuweisen",
        "nObjekt": 6,
        "nEvent": 1,
        "nVerknuepfung": 0,
        "nPos": 42,
        "nTyp": 0,
        "nApplikation": 63,
        "nSchedulerOptions": 0,
        "dtSchedulerTime": null,
        "nSchedulerHour": 0,
        "nSchedulerMinute": 0,
        "nSchedulerDayValue": 0,
        "nSchedulerMonthValue": 0
      }
    ],
    "tWorkflowBedingung": [ /* 0..n Zeilen; Spalten außer Identity/Rowversion relevant */ ],
    "tWorkflowAktion":    [ /* 0..n Zeilen; Spalten außer Identity/Rowversion relevant */ ],
    "tWorkflowEvent":     [ /* optional; passende Eventzeile(n) für (nObjekt,nEvent) */ ]
  }
}

Hinweis: Beim Import werden Identity-/Rowversion-Spalten ignoriert bzw. nicht übernommen; Referenzen (kWorkflow) werden auf die neue ID gesetzt.

SQL, Transaktionen & Positionslogik

  • Event-Existenz: SELECT 1 FROM tWorkflowEvent WHERE nObjekt=@o AND nEvent=@e. Falls nicht vorhanden: INSERT INTO tWorkflowEvent(nEvent,nObjekt,cDisplayName,nSortierung).
  • Konfliktprüfung: SELECT kWorkflow FROM tWorkflow WHERE nObjekt=@o AND nEvent=@e AND cName=@n ⇒ Liste bestehender IDs.
    • Overwrite: DELETE in tWorkflowAktion, tWorkflowBedingung, tWorkflow für diese IDs.
  • Insert Workflow (parametrisiert):
    INSERT INTO dbo.tWorkflow (
      cName, nEvent, nObjekt, nVerknuepfung, nPos, nTyp, nApplikation,
      nSchedulerOptions, dtSchedulerTime, nSchedulerHour, nSchedulerMinute,
      nSchedulerDayValue, nSchedulerMonthValue
    )
    VALUES (
      @cName, @nEvent, @nObjekt, @nVerknuepfung,
      COALESCE(@nPosUser, (SELECT ISNULL(MAX(nPos),0)+1 FROM dbo.tWorkflow WHERE nObjekt=@nObjekt AND nEvent=@nEvent)),
      @nTyp, @nApplikation, @nSchedulerOptions, @dtSchedulerTime,
      @nSchedulerHour, @nSchedulerMinute, @nSchedulerDayValue, @nSchedulerMonthValue
    );
    SELECT CAST(SCOPE_IDENTITY() AS int);
  • Insert Bedingungen/Aktionen: Identity/Rowversion-Spalten werden ausgelassen; kWorkflow wird auf die neue ID gesetzt; Einfügen per parametrisierten INSERT.
  • Transaktionen: Batch-Preview und Dry-Run: BeginTransaction → komplette Logik → Rollback. Echter Import: Commit nach erfolgreichem Batch.

Sicherheit & Rechte

  • Benutzer benötigt mind. SELECT/INSERT/DELETE auf tWorkflow, tWorkflowBedingung, tWorkflowAktion, tWorkflowEvent.
  • Das Tool schreibt keine anderen Tabellen, fasst keine Fremdschlüssel anderer Domänen an.
  • Empfehlung: Separate SQL-Logins für Test/Prod, regelmäßige Backups vor Importen.

Kompatibilität

  • Entwickelt und getestet gegen JTL-Wawi DB Schema 1.9.x (z. B. 1.9.6.5).
  • Wenn künftige Wawi-Versionen Spalten ergänzen/ändern, greifen wir defensiv zu: unbekannte Spalten in DataTables werden ignoriert.

Performance & Grenzen

  • Ein Importvorgang umfasst typischerweise wenige Zeilen in tWorkflow*; daher schnell. Bei großen Batches: sinnvoll in Gruppen ausführen.
  • UI-Baum ist read-only; große Mengen Workflows können die Anzeige verzögern – reines DB-Lesen.
  • Kein „vollständiges“ UI-Mapping von nObjekt/nEvent auf sprechende Kategorien, da in der DB nicht konsistent dokumentiert. Einsortierung erfolgt numerisch korrekt.

Schnelle SQL-Snippets

-- Events eines Objekts anzeigen (z. B. Aufträge = 6)
SELECT nEvent, cDisplayName, nSortierung
FROM dbo.tWorkflowEvent
WHERE nObjekt = 6
ORDER BY nEvent;

-- Gleichnamige Workflows im Ziel prüfen
DECLARE @obj INT = 6, @evt INT = 1, @name NVARCHAR(255) = N'AUTOVERSAND - DHL zuweisen';
SELECT kWorkflow, cName FROM dbo.tWorkflow
WHERE nObjekt = @obj AND nEvent = @evt AND cName = @name;

-- „Nächste freie“ Eventnummer je Objekt (einfaches Beispiel)
SELECT ISNULL(MAX(nEvent),0)+1 AS NextEvent
FROM dbo.tWorkflowEvent
WHERE nObjekt = 6;

Änderungshistorie (Kurz)

  • v1.1 – Einzel-Import nutzt automatisch nObjekt/nEvent aus Datei (kein Dialog). Batch-Import mit Checkbox „Ziel aus Datei übernehmen“ (Standard an). Verbesserte Logs, Preview/Dry-Run vereinheitlicht.
  • v1.0 – Export/Import Grundfunktion, dynamischer Baum, Mehrfach-Export, Konfliktmodi.