Microsoft Dynamics CRM–Webservices Datenübernahme

28 07 2010

microsoft_dynamics

Ich habe mich in den letzten Tagen mit dem Thema Microsoft Dynamics CRM befassen dürfen. Wer nicht weiß was das ist, es handelt sich hierbei um ein System von Microsoft, mit welchen man Kundenbeziehungen, Verkaufschancen, etc. abbilden kann.

Meine Aufgabe war es, Daten aus einem System in ein neues zu übernehmen, allerdings mit der kleinen Einschränkung, dass ich keinen Zugriff auf die Datenbank oder das Dateisystem hatte. Auch das ILS war auf dem Webserver ausgeschaltet, weshalb die normalen Tools auch nicht greifen konnten. Ich hatte nur Zugriff auf die Webservices und das ist nicht grade viel wenn es um eine Datenübernahme geht.

Das Szenario in einem kurzen Überblick

Die Quellinstallation steht nur über die Weboberfläche zur Verfügung und bietet als Zugriffsmöglichkeit nur die Webservices. Da in dem Quellsystem zum Glück nur wenig gearbeitet worden ist, da die Nutzung erst in Zukunft ausgebaut werden soll, mussten nur die Daten aus den Leads, Kontakten und Firmen mit allen dazugehörigen Daten übernommen werden. Die dazugehörigen Daten waren in diesem Fall: Aufgaben, Emails, Notizen

Vorgehensweise – Überlegung

Da die Daten alle miteinander in Verbindung stehen, eine Firma hat Kontakte, ein Kontakt hat Aktivitäten (Emails, Aufgaben, etc.) welche aber auch bei Leads oder Firmen hinterlegt sein können, musste ich mir erst eine Reihenfolge überlegen.

Im ersten Schritt habe ich mir die einzelnen Bereiche aus der Quellinstallation eingelesen und diese dann wieder auf das Zielsystem eingespielt. Das geht eigentlich relativ einfach, da zu diesem Zeitpunkt noch keine Verknüpfungen bestehen müssen, diese sind erst beim produktiven Einsatz wichtig. Im Detail bedeutet dieses, dass ich zum Beispiel die Firmen, Kontakte, Leads, Aufgaben, Emails, Telefonanrufe, Faxe, etc. mit den selben ID`s übernommen habe.

Wenn man diese Daten alle besitzt, werden sie mit einem wichtigen Merkmalen im Zielsystem angelegt. Ich bin der Besitzer dieses Elements, wenn ich also die Elemente für einen Kollegen importiere und dieser sie unter seiner Anmeldung sehen soll, muss ich daran denken, es dem entsprechenden Benutzer zuzuordnen. Da die Benutzer natürlich im System angelegt worden sind, haben sie andere ID Nummern als im Quellsystem, daher habe ich mir eine Umsetzungsfunktion geschrieben, welche die entsprechenden Zuordnungen im Zielsystem vornimmt.

Wenn ich also alle Daten übernommen habe, muss ich eine Zuordnung zu den Eltern-Elementen herstellen. Hier ist es natürlich von Vorteil, dass ich die eindeutigen ID`s aus dem Quellsystem genutzt habe und diese auf das Zielsystem übertragen habe. So kann ich die Beziehungen einfach im Quellsystem nachsehen und auch diese einfach wieder auf dem Zielsystem herstellen.

Einzig die Dateianhänge, welche im Bereich Notizen hinzugefügt werden, sind etwas problematisch sein, da sie zuerst von dem Quellsystem herunter geladen werden müssen und anschließend in das Zielsystem eingefügt werden müssen. Hinzu kommt, dass dann auch die Beziehung wiederhergestellt werden muss. Dieser Punkt ist bei mir bisher auch noch nicht behandelt, da ich diese Daten nicht übernehmen musste.

Fazit

Es ist in jedem Fall möglich die Daten zu übernehmen, auch ohne dass man die üblichen Tools nutzt, alleine mittels Webservices. Es ist zwar nicht so komfortabel wie mit den Tools aber man lernt eine Menge über die Struktur und die Verknüpfungen der Daten untereinander.

Programmierung

Hier möchte ich etwas auf die eigentliche Entwicklung des “Übernahmeprogrammes” eingehen. Mir ist durchaus bewusst, dass es vermutlich sehr viel eleganter geht, aber ich möchte noch einmal betonen, dass es mein Erstkontakt mit dem CRM und dessen Webservices war.

Für die Entwicklung habe ich Visual Basic 2008 eingesetzt, als Projekt habe ich eine einfache Konsolenanwendung genutzt, da ich nur kurze Statusmeldungen ausgeben wollte.

Die Anmeldung an dem Microsoft Dynamics CRM Webservices

Link_zu_dem_CRMServiceAls erstes ist es wichtig, das man sich die Webservices in Visual Studio als Webverweise einrichtet. Hier gibt es zwei Stück, einmal CRM und CRM Service, die CRM Service ist im meinen Fall http://SEVER:PORT/MSCrmServices/2007/CrmService.asmx?WSDL, diesen Link bekommt man über die Weboberfläche heraus. Beim eigentlichen CRM Webservice sieht das etwas anders aus, der Link ist aber wie folgt aufgebaut: http://SEVER:PORT/MSCrmServices/2007/CrmServiceWsdl.aspx also einfach ohne das ?WSDL.

Für die Authentifizierung kann man drei Möglichkeiten nutzen, die Anmelund über Benutzername und Kennwort, Passport von Microsoft oder mit der Domänen-Anmeldung, welche ich genutzt habe.

Beispiel:

User: CRMUSERADMIN
Passwort: CRMPASSWORT
Domäne: MSCRM
Organisation: CRMORGA

Visual Basic Quelltext:

Public Class XXX

Dim WithEvents mycrm As CrmSdk.CrmService ‘CRM SDK ist mein Webservice
Dim mytoken As CrmSdk.CrmAuthenticationToken

Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

mycrm = New CrmSdk.CrmService With {.Url = GetCrmServiceForOrganization(txtDeOrganisation.Text.Trim, New Net.NetworkCredential(“CRMUSERADMIN”, “CRMPASSWORT”, ”MSCRM”))}
mytoken = New CrmSdk.CrmAuthenticationToken With {.AuthenticationType = 0, .OrganizationName = “CRMORGA”}
mycrm.CrmAuthenticationTokenValue = mytoken
mycrm.Credentials = New Net.(“CRMUSERADMIN”, “CRMPASSWORT”, ”MSCRM”)

End Sub

Shared Function GetCrmServiceForOrganization(ByVal organizationName As String, ByVal credit As Net.NetworkCredential) As String
Dim urlResult As String = String.Empty

Using myCrm As New CrmSdk.Discovery.CrmDiscoveryService() With {.Credentials = credit} ‘CRM Discovery Service mein zweiter Webservice
Dim myRequest As New CrmSdk.Discovery.RetrieveOrganizationsRequest()
Dim myresponse As CrmSdk.Discovery.RetrieveOrganizationsResponse = myCrm.Execute(myRequest)
For Each tDeatil As CrmSdk.Discovery.OrganizationDetail In myresponse.OrganizationDetails
If String.Compare(tDeatil.OrganizationName, organizationName, True) = 0 Then
Return tDeatil.CrmServiceUrl
End If
Next
End Using
Return urlResult
End Function

Daten von dem Quellsystem empfangen / abfragen

Das abfragen der Daten ist keine schwere Sache, man hat die Möglichkeit Daten gefiltert abzufragen oder sich einfach alles zusenden zu lassen. In dem folgenden Quelltext, frage ich alle Kontakte ab, in dem zweiten nur die mit dem Attribut name und dem Wert MEIER, im Dritten Quelltext die Abfrage der Daten.

Visual Basic Quelltext alle Daten:

‚Abfrage aller Accountdaten
Dim myquery = New CrmSdk.QueryExpression With {.ColumnSet = New CrmSdk.AllColumns, .EntityName = CrmSdk.EntityName.contact.ToString}

Dim myAccs As CrmSdk.BusinessEntityCollection = mycrm.RetrieveMultiple(myquery)

Visual Basic Quelltext nur MEIER:

‚Abfrage aller Accountdaten
Dim myquery = New CrmSdk.QueryExpression With {.ColumnSet = New CrmSdk.AllColumns, .EntityName = CrmSdk.EntityName.contact.ToString}

Dim contition As New CrmSdk.ConditionExpression With {.AttributeName = „name“, .Operator = CrmSdk.ConditionOperator.Equal, .Values = New String() {„MEIER“}}
Dim filter As New CrmSdk.FilterExpression
filter.Conditions = New CrmSdk.ConditionExpression() {contition}

myquery.Criteria = filter

Dim myAccs As CrmSdk.BusinessEntityCollection = mycrm.RetrieveMultiple(myquery)

Visual Basic Quelltext Abfrage der einzelnen Datensätze:

For Each be As CrmSdk.BusinessEntity In myAccs.BusinessEntities
Dim acc As CrmSdk.contact= be
console.writeline(acc.name)
……
Next

Anlegen eines Datensatzes

Die Anlage eines Datensatzes geht ohne große Probleme, auch wenn man Daten von einer Quelle übernehmen will. Einzig die CRM eigenen Datentypen sollte immer beachtet werden. Der Aufbau bei einer Übernahme beinhaltet oft die GUID. Wenn man keine Quelldaten hat und einfach einen Kontakt anlegen möchte, sieht es wie folgt aus:

Dim newContact as crmsdk.contact
newContact.firstname = “Hans”
newContact.lastname = “Meiser”
mycrm.create(newContact)

Möchte ich einen Kontakt von einem anderen System übernehmen und die ID diese Kontaktes ebenfalls, so muss ich mit dem CRM Datentyp Key arbeiten, der eine GUID beinhaltet.

Dim newContact as crmsdk.contact
newContact.firstname = “Hans”
newContact.lastname = “Meiser”
Dim myKey as new crmsdk.key
myKey.Value = new GUID(“789789-123123-f-dsf-s3”)
newContact.contactid = myKey
mycrm.create(newContact)

Bei Lookups kann man auf die selbe Methode zurückgreifen, immer erst eine neue Variable erstellen, befüllen und diese dann der eigentlichen Variable übergeben. Man könnte nun sagen, warum nicht
myContact.contactid = new crmsdk.key with {new GUID(“789789-123123-f-dsf-s3”)}
nehmen. Ja, bei Key geht es und bei Lookup nicht, daher empfehle ich es immer auf die oben beschriebene Art und Weise zu machen.

Das Update von Datensätzen ist analog zu der Anlage, nur das nicht der create sonder der update Befehl genutzt wird.

Den Besitzer eines Elementes wechseln

Wenn wir einmal zwei Systemuser nehmen, mit ihren ID`s und sagen, wir möchten einen Kontakt von dem ersten Sytstemuser auf den zweiten übertragen, kann man das wie folgt machen.

‘Beispieldaten:

‘Contactid: {222222-123123-f-dsf-s3}
’BenutzerAID: {111111-123123-f-dsf-s3} ‘Nur der Vollständigkeit halber
’BenutzerBID: {333333-123123-f-dsf-s3}

Dim Eintrag As CrmSdk.contact = mycrm.Retrieve(CrmSdk.EntityName.contact.ToString, New Guid(„222222-123123-f-dsf-s3“), New CrmSdk.AllColumns)

Dim assignee As New CrmSdk.SecurityPrincipal With {.PrincipalId = „333333-123123-f-dsf-s3“}
Dim target As New CrmSdk.TargetOwnedContact With {.EntityId = New Guid(Eintrag.contactid.Value.ToString)}

Dim assign As New CrmSdk.AssignRequest With {.Assignee = assignee, .Target = target}
mycrm.Execute(assign)

Schlusswort

Wie oben erwähnt, es ist vermutlich nicht die beste Art mit den Webservices umzugehen, jedoch für einen erstes arbeiten mit den Microsoft Dynamics CRM Webservices ein einfaches und ich glaube gut nachzuvollziehendes.

Mit den hier gezeigten Daten sollten die wichtigsten Funktionen ohne Probleme möglich sein (Daten aus einem CRM lesen und in ein CRM schreiben / aktualisieren).


Aktionen

Information

Hinterlasse einen Kommentar