Tag Archives: CRM 2013

Dynamics CRM API: E-Mail von Template erstellen

Das CRM bietet die Möglichkeit, E-Mail Templates zu erstellen. Basierend auf diesen Templates können dann neue E-Mails erstellt werden. Das Funktioniert natürlich auch über die API.

Als erstes der Code um eine E-Mail Template bei gegebenem Namen zu holen. Nebst dem Namen wird auch noch der TypeCode berücksichtigt. Der TypeCode ist nichts anderes als der Schemaname der Entität, für die das Template erstellt wurde.

private Guid GetTemplateIdByName(string templateName, string templateTypeCode)
{
    var query = new QueryByAttribute("template");
    query.AddAttributeValue("title", templateName);
    query.AddAttributeValue("templatetypecode", templateTypeCode);
    return organizationService.RetrieveMultiple(query).Entities.Single().Id;
}

In einem zweiten Schritt wird vom Template, mit Hilfe des “InstantiateTemplateRequest”, eine neue E-Mail erstellt. Das heisst, es wird ein neuer Record vom der Entity “E-Mail” im Response zurückgegeben. Dieser Record wurde jedoch im CRM erstellt. Der InstantiateTemplateRequest erwartet die folgenden Properties:

  • ObjectI: Die Id des Records für den die E-Mail erstellt werden soll
  • ObjectType: Der Name des Records für den die E-Mail erstellt werden soll
  • TemplateId: Die Id des Templates welches verwendet werden soll
private Email CreateEmailFromTemplate(Entity regardingEntity, string templateName)
{
    var templateId = GetTemplateIdByName(templateName, "contact");

    var request = new InstantiateTemplateRequest
    {
        ObjectId = regardingEntity.Id,
        ObjectType = regardingEntity.LogicalName,
        TemplateId = templateId
    };

    var repsonse = (InstantiateTemplateResponse)organizationService.Execute(request);
    return repsonse.EntityCollection.Entities.Single().ToEntity<Email>();
}

Schlussendlich kann die, vom Template generierte, E-Mail bearbeitet (z.B. Hinzufügen Empfänger) und mit einem “CreateRequest” erstellt werden. Wie ich dieser E-Mail dann ein Attachment hinzufügen und sie schlussendlich versenden kann, zeige ich in meinem Post von nächster Woche.

var email = CreateEmailFromTemplate(myCase, "myTemplate")
email.Id = organizationService.Create(email);

Dynamics CRM API: E-Mail mit attachment versenden

Eine E-Mail mit Attachment versenden. Wie geht das?
Eigentlich ist es ganz einfach. Vorausgesetzt man weiss über das Folgende Bescheid:

  • Attachments sind eine eigene Entität Namens “ActivityMimeAttachment”
  • Attachments werden den E-Mails über eine 1:n Beziehung angehängt
  • Als erstes muss das E-Mail im CRM erstellt werden
  • E-Mail erstellen != E-Mail senden

Im Post von letzter Woche habe ich gezeigt wie sich ein E-Mail von einem Template erstellen lässt. Dieser Post hier baut darauf auf und geht davon aus, dass bereits eine E-Mail im CRM existiert (E-Mail Activity wurde erstellt aber noch nicht gesendet). Nun soll dieser E-Mail Attachment angehängt werden. Schlussendlich soll die E-Mail versendet werden.

  1. Hinzufügen eines Attachments
    Der Code ist simpel und spricht für sich alleine.
private void AddAttachment(Email email, string fileName, string mimeType, byte[] content)
{
    var activityMimeAttachment = new ActivityMimeAttachment
    {
        FileName = fileName,
        Body = Convert.ToBase64String(content),
        MimeType = mimeType,
        ObjectTypeCode = email.EntityLogicalName,
        ObjectId = email.ToEntityReference()
    };

    organizationService.Create(activityMimeAttachment);
}
  1. Senden der E-Mail
private void SendEmail(Guid emailId)
{
    var reqSendEmail = new SendEmailRequest
    {
        EmailId = emailId,
        TrackingToken = string.Empty,
        IssueSend = true
    };

    organizationService.Execute(reqSendEmail);
}

Plug-In auf Close Message eines Incidents – wo ist die Incident Id?

Wird ein Plug-In auf die “Close” Message eines Incidents registriert, wird das Plug-In gefeuert, sobald der Incident geschlossen wird. Die “PrimaryEntityId” des “IPluginExecutionContext” ist jedoch leer (Guid.Empty). Wie erhalte ich die Id des Incidents? Die Id des Incidents, welches die “Close” Message ausgelöst hat erhält man wie folgt:

var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
var incidentResolutionEntity = (Entity)context.InputParameters["IncidentResolution"];
Guid incidentId = ((EntityReference)incidentResolutionEntity.Attributes["incidentid"]).Id;

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

C# – Organisation mit dem Deployment Service erstellen

Seit der Version “CRM 2011” bietet Microsoft Dynamics CRM eine API die es erlaubt die CRM Installation zu managen. Diese API wird “Deployment Service” genannt und als eigener Webservice zur Verfügung gestellt. Dieser Post zeigt wie mit Hilfe dieses Services eine neue Organization erstellt werden kann.

Continue reading

Referenzen auf Records in Workflows/Workflow Activities

Wird in einem Workflow bzw. in einer Workflow Activity auf einen Record einer Entität zugegriffen, muss diese Referenz beim Deployment auf ein anderes System jeweils neu gesetzt werden. Der Grund ist einfach: Die Id’s der Records stimmen nicht überein. Es gibt verschiedene Möglichkeiten wie das gehandelt werden kann. Eine davon zeige ich in diesem Post.
Continue reading

Access is denied beim async Solution Import (ImportSolutionRequest & ExecuteAsyncRequest )

Der Versuch eine Solution “ImportSolutionRequest” mit dem “ExecuteAsyncRequest” zu importieren scheitert mit folgendem Fehler:

“Solution Import Failed: 31 Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Access is denied. Detail: <OrganizationServiceFault xmlns:i=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://schemas.microsoft.com/xrm/2011/Contracts”> <ErrorCode>-2147187707</ErrorCode> <ErrorDetails xmlns:d2p1=”http://schemas.datacontract.org/2004/07/System.Coll
ections.Generic” /> <Message>Access is denied.</Message><Timestamp>2014-08-22T12:31:53.4691706Z</Timestamp>”.

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);