Microsoft Dynamics CRM 2011 | Workflow Activity – Handling Lookups

Seitdem Microsoft Dynamics CRM Onilne ebenfalls die Custom Workflow Activities unterstützt, können zahlreiche Erweiterungen zum Einsatz gebracht werden, mit denen die Prozesse noch besser auf die Business-Logiken hin angepasst werden können.

So finden sich auf Codeplex z.B. die Custom Workflow Utilities, die Distribute Workflow Activity oder auch die Manipulation Library.

Anlässlich einer jüngsten Anforderung, habe auch ich mich mit einer Anpassung befasst und mich dadurch intensiver mit den Beschreibungen und Beispielen im SDK auseinandergesetzt.

Die Aufgabenstellung: Finde heraus, ob ein bestimmter Nutzer in einem bestimmten Team Mitglied ist. Wenn ja, liefere ein “true” zurück, wenn nein ein “false”.

Zunächst startet sich ein solches Projekt sehr einfach mit den hier beschriebenen Schritten. Und schnell sind die 1. Codezeilen geschrieben.

Im nächsten Schritt setzt man sich mit den Input- und Output-Parametern auseinander.

In meinem Fall sind dies als Input-Paramter “Team” und “User” und als Output-Parameter “IsMember Of”.

[Input(„Team“)]
[ReferenceTarget(„team“)]
public InArgument<EntityReference> Team { get; set; }

[Input(„User“)]
[ReferenceTarget(„systemuser“)]
public InArgument<EntityReference> User { get; set; }

[Output(„IsMember Of“)]
public OutArgument<Boolean> IsMemberOf { get; set; }

 

Danach setzen wir uns mit der Auswertungsroutine auseinander. In diesem Fall eine Query, die uns bei der Lösung der Aufgabe hilft:

QueryExpression query = new QueryExpression(„team“);
                query.ColumnSet = new ColumnSet(true);
                query.Criteria.AddCondition(new ConditionExpression(„teamid“, ConditionOperator.Equal, TeamGuid));
                LinkEntity link = query.AddLink(„teammembership“, „teamid“, „teamid“);
                link.LinkCriteria.AddCondition(new ConditionExpression(„systemuserid“, ConditionOperator.Equal, UserGuid));

                try
                {
                var results = service.RetrieveMultiple(query);
                if (results.Entities.Count > 0) {
                    IsMemberOf.Set(executionContext, true);
                }
                else {
                    IsMemberOf.Set(executionContext, false);
                }
                }

                catch (Exception ex)
                {
               // Do your Error Handling here
                throw ex;
                }

 

Soweit, so gut. Doch hier enden die guten Beispiele, die sich im SDK finden lassen und es stellt sich die Frage, wie können wir die Id unserer Input-Parameter des Typs Lookup ermitteln und in unsere Programmlogik integrieren? (Im obigen Beispiel sind die Variablen blau markiert)

var TeamGuid = Team.Get<EntityReference>(executionContext).Id;
var UserGuid = User.Get<EntityReference>(executionContext).Id;

 

Wie Ihr sehen könnt, ist es jedoch eigentlich recht einfach.

Mit .Get<Datentyp>(executionContect) holt Ihr Euch den jeweiligen Wert. Bei einem Lookup-Feld fügt Ihr noch ein .Id an, wenn Ihr die GUID haben wollt oder ein .Name, wenn Ihr den Namen des Lookup-Wertes auswerten wollt.

Im abschließenden Schritt signiert Ihr noch das Projekt, kompiliert es und registriert dieses Plug-In. Nunmehr könnt Ihr diesen Benutzerdefinierten Workflow-Schritt für Eure Prozesslogiken verwenden und könnt dabei sowohl statische, als auch dynamische Werte als Input-Parameter heranziehen.

Ihr bekommt ein “true” oder “false” zurückgeliefert, welches Ihr in einer Wenn, dann-Abfrage verwenden könnt und in Abhängigkeit weitere Schritte ausführen.

Viel Spaß bei der Umsetzung…

 

Technorati Tags:

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