Microsoft Dynamics CRM 2015 | CRMUGSummit Reno

NEWSummit_Speaker_Tiles15_CRMUG

Der Oktober steht nicht nur im Zeichen “Re-awarded MVP?” (by the way you can influence it nominating your candidate here, sondern auch im Zeichen der Community-Arbeit.

Als Sprecher der CRMUGSummit in Reno halte ich zwei interessante Sessions für euch aus den Bereichen Mobile Client Entwicklung und CRM Service Area (inkl. Ausblick im Zuge der FieldOne Akquisition) bereit, unterstütze meine MVP Kollegen in unseren MVP Ask-the-Experts-Sessions und stehe als “CRMUGMedic” gemeinsam mit meinen Medizin-Kollegen mit Rat und Tat zur Seite.

Habt ihr noch nichts vor? Dann werft doch gleich einen Blick in die vorläufige Agenda und meldet euch am Besten gleich zu dieser Veranstaltung an. Der Austausch mit anderen CRM Nutzern und die Teilnahme an interessanten Fachvorträgen, Trainings oder Workshops hilft in der täglichen Nutzung von Microsoft Dynamics CRM. Und darüber hinaus ist es die perfekte Gelegenheit, sich über die kommenden Neuerungen im On-Premise-Umfeld zu informieren und für Microsoft Dynamics CRM 2015 fit zu machen.

Also, wir sehen uns…(und eure Nominierung nicht vergessen)

Microsoft Dynamics CRM 2015 | Schon gewusst?

DidYouKnow

Im Rahmen der so genannten Plug-In Entwicklung stellt Microsoft innerhalb des SDK das Plug-In Registrierungstool bereit. Mit diesem können nicht nur Plug-ins, sondern auch so genannte Workflow Aktivitäten registrieren, die man als Erweiterung der vorhandenen Workflow Schritte programmiert hat und nunmehr bereitstellen möchte.

Nachdem man die einzelnen Bibliotheken registriert hat, bietet einem das Werkzeug jedoch auch noch die Möglichkeit, einige Felder anzupassen als da wären:

  • Description
  • FriendlyName
  • Name
  • WorkflowActivityGroupName

PluginRegistration_EditableFields

Da kommt man schnell mal in die Versuchung, wie im Beispiel links zu sehen, den FriendlyName (in der Regel steht hier eine GUID) neu zu setzen. Doch wär hätte gedacht, dass der FriendlyName, in Wahrheit gar nicht der FriendlyName ist. Stattdessen ist der Name oder DisplayName in Wahrheit der FriendlyName.

Der “Fehler” geht zurück auf die CRM 4.0 Zeit und konnte seitdem auf Grund von Abwärtskompatibilitätsgründen noch nicht korrigiert werden. Wer nun jedoch im FriendlyName die GUID entfernt hat, stellt fest, dass beim nächsten Update der Bibliothek (z.B. eine Fehlerbereinigung) die Aktualisierung mit einem Fehler abbricht. Hintergrund hierfür ist, dass die GUID nicht mehr gefunden werden kann, die sich an einem Prozess oder auch einer Prozessvorlage (verbunden mit dieser Workflow-Aktivität) nicht mehr findet, da Ihr diese durch einen “FriendlyName” ausgetauscht habt.

Lasst in Zukunft also besser die Finger von diesem Feld und beschränkt eure Anpassungen auf die Felder Beschreibung, Name und Workflow-Activity-Group-Name.

Microsoft Dynamics CRM 2015 | Schon gewusst?

DidYouKnowIn einer neuen Serie “Schon gewusst?” möchte ich euch einige Tipps & Tricks vorstellen, über die ich im Rahmen zahlreicher Kundenprojekte oder dem Studium von anderen Artikeln gestoßen bin. Heute geht es um ein aktuell im CRM 2015 Update 1 vorliegendes Script-Fehler Problem:

<Message>Uncaught TypeError: Cannot read property ‘uniqueId’ of null</Message>
   <Line>1</Line>
   <URL>/_static/_common/scripts/jquery-2.1.1.min.js?ver=265869287</URL>

Dieses Problem äußert sich z.B. durch Nutzung des Outlook Clients, Öffnen einer Anfrage und nachdem ihr Änderungen getätigt und gespeichert habt, kommt ein Hinweis auf jenen Script Fehler, den ihr mit OK bestätigen könnt.

Der Fehler ist weitaus tiefgreifender, als nur ein reiner Script Fehler und von Seiten Microsoft wird bereits an einem entsprechenden Fix gearbeitet. Wem jedoch die Bestätigung des Scripts in der Praxis aufstößt, der kann durch eine simple Anpassung dem ganzen Herr werden.

Hierzu eine Lösung erstellen, die Entität Anfrage hinzufügen und die Lösung unverwaltet exportieren. Die Archiv-Datei exportieren und im Anschluss in der Datei customizations.xml nach “accountcasessgrid” suchen. Es sollte sich ein Treffer finden.

Fügt nunmehr innerhalb des Parameters XML Tags den Parameter

<EnableContextualActions>false</EnableContextualActions>

Case_Entity_SubGridshinzu. Speichert die Änderungen, packt die Dateien erneut in ein Archiv und importiert dieses. Die Änderung bewirkt, dass Ihr das Plus (+) Zeichen bei der Vorschau aktueller Anfragen nicht mehr haben werdet und damit nutzen könnt. Jedoch ist im Anschluss auch der Fehler passé und Ihr könnt ohne die Fehlermeldung eurer Arbeit nachgehen. Wer im übrigen seine Anfrage-Maske angepasst hat und weitere Subgrids eingebracht hat, der muss o.g. Parameter auch für diese setzen.

Wie gesagt, der Fehler ist Microsoft bereits bekannt und es wird an einer Lösung gearbeitet. Wann diese Lösung veröffentlicht / zur Verfügung gestellt werden kann, steht jedoch noch nicht fest.

Microsoft Dynamics CRM 2015 | Update 1–Lessons Learned Part V

Lessons_Learned

Und wieder dreht sich ein weiterer Artikel um Erfahrungen, die im Rahmen des Updates auf CRM 2015 Update 1 gewonnen werden konnten. Heute im Speziellen zum Thema JavaScript.

Wie der ein oder andere von Euch weiß, können verschiedene Aktionen, die wir in der Vergangenheit per JavaScript client-seitig durchgeführt haben, in der aktuellen Version mit Hilfe der Geschäftsregeln umgesetzt werden. Einige Aktionen jedoch sind bis heute noch nicht mit Geschäftsregeln zu realisieren. Andere Aktionen können auf Basis der SDK Erweiterungen erst mit Update 1, nicht jedoch mit der aktuell verfügbaren CRM On-Premise 2015 Version realisiert werden. So zum Beispiel einige Event-Trigger zur Geschäftsprozess-Leiste. Wie können wir dennoch unseren Script-Code in einer Lösung entwickeln und ausrollen?

Die Antwort: Ihr verwendet die RetrieveVersionRequest Klasse auch in Euren Scripten als Hilfsklasse und erfragt vorab Eurer Script-Logik zunächst die CRM Version. In Abhängigkeit dieser, läuft die Script Logik mit dem Funktionsumfang “Update 1” oder im Funktionsumfang “vor Update 1” ab.

Bis zum nächsten Tipp, Euch viel Spaß in Euren Projekten…

Microsoft Dynamics CRM 2015 | Update 1 – Lessons Learned Part IV

Lessons_Learned

Though Part I, Part II and Part III was written in german language – because of the popularity I decided to switch to english this time. Recently we´ve been part of a couple of migration projects where we supported partners/customers to migrate their existing solutions to work successfully with Microsoft Dynamics CRM 2015 Update 1.

One of the famous customizations we figured out is to create a customer attribute by manipulating an existing lookup field to allow searching for multiple entities and storing the value.

To identify this customization you should take a look at the following lines of code:

lookuptypeIcons = ‘/_imgs/ico_16_2.gif:/_imgs/ico_16_4.gif:/_imgs/ico_16_8.gif';
lookuptypenames = ‘contact:2:Contact,lead:4:Lead,systemuser:8:User';
lookuptypes = ‘2,4,8’;

document.getElementById(“xxx”).setAttribute(“lookuptypes”, lookuptypes);
document.getElementById(“xxx”).setAttribute(“lookuptypenames”, lookuptypenames);
document.getElementById(“xxx”).setAttribute(“lookuptypeIcons”, lookuptypeIcons);
document.getElementById(“xxx”).setAttribute(“defaulttype”, “4”);
  …
  value[0].displayClass = “ms-crm-Lookup-Item”;
  value[0].keyValues = new Object();
  value[0].values = new Object();
  value[0].onclick = “openlui()”;
  value[0].id = savedId;
  value[0].entityType = savedEntityName;
  value[0].typename = savedEntityName;
  value[0].name = savedName;
  value[0].type = savedType;
  Xrm.Page.getAttribute(“xxx”).setValue(value);

Update1_Script_Error_DOM_ManipulationThe issue you’ll find using this type of customization is, that it contains unsupported code and DOM Manipulation. Therefore you will receive an error message like this during onLoad(). As the Custom Code Validation (CCV) Tool probably won´t recognize this as unsupported, cause it cannot identify what the code action does, you´ll have to identify manually, if you´re using this kind of customization.

Now that you´ve identified such customization – what are your options to correct the code and stay supported? As we currently don´t have an attribute type “customer” we can add to our form, the supported options would be:

a) avoid using a customer attribute and try to use an assigning to account, lead or contact directly

b) build a web-resource (HTML) and build a custom attribute to request data from different entity types and store the information inside the appropriate attirbute, such as a hidden account, contact or lead lookup

c) go for a custom activity entity where you´ll get a regarding attribute by default which is a multiple entity lookup control.

You do have other options and want others to participate from? Just send a comment and help others staying supported and avoid getting unwanted script error messages while upgrading to Microsoft Dynamics CRM 2015 Update 1.

Until next time…

Microsoft Dynamics CRM 2015 | Update 1 – Lessons Learned Part III

Lessons_LearnedIhr steht also kurz vor einem Update auf CRM 2015 Update 1 und wollt von den zahlreichen neuen Funktionen profitieren? Möglicherweise habt Ihr bereits meinen 1. und 2. Teil gelesen. Nachdem ich zahlreiche Projekte in den letzten drei Wochen begleitet habe, folgen heute weitere Hinweise für euch, die das CCV Tool nicht identifiziert.

Nehmen wir an, eine Abfrage wurde via FetchXML oder einem Retrieve(Multiple) für ein Suchfeld durchgeführt und Ihr wollt mit dem Ergebnis ein Suchfeld auf eurer Maske setzen. Quasi eine 1:1 Kopie der Feldwerte von Entität A zu Entität B. Ihr verwendet für das Setzen der Werte:

Xrm.Page.getAttribute(“euerAttribut”).setValue([{ id: result.euerQuellLookup.Id, name: result.euerQuellLookup.Name, entityType: result.euerQuellLookup.LogicalName}]);

Dann wundert euch nicht über eine Fehlermeldung, sollte euer Quell-Suchfeld keine Werte enthalten. Ihr bekommt im Update 1 dann eine Fehlermeldung, dass EntityType undefiniert sei und weiterer Script-Code wird möglicherweise nicht korrekt ausgeführt.

In früheren Versionen konnte CRM mit einer leeren Quellangabe umgehen und ein Setzen des Feldwertes wurde schlichtweg nicht durchgeführt.

Nach einigen Tests mit CRM 2015 Update 1 scheint es nunmehr, dass hier gezielt im Ergebnis kontrolliert werden muss, ob ein Ergebnis vorliegt und nur im Erfolgsfall sollte dann auch das Ziel-Suchfeld mit obigem Befehl gesetzt werden.

Des Weiteren haben wir einige Installation analysieren dürfen, die jQueryUI verwendet haben, um einige Dialogfenster in der CRM Maske anzuzeigen. Diese Modifikationen zogen einige DOM Manipulationen nach sich. Jegliche Art von DOM Manipulation im CRM 2015 Update 1 zu einer Fehlermeldung bei der Initialisierung des Scripts.

Um hier in einer unterstützten Umgebung zu bleiben, empfehle ich daher diese Scripte entsprechend umzustellen. Handelt es sich bei der Ausgabe lediglich um Benutzerinformationen, so stehen hierfür die beiden Methoden:

  • Xrm.Utility.alertDialog(message,onCloseCallback)
  • Xrm.Utility.confirmDialog(message,yesCloseCallback,noCloseCallback)

zur Verfügung. Will man jedoch beispielsweise einige Daten tabellarisch in einem Dialog-Fenster darstellen, oder möchte andere HTML/CSS Formatierungen nutzen, so empfehle ich die Umstellung hin auf eine benutzerdefinierte HTML Web Ressource. Diese können wir unterstützt mit dem Befehl

Xrm.Utility.openWebResource(webResourceName,webResourceData,width, height)

aufrufen und haben über webResourceData sogar die Möglichkeit, entsprechende Ausgabewerte für eine Tabelle zu übergeben.

Doch Vorsicht: Schaut man sich das Beispiel im SDK zur Übertragung mehrerer Daten via encodeURIComponent an, so fehlt hier ein entscheidender Hinweis auf den wir in der Praxis gestoßen sind. Schauen wir uns die Beispiel URL an: 

http://<server name>/WebResources/new_/ShowDataParams.htm?Data=first%3DFirst%20Value%26second%3DSecond%20Value%26third%3DThird%20Value 

Man übersieht hier leicht, daß man schnell an das Limit der maximalen Länge einer URL heranreichen kann. Insbesondere dann, wenn ihr dem Beispiel folgt und eure Parameter tatsächlich mit first=, second=, third=, etc. beginnen lasst. Ich empfehle deutlich kleinere Schlüssel – Wertepaare. z.B. a=, b=, c=.

Dies ist zwar schlechter zu lesen, aber auf der Empfänger-Seite könnt Ihr daraus immer noch eure tatsächlichen Bezeichnungen als Variablen-Deklarationen verwenden.

Ihr seht schon, es haben sich einige Empfehlungen aus den bereits getätigten Umstellungen ergeben und ich versuche euch diese möglichst kompakt in dieser Serie zu vermitteln. Daher, bis zur nächsten “Session”…

Microsoft Dynamics CRM 2015 | Update 1– Lessons Learned Part II

Lessons_LearnedNachdem ich im 1. Teil bereits auf einige Punkte eingegangen bin, folgt heute nach weiteren Projekten ein weiterer Teil. Microsoft versendet seit kurzem Benachrichtigungen über Update 1 an die Systemadministratoren mit dem Hinweis, dass vorab der Planung des Updates auf Update 1 noch einige Tests in der Umgebung getätigt werden sollten, um sich am Update 1 auch entsprechend erfreuen zu können. In der E-Mail wird unter anderem auf das Customer Code Validation Tool verwiesen, mit dem ihr eure Anpassungen testen könnt. Aus der Praxis heraus hier nun ein paar Tipps:

Verwendung von jQuery.noConflict() – Leider erkennt das aktuelle CCV Tool die Verwendung von jQuery nicht optimal und gibt daher keinen entsprechenden Hinweis aus, den es bei der Verwendung von jQuery zu beachten gilt:

With Microsoft Dynamics CRM Online 2015 Update 1, form scripts run in a different scope than the jQuery instance used by the application. This means that there may not be an instance of jQuery available when your code attempts to use jQuery.noConflict. If you must use jQuery, you should first detect whether an instance of jQuery exists before you attempt to use jQuery.noConflict.

Verwendung der IE Developer Tools – Ihr nutzt die IE Developer Tools, um JavaScript Code mit Hilfe der Konsole zu debuggen? Dann solltet Ihr folgenden Hinweis beachten, um nicht überrascht zu sein, wenn euer Quellcode sich bei der Ausführung anders verhält, als bei der direkten Ausführung über die Konsole:

CRM forms are composed of several frames, for the code to work in the console you must select the right frame. For CRM Online 2015 Update 1 forms, select the frame named ClientApiWrapper.aspx. For earlier releases use the frame named main.aspx.

Verwendung von SDK.SOAP Library  oder anderen abhängigen Scripten, die in unterschiedlichen Bibliotheken vorgehalten werden – Das CCV Tool erkennt leider auch keine Script-Abhängigkeiten bzw. kann diese analysieren. Normalerweise fügt man alle Script-Bibliotheken der jeweiligen Form hinzu und verlässt sich bei der Initialisierung auf die Reihenfolge, in der man die Scripte der Form hinzugefügt hat. Mit der neuen Form Rendering Engine jedoch, gibt es auf die Lade-Reihenfolge keinen Verlass mehr:

As a performance optimization, Microsoft Dynamics CRM forms load JavaScript web resources asynchronously and in parallel. This means that the order in which the libraries are configured for a form does not guarantee that a library will be fully downloaded and initialized before another library might attempt to use one of the objects defined in it.

If you have code that depends on another library to be fully downloaded and initialized, the most straightforward approach is to combine both libraries within a single JavaScript web resource with your code below the library code. A more sophisticated approach is to use libraries such as head.js or require.js to control how the separate libraries are loaded.

Diese Tipps helfen euch, eure Scripte noch besser zu analysieren, denn das CCV Tool würde ich eher als grob-motorisches Werkzeug beschreiben. Den tatsächlichen “Beweis”, ob sich euer Script immer noch wie gewünscht verhält, erhaltet Ihr nur mit einem Test – z.B. durch die neue Sandbox Funktion.

Bis zum nächsten Tipp…