Tag Archives: CRM Online

System Administrator Role identifizieren

Basierend auf der gewählten Base Language der CRM Organization haben die Roles (Sicherheitsrollen) unterschiedliche Namen. So heisst der “System Administrator” auf Deutsch “Systemadministrator”. Es stellt sich nun die Frage, wie man eine Role organisationsübergreifend und unabhängig von der Base Language identifizieren kann.
Continue reading

Count mit FetchXml

Leider ist es weder mit einer QueryExpression noch mit Linq möglich eine Aggregation (Server seitig) in einer Abfrage durchzuführen.
Deshalb ist man gezwungen FetchXml zu benutzten. Hier ein kleines Beispiel wie sich ein Count ausführen lässt.

string fetchXml = String.Format("<fetch distinct='false' no-lock='false' mapping='logical' aggregate='true'>" +
"<entity name='account' > " +
"<attribute name='accountid' aggregate='count' alias='accountCount' /> " +
"</entity>" +
"</fetch>");

var request = new ExecuteFetchRequest { FetchXml = fetchXml };
var response = (ExecuteFetchResponse)organizationService.Execute(request);
var fetchResult = XDocument.Parse(response.FetchXmlResult);
return int.Parse(fetchResult.Descendants("accountCount").Single().Value);

FetchXML und Wildcards

In diesem Post geht es um die Interpretation von Wildcards von Dynamics CRM. Um das Problem zu erklären, muss ich etwas ausholen. Die Anforderung war folgende: Ein CRM Dialog soll die Möglichkeit bieten nach Entitäten zu suchen. Die Suche soll mit “Begins With” funktionieren. Gibt der Benutzer für ein Attribut keinen Wert ein, so soll dieses Attribut nicht berücksichtigt werden. Als Filter ist “and” einzusetzen.

Zum bessern Verständnis hier der gewünschte Dialog:
Wildcard_1

Was hat das nun mit FetchXML und Wildcards zu tun? Beim testen fällt folgendes auf:
Wildcard_3

In Worte gefasst: Sobald ein Attribut, dass in die Suche mit einbezogen wird, keinen Wert enthält, wird der Record nicht mehr zurückgeliefert.

Sehen wir uns also die Query an, die abgesetzt wird:
Wildcard_2

Im oben gezeigten Fall, müsste das somit die folgende sein:

<fetch mapping='logical'>
   <entity name='account'>
      <attribute name = 'name'/>
      <attribute name = 'accountid'/>
      <order attribute='name' descending='false' />
      <filter type='and'>
         <condition attribute = 'name' operator='like' value='Stree%'/>
         <condition attribute = 'name' operator='like' value='%'/>
      </filter>
   </entity>
</fetch>

Nach etwas mehr Testing (mit ausführen der FetchExpression über eine Console Application) kam ich zum Schluss:
Der Wildcard Operator “%” steht für “Any Character” aber nicht für “Empty”.

Diese Erkenntnis war sehr ärgerlich, heisst sie doch, dass sich die Anforderung nicht umsetzen lässt. Oder etwas doch? Mit einem Plug-In auf der “RetrieveMultiple” Message müsste sich die Query manipulieren lassen. Und siehe da, es funktioniert. Hier noch der Code für das Plugin.

public class RetrieveMultiple : IPlugin
{
  public void Execute(IServiceProvider serviceProvider)
  {
    var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

    if (context.InputParameters.Contains("Query") &amp;&amp; context.InputParameters["Query"] is FetchExpression)
    {
      var fetchExpression = (FetchExpression)context.InputParameters["Query"];
      var xDocument = XDocument.Parse(fetchExpression.Query);
      xDocument.Descendants("condition").Where(c => c.Attribute("operator").Value == "like" &amp;&amp; c.Attribute("value").Value == "%").Remove();
      fetchExpression.Query = xDocument.ToString(SaveOptions.DisableFormatting);
    }
  }
}

Bulk Data Load CRM 2013 – Speedtest

Was ist die schnellste Methode um 10’000 neue Accounts in einem CRM Online zu erstellen? Im letzten Post “Bulk Data Load CRM 2013 – Tipps und Tricks” habe ich schon einiges dazu geschrieben. Hier wird es nun etwas konkreter. Continue reading

0x80040216 – Expected to find one SdkMessageFilter for SdkMessageId {GUID} PrimaryEntity 10015 and SecondaryEntity 0. Found 0 records.

Wenn du probierst eine CRM Solution mit einer Custom Action, auf der wiederum ein Plugin Step (SdkMessageProcessingStep) registriert ist, im CRM Online zu importieren erhältst du den folgenden Fehler.

“0x80040216 – Expected to find one SdkMessageFilter for SdkMessageId {GUID} PrimaryEntity 10015 and SecondaryEntity 0. Found 0 records.”

Dabei handelt es sich um einen Fehler im CRM Online.
Der Microsoft Support hat den Fehler bestätigt. Er soll mit einem der nächsten URs behoben werden.

Workaround: Die Solution mit der Action ohne registrierten Step importieren und den Step auf dem Zielsystem mit dem Plugin Registration Tool manuell registrieren.

Bulk Data Load CRM 2013 – Tipps und Tricks

Operationen mit grossen Datenmengen im Microsoft Dynamics CRM sind häufig sehr langsam und daher mühsam. Richtig ärgerlich wird es wenn einem das Sandbox Timeout in einem Plugin oder einer Custom Workflow Activity dazwischen kommt. Continue reading

Integration Scenarios CRM 2013 – Übersicht

In diesem Post gebe ich eine Übersicht über die Möglichkeiten für die Integration von Fremdsystemen bzw. deren Daten ins CRM 2013.

Inhalt
UI-Only
Read-Only
Progressiv Read-Only
Read / Write Sync
Read / Write Realtime


UI-Only
Die Daten werden im CRM nur angezeigt bzw. die Fremdapplikation wird integriert.

IFrame
Das CRM erlaubt das Einfügen von IFrames auf Forms.
So kann leicht ein UI eines Fremdsystems angezeigt werden.

IFrame + SRSS
Hat das andere System kein Web-Frontend oder verhindern andere Umstände die Integration über ein IFrame, besteht dich Möglichkeit ein SRSS Report zu erstellen und diesen in einem IFrame anzuzeigen.

Dialogs
In der Commandbar/Ribbon wird ein Button eingefügt der das Fremdsystem in einem Popup öffnet.

HTML + JS
Mittels HTML und JavaScript lässt sich z.B. ein REST Service einfach ansprechen und die Daten darstellen.
Dabei wird entweder ein bestehender Service verwendet oder es wird selbst ein Service erstellt der die Daten des Fremdsystems zur Verfügung stellt.

Zu berücksichtigen
– Abhängigkeit
Direkte Abhängigkeit zum Fremdsystem
– CRM Funktionalitäten nicht verfügbar
Auf den Daten steht keine CRM Funktionalität zur Verfügung (z.B. Advanced Find oder Workflows)


Read-Only
Daten werden Unidirektional ins CRM synchronisiert.
Dabei ist das Fremdsystem der Master.

Dafür gibt es diverse Möglichkeiten:

Eigenständige Tools
Microsoft Dynamics CRM Instance Adapter von Microsoft
Scribe, dass auch einen Cloud Dienst anbietet

SSIS mit Adapter
KingswaySoft Adapter

CRM OOB
– Der CRM Import wird genutzt
Die meisten Fremdsysteme können Daten als CSV Dateien exportieren.

Eigenentwicklung
– Custom Workflow Activity
Mit Hilfe einer Custom Workflow Activity und einem reccuring Workflow wird der Import selbst entwickelt.

Zu berücksichtigen
– Datenmengen
Vorsicht bei grossen Datenmengen. Verglichen mit einem SQL Server ist das CRM sehr langsam.
Dadurch geht das schreiben und holen von Daten unter Umständen sehr lange.
Dabei muss bei Plugins und Workflow Activities immer das Sandboxtimeout (2 min) im Hinterkopf behalten werden.
– Abhängigkeit
Evtl. Abhängigkeit zu 3rd Party Tools oder Services


Progressiv Read Only
Daten werden bei Bedarf geholt.

Ohne Caching
Mithilfe des “Retrieve” oder “RetrieveMultiple” Events für Plugins, können Daten On-Demand nachgeladen werden.
Ein Beispiel: Basierend auf einer Id soll aus dem SAP der Betrag über offene Rechnungen vom jeweiligen Account geholt werden.
Die Daten des Fremdsystems werden dann in die Records, die vom CRM zurückgegeben werden, hineingeschrieben.

Mit Caching
Dasselbe wie ohne Caching aber zusätzlich werden die geholten Daten auch ins CRM geschrieben. Das Plugin wird so programmiert, dass der Wert nur einmal im Tag neu vom Fremdsystem geholt wird.

Zu berücksichtigen
– Performance
Das Plugin und somit das holen der Daten wird jedes Mal ausgeführt, wenn ein Record retrieved wird.
Wird also eine View mit 250 Records angezeigt, wird das Plugin 250 ausgeführt.
– Keine “realtime” Trigger
Da die Daten nicht im CRM liegen oder nur im CRM gecached werden, kann keine Aktion auf dem Change Event ausgeführt werden.


Read / Write Sync
Daten werden bidirektional mit dem CRM und dem Fremdsystem synchronisiert.

Dafür können die gleichen Techniken wie bei “Read Only” verwendet werden.
Eine zusätzliche Herausforderung ist hier das Löschen.
Wird ein Datensatz im CRM gelöscht und dieser soll auch im Fremdsystem gelöscht werden, muss dafür eine eigene Liste geführt werden, die weiss welche Records gelöscht wurden.
Dafür wird eine eigene Entität erstellt und auf dem “Delete” Event ein Plugin registriert, dass einen entsprechenden Eintrag erstellt.

Zu berücksichtigen
– Datenmengen
Vorsicht bei grossen Datenmengen. Verglichen mit einem SQL Server ist das CRM sehr langsam.
Dadurch geht das schreiben und holen von Daten unter Umständen sehr lange.
Dabei muss bei Plugins und Workflow Activities immer das Sandboxtimeout (2 min) im Hinterkopf behalten werden.
– Konflikt Management
Was passiert wenn ein Datensatz in beiden Systemen gleichzeitig geändert wird?
– Datenaktualität
Die Daten im CRM sind unter Umständen nicht aktuell.
– Abhängkgiet 3rd party
Evtl. Abhängigkeit zu 3rd Party Tools oder Services
– Löschen


Read / Write Realtime
Daten werden bidirektional mit dem CRM und dem Fremdsystem synchronisiert.
Änderungen werden in Echtzeit übernommen.

In:
Die CRM API bietet dem Fremdsystem beste Möglichkeiten um Daten ins CRM zu schreiben.

Out:
Mittels Plugins, sync oder async je nach Anforderung, werden Änderungen ins Fremdsystem geschrieben.

Zu berücksichtigen
– Locking und Konflikte
Darf ein Datensatz in beiden Systemen gleichzeitig bearbeitet werden?
Was passiert wenn ein Datensatz in beiden Systemen gleichzeitig geändert wird?
– Transaktionssicherheit
Was passiert wenn das Fremdsystem nicht erreichbar ist oder nur ein Teil der geänderten Daten geschrieben werden konnte?

CRM Roadmap 2014

Das Jahr 2014 wird ein spannendes Jahr für Microsoft Dynamics CRM. Das gilt für Consumer ebenso wie für Entwickler, dazu mehr in einem späteren Post. In diesem Post geht es um die geplanten Releases. Continue reading

CRM 2013 UR2 verfügbar

Update Rollup 2 für CRM 2013 ist über das Download Center verfügbar.
UR: http://www.microsoft.com/en-us/download/details.aspx?id=42272
KB: http://support.microsoft.com/kb/2919956

Das UR2 ist bereits für alle CRM 2013 Online Kunden ausgerollt und wird am 8. April über Microsoft Update verteilt.

Build number:
6.0.0002.0046

Highlights:

  • Unterstützung für Windows 8.1 und Internet Explorer 11
  • Unterstützung von iOS7 mit Safari auf iPad
  • Windows Server 2012 R2 für CRM-Server