Der SDK-Helper

Der SDK-Helper ist die zentrale Schnittstelle zwischen C#-Skripten und der Syncler-Anwendung.
Er ermöglicht den Datenaustausch (Quell-/Ziel-/Kontextdaten), steuert Sync-Parameter, liefert Hilfsfunktionen (z. B. Logging, HTTP-Aufrufe, Parameterverwaltung) und stellt Modelle (z. B. Datensatz-Abbildungen) bereit.

Geltungsbereich: Alle Eigenschaften und Methoden des Helpers beziehen sich immer auf den aktuellen Account/Mandanten.

Syncler stellt zusätzlich ausgewählte .NET-APIs und Newtonsoft.Json (z. B. JObject, JArray, JToken) bereit, um JSON-Daten komfortabel zu lesen und zu erzeugen.


Lebenszyklus & Einsatz

  1. Skriptstart: Der Helper wird dem Skript beim Start als Objekt Helper übergeben.
  2. Kontextzugriff: Skripte lesen/setzen Sync-Parameter (z. B. Filter, Konflikt-/Fehlerverhalten) und greifen auf Quell-/Zieldaten zu.
  3. Operationen: Daten lesen/schreiben, Mappings abfragen/aktualisieren, Protokolle schreiben, HTTP/Service-Aufrufe durchführen, Warteschlangen-Einträge anlegen u. v. m.
  4. Rückgabe: Modifizierte Daten/Ergebnisse werden an den Workflow (Transformation, Sync, SDK-Konnektor) zurückgegeben.

Eigenschaften

Einige Eigenschaften wirken steuernd auf SDK-Syncs (werden vom Sync ausgewertet).
JSON-Typen: JObject, JArray (Newtonsoft.Json).

Eigenschaft Typ Beschreibung
Helper.IsCancelled bool Zeigt an, dass ein Abbruch angefordert wurde (siehe Cancel()).
Helper.ConnectionId int System-ID (Konnektor) des aktuellen Kontexts; für API-Aufrufe nutzbar.
Helper.ProcessId int Sync-ID des aktuellen Kontexts; wird u. a. in Mapping-/Log-Methoden verwendet.
Helper.ClientNumber int Mandantennummer des Syncs (Datenstrukturierung, Filter für Mappings).
Helper.WhereClause string Quell-Filter für die Datenermittlung; kann die Sync-Ausführung beeinflussen.
Helper.ForceQueryAll bool Volles Lesen ohne Änderungsgrenzwert (übersteuert Änderungslogik).
Helper.ConflictAction string Konfliktverhalten: USE_SOURCE, USE_TARGET, SKIP, IGNORE, SOURCE_CHANGES.
Helper.ErrorAction string Fehlerverhalten: REPEAT_ALL, REPEAT_DIFFERENCES, QUERY_NEXT, IGNORE, STOP.
Helper.ClientWhereClause string Übereinstimmungs-/Dublettensuche bei unbekannten Datensätzen.
Helper.DublettActionNoMatch string Verhalten kein Treffer: SKIP, SKIP_WITH_WARNING, WRITE, REPEAT, REPEAT_WRITE.
Helper.DublettActionOneMatch string Verhalten ein Treffer: SKIP, SKIP_WITH_WARNING, MAPPING_ONLY, MAPPING_AND_SYNCH, WRITE_NEW.
Helper.DublettActionMultipleMatches string Verhalten mehrere Treffer: SKIP, SKIP_WITH_WARNING, MAPPING_ONLY_FIRST, MAPPING_AND_SYNCH_FIRST, WRITE_NEW.
Helper.SecondWhereClause string Zweitfilter (nach Transformation) zur Auswahl transformierter Quelldaten.
Helper.SourceObject string Name des Quellobjekttyps (SDK-Sync).
Helper.TargetObject string Name des Zielobjekttyps (SDK-Sync & SDK-Konnektor).
Helper.SourceType string Typ/Bezeichnung des Quellsystems.
Helper.TargetType string Typ/Bezeichnung des Zielsystems.
Helper.SourceSchemaObject JObject Schemaobjekt des Quelltyps.
Helper.TargetSchemaObject JObject Schemaobjekt des Zieltyps.
Helper.Statement string Abfrage-Statement der aktuellen Query-Anforderung (JSON-Abfrage-Skripte).
Helper.Action JObject Ausführungsparameter der aktuellen Operation.
Helper.Page int Paging-Zähler (Start: 0), wird pro Lese-Durchlauf erhöht.
Helper.SkipLoading bool Wird durch SkipLoad() gesetzt; überspringt das Lesen der Quelle.
Helper.InnerException string Fehlertext für Datensatz-Skripte (bei Ergebnis Failed erforderlich).
Helper.GetObject JObject Aktueller Quelldatensatz (Datensatz-Skripte in SDK-Syncs).
Helper.GetChildObjects JArray Positionsliste bei geschachtelten Daten; Objekt-Flag "DELETE": true kann Positionen löschen (systemabhängig).
Helper.SetObject JObject Aktuelles Zielobjekt (SDK-Sync Datensatzskript, SDK-Konnektor, JSON-Write-Skript). Hinweis: Eine Änderung der Daten in einem SDK-Sync funktioniert nicht mit diesem Objekt, da es keine Änderungserkennung hat. Hierfür muss das Quellobjekt geändert und der Wert per Feldzuordnung übertragen werden.
Helper.SetObjectChanges JObject Differenzen im Zielobjekt (SDK-Konnektor); echte Änderungen bei vorhandenem Primärschlüssel.
Helper.IsNewSetObject bool Flag: Das Zielobjekt ist ein neuer Datensatz.
Helper.DeleteSetObject bool Flag: Das Zielobjekt soll gelöscht werden.
Helper.Mappings JArray Feldzuordnungen des Syncs. Einträge mit SourcePath, SourceColumn (SchemaColumn), TargetPath, TargetColumn (SchemaColumn).

Methoden

Ausführung steuern

  • Helper.Cancel()
    Fordert den Abbruch der aktuellen Ausführung an (SDK-Syncs werten dies aus).
  • Helper.SkipLoad()
    Überspringt den Lese-Schritt (Quelle) in SDK-Syncs.

Parameter lesen/schreiben

  • Helper.GetParam(string name) : string
    Liefert den Parameterwert (oder "" wenn nicht vorhanden).
  • Helper.GetParam<T>(string name, T defaultValue = default) : T
    Liefert typisiert; bei Nichtvorhandensein defaultValue.
  • Helper.GetParamOrNull<T>(string name) : T
    Liefert typisiert oder null (für explizit nullable, z. B. DateTime?).
  • Helper.SetParam<T>(string name, T value)
    Legt/aktualisiert einen Parameter.

Feldnotation & Parsing

  • Helper.FieldStringToColumnObject(string fieldString) : JObject
    Wandelt eine Feldnotation (z. B. aus Filtern) in ein JObject mit adressierbaren Eigenschaften um.

Datensatz-Abbildungen (Mappings)

  • Helper.GetDataMappingBySourceId(int processId, string sourceId) : SisDataMapping
  • Helper.GetDataMappingByTargetId(int processId, string targetId) : SisDataMapping
  • Helper.GetDataMappingComplementaryBySourceId(int processId, string sourceId, string targetObject = null) : List<SisDataMapping>

    Komplementäre Mappings entgegengesetzter Syncs (für Konfliktmanagement/Zielerkennung).

  • Helper.GetDataMappingParallelByTargetId(int processId, string targetId) : List<SisDataMapping>

    Parallele Mappings gleicher Richtung (Ziel-Änderungsinformation muss häufig mitgezogen werden).

  • Helper.SaveDataMapping(SisDataMapping mapping) : SisDataMapping
    Legt eine neue oder aktualisiert eine bestehende Datensatz-Abbildung.
  • Helper.IncreaseOwnDataMapping(SisDataMapping mapping, object newUpdatedInfoA, object newUpdatedInfoB, bool onlyA = false, bool onlyB = false)
    Aktualisiert Änderungsinformationen (Quelle/Ziel) für das eigene Mapping (Konfliktauflösung).
  • Helper.IncreaseComplementaryMappings(string currentSourceId, string currentTargetId, object newUpdatedInfoA, object newUpdatedInfoB, bool onlyA = false, bool onlyB = false)
    Sucht/aktualisiert komplementäre Mappings (teilweise Aktualisierung möglich).
  • Helper.IncreaseParallelMappings(string currentSourceId, string currentTargetId, object newUpdatedInfoA, object newUpdatedInfoB, bool onlyA = false, bool onlyB = false)
    Sucht/aktualisiert parallele Mappings (Konfliktpfade entschärfen).

Sync-Informationen

  • Helper.GetProcessInfoList(int? sourceConnectionId = null, int? targetConnectionId = null) : List<SisProcessInfo>
    Liefert Infos zu Syncs des Accounts (optional gefiltert nach Systemen).
  • Helper.GetProcessInfoComplementary(int processId) : List<SisProcessInfo>
    Komplementäre Syncs des angegebenen Syncs.
  • Helper.GetProcessInfoParallel(int processId) : List<SisProcessInfo>
    Parallele Syncs des angegebenen Syncs.

Protokoll & Nachrichten

  • Helper.InsertLog(SisLog log)
  • Helper.InsertLog(string message, int level)
    Speichert Protokolleinträge (in der Account-Datenbank). Level:
    0=Message, 1=Error, 2=Warning, 3=Info/Notice, 4=Feedback, 5=Debug.
  • Helper.InsertMessage(string message, int level)
    Schreibt Broadcast-Nachrichten (UI-Ticker, nicht dauerhaft).

HTTP & Service-Aufrufe

  • Helper.InvokeUrl(string url, string method, JObject header, string data, bool base64 = false) : string
    Führt einen HTTP-Request aus; Header als JObject (Eigenschaft=Headername).
    Bei base64=true wird der Antwort-Body Base64-kodiert zurückgegeben.
  • Helper.ServiceCall(string method, string url, string data) : string
    Ruft die Syncler-API auf (als url nur den Endpunkt übergeben).

Parameterverwaltung (persistente interne Parameter)

  • Helper.GetParameterList(string name, string connectionId = null, string processId = null) : List<SisParam>
    Liest Parameterlisten (optional nach System/Sync einschränken).
  • Helper.SaveParameter(SisParam parameter, string connectionId = null, string processId = null)
    Speichert/aktualisiert einen Parameter.
  • Helper.DeleteParameter(int parameterId)
    Löscht einen Parameter.

Datenzugriff über Konnektoren

  • Helper.InvokeGetData(string connectionId, string targetObject, List<SisParam> getParams) : JArray
    Ruft Daten aus einem System ab (Schema = targetObject).
    Übliche Parameter-Namen (abhängig vom System/Konnektor):
    GETDATA_ID, GETDATA_RELATED_ID, GETDATA_RELATED, GETDATA_WHERE, GETDATA_MODIFIED, GETDATA_ORDER, LAST_SYNC_DATE, LAST_SYNC_VERSION.
  • Helper.InvokeSetData(string connectionId, string targetObject, JObject jsonObject) : JObject
    Schreibt Daten via System/Konnektor (Schema = targetObject).
    Zusatzoptionen (z. B. DELETE) können im jsonObject["Params"] gesetzt werden.

Warteschlange (Aktionen)

  • Helper.InsertAction(int processId, DateTime executeDate, bool isAdhoc, List<SisParam> actionParams)
    Legt einen Warteschlangen-Eintrag für einen Sync an.

Konvertierungen

  • Helper.ToDouble(object value) : double
    Kulturunabhängige Zahlkonvertierung nach double.

Datenmodelle

SisParam

  • Name : string – Parametername
  • Value : object – Wert
  • ID : int – interne ID (wird beim Speichern vergeben)

Hilfsmethoden:

  • GetValue() : string – Wert als String
  • GetValue<T>(T defaultValue) – typisierter Wert oder Default
  • GetValueOrNull<T>() : T – typisierter Wert oder null
  • HasValue() : bool – Wert vorhanden?

SisDataMapping (Datensatz-Abbildung)

  • ID : int – interne DB-ID
  • ProcessId : int – zugehöriger Sync
  • Description : string – Beschreibung
  • SourceRecordId : string – Quell-ID
  • TargetRecordId : string – Ziel-ID
  • LastSyncDate : DateTime – letztes Sync-Datum
  • TargetIsDeleted : bool – Ziel wurde gelöscht
  • LastSyncInfo : List<SisParam> – Änderungs-/Zusatzinformationen

SisProcessInfo (Syncbeschreibung)

  • ID : int, Name : string, DisplayName : string
  • SourceObject : string, TargetObject : string
  • SourceConnectionId : int, TargetConnectionId : int
  • ClientNumber : int – Mandantennummer
  • IsScheduled : bool – Zeitsteuerung aktiv
  • SourceType : string, TargetType : string, ProcessType : string

SisLog (Protokoll)

  • CreatedDate : DateTime – Erstelldatum
  • Level : int0..5 (Message/Error/Warning/Info/Feedback/Debug)
  • ProcessId : int – zugehöriger Sync
  • ActionId : int – zugehöriger Queue-Eintrag
  • RecordType : string – Datensatztyp
  • RecordId : string – Datensatz-ID
  • LogMessage : string – Meldung

Best Practices

  • Deterministisch & kompakt: Skripte kurz halten, keine teuren I/O-Operationen; komplexe Flows mit Standard-Transformationen/Syncs lösen.
  • Logging sparsam & hilfreich: Klarer Kontext, keine sensitiven Daten protokollieren; Level sinnvoll wählen.
  • JSON robust handhaben: Null-Checks, Typprüfungen, ISO-Zeitformate (UTC) verwenden.
  • Paging nutzen: Helper.Page für große Datenmengen berücksichtigen (wenn der ausführende Schritt dies unterstützt).