Microsoft Dynamics CRM 2011 | XrmSvcToolkit & Ressourcengruppen

In meinem heutigen Beitrag möchte ich mal wieder auf die Möglichkeiten mit dem XrmSvcToolkit eingehen – ein Projekt, welches ich mittlerweile auch direkt unterstütze und zu deren weiterer Entwicklung ich beitragen möchte.

ResourcegroupDie heutige Aufgabenstellung lautet: Finde Ressourcen-gruppen zu einem bestimmten Kriterium und füge jenen Ressourcengruppen den aktuellen Benutzer als Ressource hinzu.

Die Aufgabe klingt eigentlich überschaubar, wirft man jedoch einen Blick auf die beteiligten Entitäten im CRM, bedarf es einigem Detailwissen, um diese Aufgabe erfolgreich lösen zu können.

Ressourcengruppen innerhalb von Microsoft Dynamics CRM sind meist unterschätzt. Einer Ressourcengruppe können mehrere Mitglieder angehören. Ressourcengruppen können wiederum Bestandteil einer Service-Regel sein. In vielen CRM-Systemen, die mit Services arbeiten, finden sich im Regelwerk einzelne Benutzer zugewiesen.

Dies mag bei kleineren Umgebungen mit wenigen CRM-Usern noch funktionieren. Doch hat man es mit größeren Umgebungen zu tun, dann löst eine Fragestellung immer wieder Kopfschmerzen aus: Wie pflege ich hunderte unterschiedlicher Services mit deren Service-Regeln und den zugehörigen Usern?

Service_with_ResourcegroupWer hier mit den Ressourcengruppen arbeitet, der spart bei der Pflege enorm viel Zeit. Denn anstelle der Pflege der einzelnen Service-Regeln (jeden neuen User einzeln den Services hinzufügen), braucht der User jetzt nur noch den entsprechenden Ressourcengruppen hinzugefügt werden. Mit wenigen Mausklicks sind mehrere User damit diversen Service-Regeln hinzugefügt und können verplant werden.

Was liegt also näher, als sich deshalb mit den Ressourcengruppen etwas näher zu beschäftigen.

Entity_Resourcegroup

Der Entität selbst können wir keine neuen Attribute hinzu-fügen.

Eigene Formulare lassen sich für diese Entität nicht erstellen und ein Blick auf die Attributsliste lässt eine offensichtliche Verbindung zu mehreren System-Usern nicht auf den ersten Blick erkennen. Und wer sich mit der Abfrage dieser Entität beschäftigt, der stößt auf einige Besonderheiten.

Werfen wir daher zunächst einen Blick auf die Abfrage der Entität mit Hilfe des XrmSvcToolkits.

XrmSvcToolkit.retrieveMultiple({
            entityName: „ConstraintBasedGroup“,
            odataQuery: „$select=Constraints,Name,ConstraintBasedGroupId&$filter=ConstraintBasedGroupId eq guid'“+ ResGroupId +“‚“,
            async: false,
            successCallback: function (result) {
            },
            errorCallback: function (error) {
                throw error;
            }
});

Im obigen Beispiel frage ich mit einem retrieveMultiple alle Ressourcengruppen ab, die einer bestimmten ID entsprechen.

Diese ID habe ich zuvor mit einer retrieveMultiple – Abfrage nach bestimmen Kriterien via Services ermittelt, die ich hier nicht näher dargestellt habe, da Sie für das weitere Beispiel keine Bedeutung hat.

Vielmehr möchte ich Euren Blick auf das Attribut Constraints richten. Dies ist ein Text-Feld und enthält einen Text aus vielen GUIDs und einigen Signalwörtern. Es handelt sich also nicht etwa um eine Komma-separierte Liste von GUIDs.

Hat man diesen Aufbau erst einmal verstanden, dann gilt es mit dem Text zu arbeiten.

Zunächst müssen wir ermitteln, ob unser aktueller User bereits als Ressource der Gruppe zugehörig ist:

var nodeValue = result[ix].Constraints;

var existCheck = nodeValue.search(Xrm.Page.data.entity.getId());

 

Hierzu übergeben wir den kompletten Text einer Variablen und können mit der JavaScript .search Funktion ermitteln, ob unsere aktuelle System-User-GUID Bestandteil des Textes ist.

existCheck bekommt bei einem nicht gefundenen Eintrag den Wert –1, mit dem wir im Folgenden arbeiten können und die weiteren Aktionen auslösen.

Widmen wir uns kurz noch dem Zerlegen des Constraints-Strings, damit wir unsere GUID hier als neue Ressource hinzufügen können.

nodeValueBegin = nodeValue.substring(0,nodeValue.lastIndexOf(„}“)+1);

nodeValueEnd = nodeValue.substring(nodeValue.lastIndexOf(„}“)+1, nodeValue.length);

 

Mit der 1. Zeile ermitteln wir uns den Anfang, mit der 2. Zeile das Ende unseres Constraints-Textes.

Jetzt braucht es eigentlich nur noch dem Neuaufbau des Strings und dem anschließenden Update des jeweiligen Datensatzes.

var constraintString = nodeValueBegin + “ || resource[\“Id\“] == “ + Xrm.Page.data.entity.getId() + nodeValueEnd;

Für den Aufbau des Strings wirft man idealerweise einen Blick in die Datenbank mit einer SQL Abfrage.

Man stellt fest, dass jeder System-User immer als Ressource mit resource[\“Id\“] == eingeleitet wird und mit || von weiteren Einträgen getrennt werden. Wichtig dabei ist, dass die GUIDs mit {}-Paaren angegeben werden.

Die Ressource ID ist dabei identisch mit der GUID des System-Users. Wird aus einem System-User also eine Ressource, erhält diese die gleiche GUID, wie auch der User-Datensatz und nicht etwa eine neue GUID.

Schauen wir uns nunmehr den Code der obigen successCallBack-Funktion komplett an:

for (var ix = 0; ix < result.length; ix++) {
                    var nodeValue = result[ix].Constraints;
                    var constraintbasedgroupid = result[ix].ConstraintBasedGroupId;
                    var nodeValueBegin;
                    var nodeValueEnd;
                    if (nodeValue == null) {
                        //Do nothing
                    }
                    else {
                    //code to be execute when field contains data
                    var existCheck = nodeValue.search(Xrm.Page.data.entity.getId());
                        if (existCheck == -1) {
                            nodeValueBegin = nodeValue.substring(0,nodeValue.lastIndexOf(„}“)+1);
                            nodeValueEnd = nodeValue.substring(nodeValue.lastIndexOf(„}“)+1, nodeValue.length);
                            //Create new Constraints String
                            var constraintString = nodeValueBegin + “ || resource[\“Id\“] == “ + Xrm.Page.data.entity.getId() + nodeValueEnd;
                            //constraintString = constraintString.replace(/</g, „&lt;“).replace(/>/g, „&gt;“);
                            var foo = {
                                Constraints: constraintString
                            };
                                // Update Resource Group
                                XrmSvcToolkit.updateRecord({
                                    entityName: „ConstraintBasedGroup“,
                                    id: constraintbasedgroupid,
                                    entity: foo,
                                    async: false,
                                    successCallback: function (result) {
                                        //alert(‚Update‘);
                                    },
                                    errorCallback: function (error) {
                                        throw error;
                                    }
                                });   
                        }
                        else {
                            //Do nothing cause user already in Resource Group
                        }
                   
                    }
                }
            },

In einer For-Schleife werden die zurückgelieferten Ergebnisse behandelt. Es wird ein Vergleich vorgenommen, um zu ermitteln, ob der User bereits als Ressource innerhalb der Ressourcengruppe existiert. Der Constraints-String wird zerlegt und die neue GUID als Ressource hinzugefügt.

Und schließlich wird mit der updateRecord-Methode des XrmSvcToolkit ein Update der jeweiligen Ressourcengruppe vorgenommen.

———

Mit wenigen Zeilen Code kann man also x-beliebige System-User diversen Ressourcengruppen hinzufügen. Nutzt man beispielsweise einen Button hierfür, kann man mit sehr wenigen Zeilen Code einen großen Effekt erzielen.

Ich hoffe, Euch mit diesem Beispiel einmal mehr inspiriert zu haben, Euch mit dem Toolkit zu beschäftigen und Eure Business-Logiken mit dessen Hilfe umzusetzen.

Gern stehe ich Euch für Eure Fragestellungen oder Kommentare zur Verfügung.

Bis zum nächsten Mal.

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s