Microsoft Dynamics CRM 2013 | Time Off via SDK Nach Spring Wave’14

Einige von euch erinnern sich vielleicht noch an meine Artikel Serie zu der programmatischen Anlage von Kalendern und Arbeitsfreien Zeiten für CRM 2011. Viele haben diese Plug-In Techniken mit in Ihr CRM 2013 Release übernommen und so wurde ich zuletzt um Unterstützung gebeten, da nach Update von CRM 2013 mit Service Pack 1 (On-Prem) bzw. Spring-Wave ‘14 Fehler in den Plug-Ins auftraten.

Dazu sei allen Neu-Interessierten noch mal im Schnelldurchgang beschrieben, was eigentlich bei der programmatischen Anlage einer Arbeitsfreien Zeit per SDK passiert.

  1. Es wird der aktuelle Kalender des Users abgefragt
  2. Ein neuer innerer Kalender wird für die Aufnahme der neuen Informationen erzeugt und dem aktuellen (primären) User zugewiesen
  3. Anschließend wird eine neue Kalender-Regel mit einem Pattern erzeugt. Dieser bestimmt die Häufigkeit der Anwendung
  4. Eine weitere Kalender-Regel wird erstellt und nimmt z.B. den Subcode, sowie den Offset auf.
  5. Die Kalender-Regeln werden dem User-Kalender hinzugefügt und dieser abschließend aktualisiert.

Nachdem nunmehr für CRM 2013 Online Kunden die Spring Wave ‘14 Features mit einem Datenbank-Update einher gingen und On-Prem-Kunden das Service Pack 1 installiert haben, meldeten mir verschiedene Blog-Leser eine “Inner-Fault-Exception” bei der Ausführung des Plug-In-Codes.

Was war geschehen? Normalerweise sollen die neuen Updates vorhandenen Code komplett unterstützen und damit keinen Eingriff erforderlich machen.

In diesem besonderen Fall jedoch, ist eine entscheidende Änderung in den Kalender eingebracht worden. Im Speziellen sind dies die neuen Kalender-Typen:

Value Label Description
0 Default Business closure calendars for service scheduling.
1 Customer Service Service calendars for customer service.
2

Holiday Schedule

Holiday schedule calendars for customer service.
-1 Inner Calendar type Inner Calendars are used by other calendars to build a graph of time slots available for customer service or service scheduling to be performed.

Das liest sich zunächst relativ unspektakulär. Mit Hilfe des SOAPLoggers (einem bereits von mir vorgestelltem Tools innerhalb des SDK) lässt sich schnell feststellen, dass bei der Anlage eines neuen Kalenders der Typ immer auf den Default Wert (0) festgesetzt wird. Während dies bei der programmatischen Anlage von z.B. täglichen Kalendern durchaus hilfreich ist, führt dies bei der Anlage von Arbeitsfreien Zeiten zu besagter Verletzung und Ausnahme.

Konkret liegt dieses Problem in den Zeilen

// Create a new inner calendar
      Entity newInnerCalendar = new Entity("calendar");
      newInnerCalendar.Attributes["businessunitid"] = new EntityReference("businessunit", ((Microsoft.Xrm.Sdk.EntityReference)(userCalendarEntity["businessunitid"])).Id);
      newInnerCalendar.Attributes["name"] = "CUSTOM Time Off";
      newInnerCalendar.Attributes["primaryuserid"] = _currentUserId;
      Guid innerCalendarId = service.Create(newInnerCalendar);

Bislang reichten diese Zeilen für die Erstellung des neuen Kalenders aus. Nach Einführung von Spring Wave’14 bzw. Service Pack 1 bedarf es jedoch vor der letzten Zeile einer zusätzlichen:

newInnerCalendar.Attributes["type"] = new OptionSetValue(-1);

Mit dieser zusätzlichen Zeile verhindert Ihr den Inneren Fehler, der bei der Ausführung des Plug-In-Codes eine Ausnahme wirft. Der Wert (-1) gilt hier natürlich nur dann, wenn Ihr eine Arbeitsfreie Zeit anlegen wollt.

Allen Programmierern für CRM 2013 stellt sich damit eine neue Herausforderung. Wie kann man seinen Quellcode für beide Varianten (Service-Pack 1/Spring Wave’14 installiert bzw. (noch) nicht installiert) stabil halten?

HIer bietet sich die Option, die o.g. Zeile nur dann anzuwenden, wenn identifiziert wurde, ob die neuen Features installiert sind oder nicht. Zu diesem Thema bietet das SDK ebenfalls eine Antwort.

Euch damit auch weiterhin viel Spaß bei der Programmierung. Auch, wenn hier vorhandener Quellcode in der Ausführung behindert wird.

Die Designer mussten eine Entscheidung treffen, wie der “Impact” gering gehalten werden kann und haben sich für die Vorgabe des Typs 0 entschieden, um möglichst viel vorhandenen Quellcode zu unterstützen.

Ich hoffe jedenfalls, euch damit etwas Zeit gespart zu haben.

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