D365CE — Dataverse / Customer Engagement

Konnektor für Microsoft Dataverse und Dynamics 365 Customer Engagement. Unterstützt Lesen und Schreiben.

Der D365CE-Konnektor verbindet die DataBridge mit Microsoft Dataverse und Dynamics 365 Customer Engagement über das offizielle Dataverse SDK. Er nutzt die Change Tracking API für eine lückenlose Erkennung aller Änderungen.

EigenschaftWert
Lesen✅ unterstützt
Schreiben✅ unterstützt
Job-Filter✅ clientseitig nach dem Abruf
StatusFreigegeben
Getestete MindestversionDataverse / D365CE v9.1

Die Mindestversion beschreibt den getesteten Stand; eine Versionsprüfung findet im Code nicht statt.


Voraussetzung: Change Tracking aktivieren

Für alle Dataverse-Tabellen, die als Quelle genutzt werden, muss Change Tracking aktiviert sein. Ohne Change Tracking kann der Konnektor keine Differenzabfragen durchführen.

Aktivierung: Power Platform Admin Center → Umgebung → Tabellen → Tabelle auswählen → Eigenschaften → Änderungsnachverfolgung aktivieren ✅


Verbindungsparameter

{
  "connectionstring": "<XRM-Connection-String>"
}

Beispiel (Client Secret Authentication):

AuthType=ClientSecret;Url=https://<org>.crm4.dynamics.com;ClientId=<id>;ClientSecret=<secret>

Die vollständige XRM-Connection-String-Referenz findet sich in der Microsoft-Dokumentation.

Zusätzlich stehen die universellen Parameter keyVaultUrl, maxPageSize, language und httpClientTimeoutSeconds zur Verfügung — siehe Verbindungen.


Tabellen- und Feldnamen

SourceTable / TargetTable

Logischer Entitätsname in Kleinbuchstaben — so wie er in den Dataverse-Metadaten steht.

EntitätSourceTable
Accountaccount
Contactcontact
Custom Entitywysa_bcsegment

SourceField / TargetField

Logischer Attributname in Kleinbuchstaben.

AttributSourceField
Account Namename
Custom Fieldwysa_bcsystemid

Unterstützte TargetKey-Typen

TypBeschreibung
PrimaryKeyDataverse GUID (Primärschlüssel der Entität)
CustomKeyBenutzerdefinierter Schlüssel über ein oder mehrere Felder (Alternate Key)
FilterSuche über Feldwert-Kombination ohne expliziten Schlüssel

Bei CustomKey werden Schlüsselteile vom Typ int32, guid und string unterstützt; jeder andere Typ führt zum Abbruch (keytype … not yet supported for key …). Leere Schlüsselteile werden übersprungen — bleibt danach kein Teil übrig, gilt der Schlüssel als nicht auflösbar.

Ein KeyValue kann statt attributeName ein StaticValue enthalten; der Schlüsselteil wird dann fest gesetzt und als Typ string behandelt.

Mehrere Ziel-Schlüssel mit Rangfolge (ab v2.1)

Statt eines einzelnen TargetKey lässt sich eine Liste TargetKeys angeben. Die Schlüssel werden nach KeyRank aufsteigend geprüft; der erste Schlüssel, der im Zielsystem einen Datensatz findet, gewinnt — alle weiteren werden übersprungen.

{
  "Operations": [
    {
      "Name": "Lookup",
      "Parameters": {
        "TargetTable": "wysa_countryregion",
        "TargetKeys": [
          {
            "KeyType": "CustomKey",
            "KeyRank": 1,
            "KeyName": "wysa_externalid",
            "KeyValues": [
              { "keyName": "wysa_externalid", "attributeName": "externalId", "rank": 1 }
            ]
          },
          {
            "KeyType": "CustomKey",
            "KeyRank": 2,
            "KeyName": "wysa_code",
            "KeyValues": [
              { "keyName": "wysa_code", "attributeName": "countryRegionCode", "rank": 1 }
            ]
          }
        ]
      }
    }
  ]
}

Bestehende Mappings mit einem einzelnen TargetKey funktionieren unverändert weiter.


SourceOperations

LookupValue

Liest einen Wert aus einem verknüpften Dataverse-Datensatz nach.

{
  "Operations": [
    {
      "Name": "LookupValue",
      "Parameters": {
        "LookupType": "Attribute",
        "SourceField": "wysa_countrycode",
        "LookupTable": "wysa_country",
        "LookupField": "wysa_name",
        "UseCache": true
      }
    }
  ]
}

LookupType kennt zwei Werte. Nur der CE-Konnektor unterstützt beide:

WertWirkung
AttributeDer genannte LookupField-Wert wird aus dem verknüpften Datensatz gelesen
NameDer Anzeigename der Referenz wird direkt aus dem Quelldatensatz übernommen — ohne zusätzliche Abfrage

ReadFromMessage

Liest Werte aus einer vorherigen Quellanfrage — nur in ResponseJobs. Verhalten wie beim D365BC-Konnektor.

ActivityParty

Liest ein Feld über eine ActivityParty-Beziehung. Wird für CE-Aktivitäten (E-Mails, Aufgaben, Anrufe) verwendet, bei denen Teilnehmer über den activityparty-Datensatz verknüpft sind.

{
  "Operations": [
    {
      "Name": "ActivityParty",
      "Parameters": {
        "PartyParams": {
          "TypeMask": 2,
          "SourceField": "activityid",
          "TargetField": "wysa_number",
          "TargetTable": "contact"
        }
      }
    }
  ]
}

TypeMask entspricht dem Dataverse-Feld participationtypemask und wird von der DataBridge unverändert an die Abfrage durchgereicht. Die gültigen Werte gibt die Dataverse-Plattform vor; die gebräuchlichsten sind:

TypeMaskTeilnehmerrolle
1From (Absender)
2To (Empfänger)
3CC
4BCC

Diese Tabelle ist eine Plattform-Referenz, keine Festlegung der DataBridge. Die verbindliche und vollständige Liste steht in der Microsoft-Dokumentation zur Entität activityparty.

LinkToRecord

Erzeugt eine anklickbare URL zu einem Datensatz in Dataverse.

{
  "Operations": [
    {
      "Name": "LinkToRecord",
      "Parameters": {
        "BaseUrl": "https://<org>.crm4.dynamics.com/main.aspx?appid=<AppId>&pagetype=entityrecord"
      }
    }
  ]
}

TargetOperations

Lookup

Befüllt ein Lookup-Feld in Dataverse, indem der verknüpfte Datensatz über eine Feldwert-Kombination gesucht wird. Die Operation gehört in die Spalte TargetOperation des Mappings und benötigt zwingend den Operations-Rahmen, den Namen Lookup sowie TargetTable.

{
  "Operations": [
    {
      "Name": "Lookup",
      "Parameters": {
        "TargetTable": "wysa_countryregion",
        "TargetKey": {
          "KeyType": "CustomKey",
          "KeyName": "wysa_code",
          "KeyValues": [
            { "keyName": "wysa_code", "attributeName": "countryRegionCode", "rank": 1 }
          ]
        }
      }
    }
  ]
}

Wird kein passender Datensatz gefunden, legt die DataBridge standardmäßig einen neuen an.

Weitere Parameter der TargetOperation

ParameterWirkung
TargetTableEntität, in der gesucht wird. Bei Lookup Pflicht.
TargetKey / TargetKeysSchlüssel bzw. Schlüsselliste zur Suche (siehe oben)
DefaultValueFester Wert, der ohne Suche gesetzt wird. Bei Lookup-Feldern eine GUID; bei Options-Feldern der numerische Optionswert.
SetNullIfEqualsValueOfFieldName des Primärschlüsselfeldes. Stimmt der aufzulösende Wert mit dem Schlüssel des Quelldatensatzes überein, wird null gesetzt statt eine Selbstreferenz zu erzeugen.
OptionDelimiterTrennzeichen, mit dem ein Quellwert für ein MultiSelect-Feld in Einzelwerte zerlegt wird
DoNotCreatetrue verhindert die automatische Neuanlage (siehe unten)

DoNotCreate (ab v2.1)

Ist DoNotCreate auf true gesetzt, wird der Zieldatensatz eines Lookups nur dann verknüpft, wenn er bereits existiert. Wird er nicht gefunden, bleibt das Feld leer — es entsteht kein neuer Datensatz.

{
  "Operations": [
    {
      "Name": "Lookup",
      "Parameters": {
        "TargetTable": "wysa_countryregion",
        "DoNotCreate": true,
        "TargetKey": {
          "KeyType": "CustomKey",
          "KeyName": "wysa_code",
          "KeyValues": [
            { "keyName": "wysa_code", "attributeName": "countryRegionCode", "rank": 1 }
          ]
        }
      }
    }
  ]
}

OptionMapping

Übersetzt Quellwerte in numerische Dataverse-Optionset-Werte.

{
  "Operations": [
    {
      "Name": "OptionMapping",
      "Parameters": {
        "Mapping": [
          { "Key": "Blank",                        "Value": "" },
          { "Key": "Prospect",                     "Value": "383380000" },
          { "Key": "First_x002D_time_x0020_Donor", "Value": "383380001" },
          { "Key": "Recurring_x0020_Donor",        "Value": "383380002" }
        ]
      }
    }
  ]
}

Ein leerer Value setzt das Zielfeld auf null. Ein Quellwert, der in der Liste nicht vorkommt, führt zum Abbruch (Could not find TableMapping for …).


Datentypen — Zieltyp und akzeptierte Quelltypen

Beim Schreiben bestimmt der Attributtyp des Zielfeldes aus den Dataverse-Metadaten, welche Umwandlung angewendet wird.

Zielattribut (Dataverse)Akzeptierte QuelltypenVerhalten und Sonderfälle
BigIntAttributeMetadataint64, int32Leerwert → null
BooleanAttributeMetadataboolean, stringLeerwert → null
DateTimeAttributeMetadatadate, datetime, stringLeerwert → null; auch 0001-01-01 wird zu null
DecimalAttributeMetadatadecimal, moneyInterpretation mit der Kultur aus language
DecimalAttributeMetadatastring (ab v2.1)Interpretation immer als en-US, unabhängig von language
DoubleAttributeMetadatadouble, decimalInterpretation mit der Kultur aus language. string wird nicht akzeptiert.
EntityNameAttributeMetadataalle QuelltypenWird als Text behandelt; Leerwert → null
IntegerAttributeMetadataint32, optionsetvalue, stringLeerwert → null
LookupAttributeMetadatatypunabhängigErfordert eine Lookup- oder DefaultValue-TargetOperation, sonst Lookup Operation missing
MemoAttributeMetadataalle QuelltypenWird als Text behandelt; Leerwert → null
MoneyAttributeMetadatanur decimalmoney, double und string führen zum Abbruch
MultiSelectPicklistAttributeMetadatanur stringErfordert OptionMapping; Zerlegung über OptionDelimiter. Leerwert → null
PicklistAttributeMetadatastring, int32Erfordert OptionMapping oder DefaultValue
StateAttributeMetadataboolean, string, int32Erfordert OptionMapping oder DefaultValue
StatusAttributeMetadatastring, int32Erfordert OptionMapping oder DefaultValue
StringAttributeMetadataalle QuelltypenWert wird getrimmt; Leerwert → null

Sonderfälle jenseits der Tabelle:

  • UniqueIdentifierAttributeMetadata sowie Primärschlüssel- und logische Attribute (z. B. statuscodename) werden beim Schreiben stillschweigend übersprungen
  • FileAttributeMetadata und ImageAttributeMetadata werden nicht unterstützt (type not supported)
  • Jeder sonstige, nicht aufgeführte Attributtyp führt zum Abbruch (Type … not yet implemented)

Sonderentitäten

Einige Dataverse-Entitäten werden nicht über den generischen Weg verarbeitet.

listmember — Marketinglisten

Datensätze der Entität listmember werden nicht über den generischen Schreibpfad angelegt oder gelöscht, sondern über die Dataverse-Nachrichten AddMemberList bzw. RemoveMemberList. Das Mapping muss daher die Felder listid und entityid befüllen — sie liefern die Kennungen für die beiden Nachrichten.

Entitäten ohne statuscode

Für die folgenden Entitäten wird das Attribut statuscode beim Lesen automatisch aus der Spaltenliste entfernt, weil sie es nicht besitzen:

Entität
listmember
quotedetail
opportunityproduct
salesorderdetail

Ein Job-Filter mit der Operation StatusCode ist für diese Entitäten folglich nicht verwendbar.


Job-Filter

Der CE-Konnektor wertet das Feld Filter des Jobs clientseitig aus: Die Datensätze werden über die Change Tracking API abgerufen und anschließend geprüft; nicht passende Datensätze werden verworfen.

Unterstützt werden die Operationen Equals, Boolean, OptionSetValue, NotNull, IsNull und StatusCode. Ein anderer Operationsname führt zum Abbruch (Undefined FilterOperation).

Syntax, Parameter und Beispiele sind unter Jobs → Filter-Syntax beschrieben.


Änderungserkennung (Watermark)

EigenschaftWert
Empfohlener WatermarkTypestring
WatermarkFieldbeliebig (wird von der Change Tracking API intern verwaltet)

Der CE-Konnektor nutzt die Dataverse Change Tracking API. Diese liefert bei jedem Abruf einen opaken Token, der beim nächsten Aufruf übergeben wird. So werden alle Änderungen erfasst — auch wenn der Timer genau während einer Änderung ausgeführt wird.