Microsoft Dynamics CRM 2013 | DataTables

Vor zwei Jahren habe ich das letzte Mal über die Integration des jQuery Plug-Ins DataTables in Microsoft Dynamics CRM 2011 berichtet und es ist Zeit für ein Update. Denn auch in CRM 2013 kann man mit diesem Plug-In hervorragende und z.T. verblüffende Effekte erzielen.

2nd_dataTable_in_CRM2013_style

In den zwei Jahren hat sich selbst-verständlich einiges getan. So haben sich beispielsweise die API und die Features der DataTables stark verändert. Das schöne jedoch an diesem jQuery Plug-In, ist nach wie vor die einfache Initialisierung mit wenigen Programmzeilen:

$(document).ready(function(){
$('#myTable').dataTable();
});

Doch auch in Microsoft Dynamics CRM 2013 gilt es, einige Punkte für die Verwendung zu beachten. So hat sich natürlich das CSS-Design im CRM 2013 geändert und damit eure Datentabellen in passendem Design daherkommen, solltet ihr das erforderliche CSS anpassen.

Im Gegensatz zu damals, ist das mit dem Theme-Creator Werkzeug jedoch erheblich einfacher geworden. Und ein paar Mausklicks und CSS-Abgriffen des CRM 2013 später schon erledigt. Gab es für CRM 2011 noch einen Style Guide, so heißt es heute, mit den Entwicklerwerkzeugen die Informationen aus den verwendeten CSS-Vorlagen selbst herauszusuchen. Doch mit dem o.g. Link habt ihr dafür die erforderlichen Schritte ausführlich beschrieben.

Für die eigentliche Integration der DataTables empfehle ich die Verwendung der neuesten jQuery Version. Und wie es sich gehört, solltet ihr eure Version von der bereits integrierten Version kapseln. Hierzu findet ihr einen Hinweis auch im aktuellen SDK.

Habt ihr die beiden erforderlichen Dateien (../css/jquery.dataTables.css | ../js/jquery.dataTables.js)
für DataTables als Web-Ressourcen zur Verfügung gestellt, so empfehle ich auch für CRM 2013 die Erweiterungen TableTools und ZeroClipboard. Falls ihr euch jetzt fragt, warum ich keinen Link zur zweiten Erweiterung anbiete, so liegt der Grund hierfür in einem weiteren Unterschied zu damals. Denn in den TableTools ist die Clipboard-Erweiterung nunmehr bereits integriert und ihr benötigt nur noch diese eine Erweiterung.

Da ihr z.B. auch die Paging Option geboten bekommt und mit

$('#example').dataTable( {
"lengthMenu": [ 10, 25, 50, 75, 100 ]
} );

die jeweilige Konfiguration

"lengthMenu": [ 25, 50, 75, 100, 250 ]

den Möglichkeiten von CRM hin anpassen könnt oder gar mit page.len() die Vorgabe auf den Wert vorgeben könnt, den der jeweilige Nutzer in seinen persönlichen Einstellungen vorkonfiguriert hat, ist mit wenigen Handgriffen ein zum Standard Grid natürliches Look & Feel geschaffen.

Mein persönliches Fazit lautet: Habt ihr verschiedene Daten aus einer Fremd-Anwendung (z.B. einem ERP System) oder bietet sich euch nicht die Gelegenheit der Abbildung mit Hilfe der neuen Sub-Grids, so stellen die DataTables dank der einfachen Bedienung und der ausgereiften API eine hervorragende Möglichkeit, Daten in einer HTML Web-Ressource zu visualisieren.

Technorati Tags:

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:

Microsoft Dynamics CRM 2013 | Falsches Datum an der Notiz einer Anfrage

Heute möchte ich Euch auf einen Support-Artikel für On-Prem Kunden aufmerksam machen, der sich mit einem Fehler auseinandersetzt, den ich in der letzten Woche bei Kunden und in meiner Entwicklungsumgebung festgestellt hatte.

Es geht dabei um die inkorrekte Darstellung des Datums bei Notizen, die Anfragen zugeordnet sind. Unter diesem Link findet Ihr hierzu die exakte Vorgehensweise, um die fehlerhafte Darstellung zu korrigieren. Vergewissert Euch dabei vorher, welcher Fall bei Euch zutrifft. Es muss nur je einer der beschriebenen Fälle ausgeführt werden.

Technorati Tags:

Microsoft Dynamics CRM 2013 | MPR Toolkit

MPRToolkit

Mein heutiger Artikel ist allen Microsoft Dynamics CRM Partnern bzw. Entwicklern gewidmet, die das MPR Toolkit nutzen, um Ihre CRM Lösungen auf die so genannte Platform Readiness prüfen lassen wollen.

Um dieses Tool zu erhalten, muss man sich zunächst unter www.microsoftplatformready.com anmelden und eine Anwendung anlegen. Ihr erhaltet auf dieser Seite auch eine so genannte App-ID, die Ihr zur Anmeldung eurer App im Microsoft Partner Network benötigt.

Alle Entwickler, die jedoch auch nur mal so Ihre Anwendung ohne eine Mitgliedschaft im Microsoft Partner Network testen wollen, können dies ebenfalls mit diesem Toolkit tun.

MPRToolkit_NewTest

Hat man sich für einen CRM 2013 Test eingetragen, so stellt man zunächst erst einmal fest, dass man den Test lediglich mit einer CRM 2013 Online Umgebung durchführen kann. Den Test in einer On-Premise-Umgebung zu starten ist derzeit leider nicht möglich. Glücklicherweise besteht aber die Möglichkeit, euch eine 30-tägige Testversion von CRM online zu besorgen.

Des Weiteren solltet Ihr euch die Grundvoraussetzungen im Word-Dokument, welches Ihr auf dieser Seite im Download-Link angeboten bekommt unbedingt durchlesen und befolgen.

MPRToolkit_Prereq_Details

Hat man anschließend einen Test gestartet, so wird man in verschiedenen Dialogen durch den eigentlich Prozess, der aus drei Testschritten besteht geführt.

Dabei gilt: Wann immer Ihr eine Schalftfläche “Validate” findet, betätigt diese. Euer Test kann ansonsten entweder nicht fortgesetzt werden, oder aber Ihr schaut hinterher in dem Testbericht auf eine “failed” Status-Meldung, die besagt, dass Ihr eine Validierung ausgelassen habt.

Der eigentliche Test besteht wie gesagt aus drei Schritten, zunächst wird eure Lösungsdatei (oder auch Dateien) validiert, anschließend installiert. Es folgt dann eine Validierung auf den Einsatz von Scripten, gefolgt von einem online Performance Test der Scripte und einer abschließenden Deinstallation.

Klingt soweit eigentlich ganz einfach, doch in der Praxis einen erfolgreichen Test ausgewiesen zu bekommen, stellt sich dann doch als größere Herausforderung dar. Daher folgende Tipps für euch:

  • konfiguriert in den Persönlichen Optionen des CRM die Benachrichtigung im Fehlerfall (niemals einen Fehler senden)
  • konfiguriert den Pop-up Blocker, auch wenn Ihr Ihn normalerweise nicht benutzt
  • gebt die CRM Testinstanz unter Vertrauenswürdige Seiten unbedingt an
  • schaltet auf einem Windows 2012 Server System unbedingt für Administratoren die Erweiterte Sicherheit für Internet-Explorer aus

Kommen wir nunmehr zu wichtigen Tipps, die eure Lösung bzw. Lösungsdateien betreffen:

  • Gebt die zu testenden Dateien in der Reihenfolge der Installation an, wenn Ihr mehr als eine Datei habt. Sprich vorausgesetzte Dateien zuerst, dann die darauf aufbauenden Lösungsdateien
  • Ihr verwendet in Eurer Lösung Benutzerdefinierte Sicherheitsrollen? Lagert diese in einer separaten Lösungsdatei aus
  • Ihr verwendet in Eurer Lösung Feld-Sicherheitsprofile? Lagert diese ebenfalls aus
  • Eure Lösung beinhaltet eine neue Navigation oder gar Anwendungs-Menüpunkte? Lagert beides unbedingt in separaten Dateien aus (eine Lösung mit Sitemap, eine Lösung mit Application Ribbons)
  • In eurer Lösung verwendet Ihr Prozesse? Erneut gilt die Faustregel, auch diese in einer oder mehreren separaten Dateien auszulagern
  • Ihr verwendet SDK Plug-Ins oder Workflow Assembly? Auch diese gehören jeweils in eigene Dateien
  • Eure Lösung besteht aus mehreren Benutzerdefinierten Entitäten und der Export der verwalteten Lösung endet in einer Lösungsdatei, die größer als 2MB groß ist? Verkleinert die Lösung und teilt sie nach Möglichkeit in kleinere Lösungspakete auf
  • Eure Lösung basiert auf die Integration der Entitäten Benutzer, Service-Aktivität, Teams und Equipment? Wenn ihr hier keine individuellen Anpassungen an Masken vorgenommen habt, sondern es sich hier nur um Beziehungen zu diesen Entitäten handelt, dann integriert diese Entitäten nicht in Eurer Lösung (auch, wenn dies ein Warnhinweis beim Export gibt)
  • CRM Online Testinstanzen sind jetzt immer standardmäßig mit dem Spring Wave ‘14 Paket versorgt. Wählt daher beim Export eurer Lösung auf dem Entwicklungssystem die Version 6.1 aus.

Bei dem eigentlichen Test gilt dann:

  • Wenn Ihr könnt, verwendet eine in der Azure Cloud befindliche Virtuelle Maschine, um Netzwerk-Latenzzeiten optimieren zu können. Wenn Ihr euch für eine kostenlose Azure Testumgebung anmeldet, wird diese (je nach eurer Ländereinstellung) meist im gleichen Rechenzentrum betrieben, wie eure CRM Online Testinstanz
  • Führt den Test nicht während der Arbeitszeit, sondern eher zum Abend hin aus. Eure CRM Online Testumgebung teilt sich die SQL Performance mit anderen Instanzen. Der Test selbst stellt eine hohe Anforderung an die Performance des SQL Systems. Die Wahrscheinlichkeit, dass zum Abend hin viele Nutzer noch aktiv sind, ist gering und damit die Chance hoch, dass euer Test nicht wegen eines SQL Timeouts als “failed” eingestuft wird.
  • Gebt der virtuellen Maschine mit der Ihr den Test durchführt nicht zu geringen Arbeitsspeicher und nach Möglichkeit auch mehr als einen CPU Kern.

Wenn Ihr diese Tipps befolgt, ist die Wahrscheinlichkeit den Test erfolgreich abschließen zu können sehr viel höher, versprochen…

Technorati Tags:

Microsoft Dynamics CRM 2013 | ExpandCalendarRequest

Einige von Euch mögen mich schon auf meinem Blog vermisst haben. Heute aber ein neuer Artikel im Bezug auf Service Pack 1 bzw. CRM Online 2013 Spring Wave ‘14.

Settings_Service-ManagementMit dem Roll-Out von “Leo” sind signifikante Neuerungen im Bereich Service-Management ausgerollt worden, die z.B. einen neuen Customer Service Kalender mitbringen. Neben diesem Kalender wurde auch ein weiterer Ferien-Kalender eingeführt.

Dieser Kalender ist nicht mit dem ursprünglichen Betriebsferien-Kalender zu verwechseln. Er sollte jedoch die gleichen Informationen enthalten. Sprich für die Administratoren gilt es beide Kalender ordnungsgemäß mit Daten zu versorgen, da Sie unterschiedliche Aufgaben wahrnehmen und keine Verbindung zueinander haben.

Besonders deutlich wird dies in einem SDK Experiment, dass ich Euch anhand des ExpandCalendarRequests vorstellen möchte.

User_WorkHours_Setting

Beginnen wir zunächst mit den Einstellungen eines Users in seinem Arbeitszeitenkalender. Hier konfiguriere ich in den Einstellungen, dass die Betriebsferien berücksichtigt werden sollen.

SLACalendarSetting

Ein entsprechen-des Pendant findet sich auch bei den neuen Customer Service Kalendern. HIer kann man einen Ferienkalender berücksichtigen und diesen gezielt auswählen.

Nun gibt es im SDK im Client-Verzeichnis ein SOAPLogger Sample, mit dessen Hilfe Ihr einige Ausgaben und Aufrufe aus dem CRM nachvollziehen könnt. Ich habe daher dieses Projekt ausgewählt, um die Auswirkungen eines ExpandCalendarRequests mit den neu eingeführten Kalendern zu testen.

Query_ExpandCalendar_Samples

 

 

 

 

 

 

 

 

Mit QueryScheduleRequest im 1. Block frage ich den Arbeitszeitenkalender eines Users gezielt nach verfügbaren und Nicht-verfügbaren Zeitinformationen hin ab. Dieser Abfrageblock dient mir lediglich als Kontrolle. Die eigentlich interessanten Code-Blöcke sind die beiden ExpandCalendarRequests im Folgenden. Der 1. Block liefert mir Zeitinformationen aus dem Kalender des Benutzers. Der 2. Block liefert mir entsprechende Informationen aus dem neuen Customer Service Kalender.

Sowohl in den Betriebsferien, als auch im Ferien-Kalender habe ich den 19.06. (Fronleichnam) hinterlegt, Daher wird Start- und End-Date von mir mit AddDays manipuliert.

Schauen wir uns den TimeInfo Block aus dem QueryScheduleRequest an:

<b:TimeInfo>
                <b:ActivityStatusCode>-1</b:ActivityStatusCode>
                <b:CalendarId>898428c3-b669-e311-9406-000c291235a7</b:CalendarId>
                <b:DisplayText />
                <b:Effort>0</b:Effort>
                <b:End>2014-06-19T22:00:00Z</b:End>
                <b:IsActivity>false</b:IsActivity>
                <b:SourceId>43b93bb5-daf3-e311-9412-000c291235a7</b:SourceId>
                <b:SourceTypeCode>4004</b:SourceTypeCode>
                <b:Start>2014-06-18T22:00:00Z</b:Start>
                <b:SubCode>Holiday</b:SubCode>
                <b:TimeCode>Unavailable</b:TimeCode>
</b:TimeInfo>

Wir sehen, dass hier die Einstellung “Observe Business closures” greift und uns der Zeitblock als “Unavailable” bedingt durch den Ferientag zurückgeliefert wird.

Wie sieht es nun mit ExpandCalendarRequest aus?

<b:TimeInfo>
                <b:ActivityStatusCode>-1</b:ActivityStatusCode>
                <b:CalendarId>898428c3-b669-e311-9406-000c291235a7</b:CalendarId>
                <b:DisplayText />
                <b:Effort>0</b:Effort>
                <b:End>2014-06-19T22:00:00Z</b:End>
                <b:IsActivity>false</b:IsActivity>
                <b:SourceId>43b93bb5-daf3-e311-9412-000c291235a7</b:SourceId>
                <b:SourceTypeCode>4004</b:SourceTypeCode>
                <b:Start>2014-06-18T22:00:00Z</b:Start>
                <b:SubCode>Holiday</b:SubCode>
                <b:TimeCode>Unavailable</b:TimeCode>
</b:TimeInfo>

Erfreulicherweise ist die Ausgabe identisch. Nun würden wir erwarten das diese Methode sich bei den neuen Kalender gleich verhält, denn auch hier haben wir dem System mitgeteilt, dass der Urlaubskalender bitte berücksichtigt werden soll. Was liefert uns also der Zeitinformationsblock?

<b:TimeInfo>
                <b:ActivityStatusCode>-1</b:ActivityStatusCode>
                <b:CalendarId>0974b546-dbf3-e311-9412-000c291235a7</b:CalendarId>
                <b:DisplayText />
                <b:Effort>1</b:Effort>
                <b:End>2014-06-19T15:00:00Z</b:End>
                <b:IsActivity>false</b:IsActivity>
                <b:SourceId>fac75d32-e4f3-e311-9412-000c291235a7</b:SourceId>
                <b:SourceTypeCode>4004</b:SourceTypeCode>
                <b:Start>2014-06-19T06:00:00Z</b:Start>
                <b:SubCode>Schedulable</b:SubCode>
                <b:TimeCode>Available</b:TimeCode>
</b:TimeInfo>

Leider jedoch liefert hier der Zeitblock eine Verfügbarkeit für den kompletten Zeitraum zurück. Der Ferienkalender, in dem ebenfalls Fronleichnam hinterlegt wurde wird hier also nicht berücksichtigt.

Die gute Nachricht vorweg: Es sollte sich dabei um einen Bug handeln, der in einem zukünftigen Update Rollup behoben werden sollte.

Die schlechte Nachricht: Der bis dato notwendige Workaround ist, den neuen Ferienkalender zusätzlich abzufragen und sich die verfügbare Zeit somit selbst auszurechnen bzw. zu bestimmen.

Dieses kleine Beispiel sollte Euch aufzeigen, dass mit der Einführung der neuen Funktionen auch einige Berührungspunkte in Sachen Abfragen (SDK) zu berücksichtigen sind. Zukünftige Business-Logiken müssen ggfs. daraufhin angepasst werden.

Bis zum nächsten Mal.

Technorati Tags:

Microsoft Dynamics CRM 2011 | Update Rollup 17

Es ist soweit, seit letzter Woche steht Update Rollup 17 für Microsoft Dynamics CRM 2011 zum Download bereit und damit für Windows 8.1 bzw. Windows 7 auch das Zeitalter der Unterstützung von IE11 eingeführt.

Update Rollup 17 enthält einen Hotfix, der manuell aktiviert werden muss. Dieser betriff den E-Mail Router und Exchange 2010.

  1. On the Email Router machine, you must create a new String value Key named “CASServerName” in the path HKEY_Local_Machine\Software\Microsoft\MSCRMEmail.
  2. Enter the NetBIOS name of one of the Exchange CAS servers.

Deshalb habe ich auch wieder mein Registry Key Artikel aktualisiert, so dass alle Änderungen zentral zusammengefasst eingesehen werden können.

Natürlich stehen auch wieder zentrale Punkte im Fokus des Update Rollup 17. Sprich uns erwarten Verbesserungen im Outlook-Client (Ladeverhalten), wie auch im Web-Client.

Einen hervorragenden Überblick gewinnt Ihr im Podcast.

Technorati Tags:

Microsoft Dynamics CRM 2013 | Yammer Integration

Am heutigen Sonntag, den 06. April hat Yammer seiner JavaScript API ein Update spendiert, die es Integrationskunden notwendig macht, das Update Rollup 2 für Microsoft Dynamics CRM 2013 einzuspielen, um die Integration von Yammer weiterhin einwandfrei nutzen zu können. Da das Update Rollup 2 vermutlich erst in der kommenden Woche für On-Premise Kunden via Microsoft Update zur Verfügung gestellt wird, sollte die Möglichkeit der manuellen Installation via Download Center genutzt werden.

CRM 2013 Online Kunden haben bereits die notwendigen Anpassungen in Ihrem System – hier ist also keine Aktion seitens der Administratoren erforderlich.

Technorati Tags: