Workflow Konfiguration Middleware Connector
Einleitung
Ab der Version 2024.1 ist für die Nutzung der Schnittstelle, also dem Datenaustausch von Stamm- und Bewegungsdaten zu JobRouter, ein zusätzlicher Dienst - der Middleware Connector (kurz: MWC) - erforderlich. Der Middleware Connector übernimmt dabei die Kommunikation mit dem SQL-Server auf der einen Seite und Finance auf der anderen Seite. Letzteres läuft über eine eigene API, die in Finance zur Verfügung gestellt wird. Finance übernimmt wie zuvor die Bereitstellung der Stammdaten und die Verarbeitung von bereitgestellten Bewegungsdaten.
Installation und Einrichtung
Die Installation und Einrichtung sind in unserem Download-Portal zur jeweiligen Version beschrieben.
Für 2024.1: Installation & Update - Nevaris Middleware Connector - 2024.1
Konfigurationsbeispiele
Import
Es gibt mehrere Faktoren, die darüber entscheiden, ob die mitgelieferten Standardkonfigurationen verwendet werden können oder ob eigene verwendet werden müssen. Das sind:
- Tabellennamen auf SQL-Ebene
- Anzahl an unterschiedlichen Tabellen pro Import, wie z. B. zwei Tabellen für den Rechnungseingang
- Nicht alle Tabellen aus dem Standard werden verwendet
Definierter Standard:
Import | Tabellenname |
---|---|
Rechnungseingang | REBUKOPF REBUZEILE |
Rechnungsausgang | RABUKOPF RABUZEILE |
Kassenbuch | KABUKOPF KABUZEILE |
Bestellungen | BESTELLKOPF |
Urlaubsanträge | URLAUBANTRAG |
NU-Bescheinigungen | STAMMDATEN |
Tabellennamen entsprechen dem definierten Standard
Wenn die Tabellennamen dem definierten Standard entsprechen, können die mitgelieferten Standardkonfigurationen verwendet werden.
Tabellennamen entsprechen nicht dem definierten Standard
Wie in der Einrichtungsbeschreibung bereits vermerkt ist, wird dafür eine eigene Konfigurationsdatei benötigt.
In dem vorliegenden Beispiel wurden die Tabellen REBUKOPF, REBUZEILE, RABUKOPF und RABUZEILE umbenannt. Die geänderten Tabellennamen sind innerhalb der "DataSets" beim "TableName" zu ändern.
{ "HttpApis": [ ], "SqlDatabases": [ { "Id": "JobRouterDB", "Schema": { ... }, "DataSets": [ { "Name": "Rebukopf", "TableName": "REBUKOPFWEBCLIENT", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterRebu}}" }, { "Name": "Rebuzeile", "TableName": "REBUZEILEWEBCLIENT", "KeyColumns": "processid, step_id, row_id", "ParentDataSet": "Rebukopf", "ParentKeyColumns": "processid, step_id" }, { "Name": "Kabukopf", "TableName": "KABUKOPF", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterKabu}}" }, { "Name": "Kabuzeile", "TableName": "KABUZEILE", "KeyColumns": "processid, step_id, row_id", "ParentDataSet": "Kabukopf", "ParentKeyColumns": "processid, step_id" }, { "Name": "Rabukopf", "TableName": "RABUKOPFWEBCLIENT", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterRabu}}" }, { "Name": "Rabuzeile", "TableName": "RABUZEILEWEBCLIENT", "KeyColumns": "processid, step_id, row_id", "ParentDataSet": "Rabukopf", "ParentKeyColumns": "processid, step_id" }, { "Name": "Urlaubantrag", "TableName": "URLAUBANTRAG", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterBLO}}" }, { "Name": "Bestellkopf", "TableName": "BESTELLKOPF", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterEK}}" }, { "Name": "Stammdaten", "TableName": "STAMMDATEN", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterStamm}}" }, {...} ], "ReadOptions": { "DataSets": [ "Rebukopf", "Rebuzeile", "Kabukopf", "Kabuzeile", "Rabukopf", "Rabuzeile", "Urlaubantrag", "Bestellkopf", "Stammdaten" ] }, "WriteOptions": { ... } } ] }
Es sind mehrere Importtabellen vorhanden
Im vorliegenden Beispiel sind die Tabellen für den Rechnungseingang mehrfach vorhanden. In diesem Fall werden mindestens zwei eigene Konfigurationsdateien benötigt. Die Anzahl der Konfigurationen hängt von der Anzahl der unterschiedlichen Importtabellen ab. Bei der Erstellung der Konfigurationen sind die Felder "TableName" innerhalb der "DataSets" anzupassen, die "Id" bei den "SqlDatabases" sowie in einer eigenen Konfiguration für den Export* die "Id" bei den "HttpApis". Die ID wird zur Zuweisung der Konfiguration (über das Feld "Datenhaltung") zu einem MWC-Job verwendet.
Die Status-Änderung für das Feld "BK_Status" wird über den Export-Job mit übertragen.
Konfiguration 1 (SQL > Finance):
{ "HttpApis": [ ], "SqlDatabases": [ { "Id": "JobRouterDB", "Schema": { ... }, "DataSets": [ { "Name": "Rebukopf", "TableName": "REBUKOPF", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterRebu}}" }, { "Name": "Rebuzeile", "TableName": "REBUZEILE", "KeyColumns": "processid, step_id, row_id", "ParentDataSet": "Rebukopf", "ParentKeyColumns": "processid, step_id" }, { "Name": "Kabukopf", "TableName": "KABUKOPF", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterKabu}}" }, { "Name": "Kabuzeile", "TableName": "KABUZEILE", "KeyColumns": "processid, step_id, row_id", "ParentDataSet": "Kabukopf", "ParentKeyColumns": "processid, step_id" }, { "Name": "Rabukopf", "TableName": "RABUKOPF", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterRabu}}" }, { "Name": "Rabuzeile", "TableName": "RABUZEILE", "KeyColumns": "processid, step_id, row_id", "ParentDataSet": "Rabukopf", "ParentKeyColumns": "processid, step_id" }, { "Name": "Urlaubantrag", "TableName": "URLAUBANTRAG", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterBLO}}" }, { "Name": "Bestellkopf", "TableName": "BESTELLKOPF", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterEK}}" }, { "Name": "Stammdaten", "TableName": "STAMMDATEN", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterStamm}}" }, {...} ], "ReadOptions": { "DataSets": [ "Rebukopf", "Rebuzeile", "Kabukopf", "Kabuzeile", "Rabukopf", "Rabuzeile", "Urlaubantrag", "Bestellkopf", "Stammdaten" ] }, "WriteOptions": { ... } } ] }
Konfiguration 1 (Finance > SQL):
{ "HttpApis": [ { "Id": "FinanceApi", "ModifiedAtField": "changedAt", "DeletedAtField": "deletedAt", "QueryArguments": [ { "FilterMode": "ModifiedAt", "Parameter": "$filter", "Value": "changedAt gt {{lastSyncTime}} and tableNameExternal eq 'REBUKOPF'", "FallbackValue": "changedAt gt 0001-01-01T00:00:00Z" }, { "FilterMode": "DeletedAt", "Parameter": "$filter", "Value": "deletedAt gt {{lastSyncTime}} and tableNameExternal eq 'REBUKOPF'", "FallbackValue": "deletedAt gt 0001-01-01T00:00:00Z" } ], "DataSets": [ {...} ], "WriteOptions": { ... }, "VariableProviderQuery": "workflowSetup", "ApiVersionQuery": "workflowApiVersion", "RequiredApiVersion": "1.0" } ], "SqlDatabases": [ ] }
Konfiguration 2 (SQL > Finance):
{ "HttpApis": [ ], "SqlDatabases": [ { "Id": "JobRouterDB2", "Schema": { ... }, "DataSets": [ { "Name": "Rebukopf", "TableName": "REBUKOPFWEBCLIENT", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterRebu}}" }, { "Name": "Rebuzeile", "TableName": "REBUZEILEWEBCLIENT", "KeyColumns": "processid, step_id, row_id", "ParentDataSet": "Rebukopf", "ParentKeyColumns": "processid, step_id" }, { "Name": "Kabukopf", "TableName": "KABUKOPF", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterKabu}}" }, { "Name": "Kabuzeile", "TableName": "KABUZEILE", "KeyColumns": "processid, step_id, row_id", "ParentDataSet": "Kabukopf", "ParentKeyColumns": "processid, step_id" }, { "Name": "Rabukopf", "TableName": "RABUKOPF", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterRabu}}" }, { "Name": "Rabuzeile", "TableName": "RABUZEILE", "KeyColumns": "processid, step_id, row_id", "ParentDataSet": "Rabukopf", "ParentKeyColumns": "processid, step_id" }, { "Name": "Urlaubantrag", "TableName": "URLAUBANTRAG", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterBLO}}" }, { "Name": "Bestellkopf", "TableName": "BESTELLKOPF", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterEK}}" }, { "Name": "Stammdaten", "TableName": "STAMMDATEN", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterStamm}}" }, {...} ], "ReadOptions": { "DataSets": [ "Rebukopf", "Rebuzeile", "Kabukopf", "Kabuzeile", "Rabukopf", "Rabuzeile", "Urlaubantrag", "Bestellkopf", "Stammdaten" ] }, "WriteOptions": { ... } } ] }
Konfiguration 2 (Finance > SQL):
{ "HttpApis": [ { "Id": "FinanceApiWeb", "ModifiedAtField": "changedAt", "DeletedAtField": "deletedAt", "QueryArguments": [ { "FilterMode": "ModifiedAt", "Parameter": "$filter", "Value": "changedAt gt {{lastSyncTime}} and tableNameExternal eq 'REBUKOPFWEBCLIENT'", "FallbackValue": "changedAt gt 0001-01-01T00:00:00Z" }, { "FilterMode": "DeletedAt", "Parameter": "$filter", "Value": "deletedAt gt {{lastSyncTime}} and tableNameExternal eq 'REBUKOPFWEBCLIENT'", "FallbackValue": "deletedAt gt 0001-01-01T00:00:00Z" } ], "DataSets": [ {...} ], "WriteOptions": { ... }, "VariableProviderQuery": "workflowSetup", "ApiVersionQuery": "workflowApiVersion", "RequiredApiVersion": "1.0" } ], "SqlDatabases": [ ] }
Nicht alle Tabellen aus dem definierten Standard werden verwendet
Wie in der Einrichtungsbeschreibung bereits vermerkt ist, wird dafür eine eigene Konfigurationsdatei benötigt.
In dem vorliegenden Beispiel werden die Tabellen REBUKOPF und REBUZEILE verwendet. Die übrigen Tabellen werden innerhalb der "DataSets" entfernt.
{ "HttpApis": [ ], "SqlDatabases": [ { "Id": "JobRouterDB", "Schema": { ... }, "DataSets": [ { "Name": "Rebukopf", "TableName": "REBUKOPF", "KeyColumns": "processid, step_id", "WhereFilter": "{{filterRebu}}" }, { "Name": "Rebuzeile", "TableName": "REBUZEILE", "KeyColumns": "processid, step_id, row_id", "ParentDataSet": "Rebukopf", "ParentKeyColumns": "processid, step_id" }, {...} ], "ReadOptions": { "DataSets": [ "Rebukopf", "Rebuzeile" ] }, "WriteOptions": { ... } } ] }
Export
Mit Ausnahme des Importes über mehrere Tabellen ist keine eigene Konfiguration für den Export erforderlich. Die notwendigen Informationen zur Zieldatenbank ergeben sich aus der Job-Konfiguration (Verbindungsinformationen innerhalb des Zielabschnittes) des MWC.
Getrennte Übertragung der Stammdaten und BK_Status-Änderungen
Konfiguration 1 (BK_Status und Upload):
{ "HttpApis": [ { "Id": "FinanceApi", "ModifiedAtField": "changedAt", "DeletedAtField": "deletedAt", "QueryArguments": [ { "FilterMode": "ModifiedAt", "Parameter": "$filter", "Value": "changedAt gt {{lastSyncTime}}", "FallbackValue": "changedAt gt 0001-01-01T00:00:00Z" }, { "FilterMode": "DeletedAt", "Parameter": "$filter", "Value": "deletedAt gt {{lastSyncTime}}", "FallbackValue": "deletedAt gt 0001-01-01T00:00:00Z" } ], "DataSets": [ { "Name": "Rebukopf", "Query": "rebukoepfe", "SupportsDeletedAt": false }, { "Name": "Rebuzeile", "Query": "rebuzeilen" }, { "Name": "Kabukopf", "Query": "kabukoepfe", "SupportsDeletedAt": false }, { "Name": "Kabuzeile", "Query": "kabuzeilen", "SupportsDeletedAt": false }, { "Name": "Rabukopf", "Query": "rabukoepfe", "SupportsDeletedAt": false }, { "Name": "Rabuzeile", "Query": "rabuzeilen", "SupportsDeletedAt": false }, { "Name": "Urlaubantrag", "Query": "personalUrlaube", "SupportsDeletedAt": false }, { "Name": "Bestellkopf", "Query": "einkaufBestellungen", "SupportsDeletedAt": false }, { "Name": "Stammdaten", "Query": "stammdatenImporte", "SupportsDeletedAt": false } ], "WriteOptions": { "OutputStringForNullDate": "0001-01-01T00:00:00Z", "FieldMappings": [ { "DataSet": "Rebuzeile", "SourceField": "produktbuchungsgrupp", "TargetField": "produktbuchungsgruppe" }, { "DataSet": "Urlaubantrag", "SourceField": "personalnr", "TargetField": "personalnummer" }, { "DataSet": "Rebukopf", "SourceField": "freigabevermerk", "TargetField": "freigabevermerk@odata.mediaEditLink" }, { "DataSet": "Rebukopf", "SourceField": "pruefvermerk", "TargetField": "pruefvermerk@odata.mediaEditLink" }, { "DataSet": "Stammdaten", "SourceField": "Dokument_ID", "TargetField": null } ] }, "VariableProviderQuery": "workflowSetup", "ApiVersionQuery": "workflowApiVersion", "RequiredApiVersion": "1.0" } ], "SqlDatabases": [ ] }
Konfiguration 2 (Stammdaten):
{ "HttpApis": [ { "Id": "FinanceApi", "ModifiedAtField": "changedAt", "DeletedAtField": "deletedAt", "QueryArguments": [ { "FilterMode": "ModifiedAt", "Parameter": "$filter", "Value": "changedAt gt {{lastSyncTime}}", "FallbackValue": "changedAt gt 0001-01-01T00:00:00Z" }, { "FilterMode": "DeletedAt", "Parameter": "$filter", "Value": "deletedAt gt {{lastSyncTime}}", "FallbackValue": "deletedAt gt 0001-01-01T00:00:00Z" } ], "DataSets": [ { "Name": "Abwarten", "Query": "queryBKAbwarten" }, { "Name": "Adresse_Typ", "Query": "queryBKAdresseTypen" }, { "Name": "Adresse", "Query": "queryBKAdressen" }, { "Name": "Anlage_AFA", "Query": "queryBKAnlagenAfa" }, { "Name": "Anlage", "Query": "queryBKAnlagen" }, { "Name": "Anzahlungsvorgaenge_D", "Query": "queryBKAnzVorgaengeD" }, { "Name": "Anzahlungsvorgaenge", "Query": "queryBKAnzVorgaenge" }, { "Name": "Artikel", "Query": "queryBKArtikel" }, { "Name": "Artikellieferant", "Query": "queryBKArtikellieferanten" }, { "Name": "BAS", "Query": "queryBKBAS" }, { "Name": "Bauleiter", "Query": "queryBKBauleiter" }, { "Name": "Bestellungen", "Query": "queryBKBestellungen" }, { "Name": "Buchungsmatrix_Einrichtung", "Query": "queryBKBuchungsmatrix" }, { "Name": "Debitor", "Query": "queryBKDebitoren" }, { "Name": "Debitorposten", "Query": "queryBKDebitorposten" }, { "Name": "Dokument_Rechnung_Lieferschein", "Query": "queryBKDokumenteRechnungen" }, { "Name": "Einkaufslieferzeile", "Query": "queryBKLieferzeilen" }, { "Name": "EKListenpreis", "Query": "queryBKListenpreise" }, { "Name": "Ergebniszuordnung", "Query": "queryBKErgebniszuordnungen" }, { "Name": "Geraet", "Query": "queryBKGeraete" }, { "Name": "Geschäftsbuchungsgruppe", "Query": "queryBKGGruppen" }, { "Name": "Gueltige_Kreditoren_Kostenart", "Query": "queryBKKreditorenKar" }, { "Name": "Kassenbuch", "Query": "queryBKKassenbuecher" }, { "Name": "Kostenart", "Query": "queryBKKostenarten" }, { "Name": "Kostenstelle", "Query": "queryBKKostenstellen" }, { "Name": "Kostenstellentyp", "Query": "queryBKKostenstellentypen" }, { "Name": "Kostentraeger", "Query": "queryBKKostentraeger" }, { "Name": "Kreditor", "Query": "queryBKKreditoren" }, { "Name": "Kreditorbank", "Query": "queryBKKreditorBanken" }, { "Name": "KSt_BAS", "Query": "queryBKKStBAS" }, { "Name": "KSt_Kar", "Query": "queryBKKStKar" }, { "Name": "KSt_KTr", "Query": "queryBKKStKTr" }, { "Name": "Lagerfach", "Query": "querybkLagerfaecher" }, { "Name": "Lagerort", "Query": "queryBKLagerorte" }, { "Name": "Lieferant", "Query": "queryBKLieferanten" }, { "Name": "Mandant", "Query": "queryBKMandanten" }, { "Name": "Mengeneinheit", "Query": "queryBKMengeneinheiten" }, { "Name": "Mitarbeiter_SUB", "Query": "queryBKMitarbeiterSUB" }, { "Name": "MWST_Buchungsmatrix_Einr", "Query": "queryBKMWSTBuchungsmatrix" }, { "Name": "MWST_Geschäftsbuchungsgrp", "Query": "queryBKMWSTGGruppen" }, { "Name": "MWST_Produktbuchungsgrp", "Query": "queryBKMWSTPGruppen" }, { "Name": "Niederlassung", "Query": "queryBKNiederlassungen" }, { "Name": "NU_AdrBeschPosVer", "Query": "queryBKNUAdrBeschPosVer" }, { "Name": "NU_Adresse_BesPos", "Query": "queryBKNUAdresseBesPos" }, { "Name": "NU_Bes_uebergreifend", "Query": "queryBKNUBesuebergreifend" }, { "Name": "Nummernserie", "Query": "queryBKNummernserien" }, { "Name": "NURechnung", "Query": "queryBKNURechnungen" }, { "Name": "NUSubNu", "Query": "queryBKNUSubNu" }, { "Name": "NUTeilvertrag", "Query": "queryBKNUTeilvertraege" }, { "Name": "PersonalstammBLO", "Query": "queryBKPersonalstammBLO" }, { "Name": "Produktbuchungsgruppe", "Query": "queryBKPGruppen" }, { "Name": "Projekt", "Query": "queryBKProjekte" }, { "Name": "ProjektBeteiligte", "Query": "queryBKProjektBeteiligte" }, { "Name": "Sachkonto", "Query": "queryBKSachkonten" }, { "Name": "Sparte", "Query": "queryBKSparten" }, { "Name": "Währung", "Query": "queryBKWaehrungen" }, { "Name": "Währungswechselkurs", "Query": "queryBKWaehrungswechselkurse" }, { "Name": "Zahlungsbedingung", "Query": "queryBKZahlungsbedingungen" }, { "Name": "ZV_Kopf", "Query": "queryBKZahlungen" }, { "Name": "ZV_Zeile", "Query": "queryBKZahlungszeilen" } ], "WriteOptions": { "OutputStringForNullDate": "0001-01-01T00:00:00Z", "FieldMappings": [ ] }, "VariableProviderQuery": "workflowSetup", "ApiVersionQuery": "workflowApiVersion", "RequiredApiVersion": "1.0" } ], "SqlDatabases": [ ] }