Technische Dokumentation & Benutzerhandbuch
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.
tWorkflowEvent automatisch angelegt. Namenskonflikte (cName) sind je Datei konfigurierbar (KeepBoth / Overwrite / Abort).
tWorkflow.nObjekt und tWorkflowEvent.nObjekt.tWorkflowEvent.nEvent und tWorkflow.nEvent.tWorkflowEvent.cDisplayName).tWorkflow).| Tabelle | Beschreibung |
|---|---|
| tWorkflow | Stammdaten zum Workflow (Name, nObjekt, nEvent, Schedulerfelder …). |
| tWorkflowBedingung | Bedingungen, referenzieren kWorkflow. |
| tWorkflowAktion | Aktionen, referenzieren kWorkflow. |
| tWorkflowEvent | Definiert pro Objekt die vorhandenen Event-Gruppen inkl. Anzeige-Namen. |
tWorkflowEvent. (Nur Lesen)tWorkflow*.Baum laden – der Baum zeigt alle Workflows aus der DB (read-only). Checkboxen erlauben Mehrfachauswahl für den Export.
ExportName_kWorkflow_YYYYMMDD_HHMMSS.json im Programmordner).nObjekt/nEvent). Fehlt die Event-Zeile im Zielsystem, wird sie automatisch in tWorkflowEvent angelegt.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.tWorkflowEvent automatisch ein Eintrag angelegt. cDisplayName und nSortierung werden, falls vorhanden, aus der Exportdatei übernommen; sonst „Event X“ und 0.DELETE in tWorkflowAktion, tWorkflowBedingung, tWorkflow).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.kWorkflow remappt.tWorkflow der JSON gezogen (Standard). Deaktiviert ⇒ Zieleingabe pro Zeile (manuell) in der Tabelle.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.tWorkflow via parametrisierter SQL-Anweisung inkl. Auto-nPos.WorkflowImporter.ImportSingleWorkflow() ohne Dialog auf.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.
SELECT 1 FROM tWorkflowEvent WHERE nObjekt=@o AND nEvent=@e. Falls nicht vorhanden: INSERT INTO tWorkflowEvent(nEvent,nObjekt,cDisplayName,nSortierung).SELECT kWorkflow FROM tWorkflow WHERE nObjekt=@o AND nEvent=@e AND cName=@n ⇒ Liste bestehender IDs.
DELETE in tWorkflowAktion, tWorkflowBedingung, tWorkflow für diese IDs.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);
kWorkflow wird auf die neue ID gesetzt; Einfügen per parametrisierten INSERT.tWorkflow, tWorkflowBedingung, tWorkflowAktion, tWorkflowEvent.tWorkflow*; daher schnell. Bei großen Batches: sinnvoll in Gruppen ausführen.nObjekt/nEvent auf sprechende Kategorien, da in der DB nicht konsistent dokumentiert. Einsortierung erfolgt numerisch korrekt.-- 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;