This is an accompanying blog post to my YouTube video Dynamics 365 Customer Engagement Deep Dive: Creating a Basic Custom Workflow Assembly. The video is part of my tutorial series on how to accomplish developer focused tasks within Dynamics 365 Customer Engagement. You can watch the video in full below:
Below you will find links to access some of the resources discussed as part of the video and to further reading topics:
Full Code Sample
using System;
using System.Activities;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;
using Microsoft.Xrm.Sdk.Query;
namespace D365.SampleCWA
{
public class CWA_CopyQuote : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
IWorkflowContext c = context.GetExtension<IWorkflowContext>();
IOrganizationServiceFactory serviceFactory = context.GetExtension<IOrganizationServiceFactory>();
IOrganizationService service = serviceFactory.CreateOrganizationService(c.UserId);
ITracingService tracing = context.GetExtension<ITracingService>();
tracing.Trace("Tracing implemented successfully!", new Object());
Guid quoteID = c.PrimaryEntityId;
Entity quote = service.Retrieve("quote", quoteID, new ColumnSet("freightamount", "discountamount", "discountpercentage", "name", "pricelevelid", "customerid", "description"));
quote.Id = Guid.Empty;
quote.Attributes.Remove("quoteid");
quote.Attributes["name"] = "Copy of " + quote.GetAttributeValue<string>("name");
Guid newQuoteID = service.Create(quote);
EntityCollection quoteProducts = RetrieveRelatedQuoteProducts(service, quoteID);
EntityCollection notes = RetrieveRelatedNotes(service, quoteID);
tracing.Trace(quoteProducts.TotalRecordCount.ToString() + " Quote Product records returned.", new Object());
foreach (Entity product in quoteProducts.Entities)
{
product.Id = Guid.Empty;
product.Attributes.Remove("quotedetailid");
product.Attributes["quoteid"] = new EntityReference("quote", newQuoteID);
service.Create(product);
}
foreach (Entity note in notes.Entities)
{
note.Id = Guid.Empty;
note.Attributes.Remove("annotationid");
note.Attributes["objectid"] = new EntityReference("quote", newQuoteID);
service.Create(note);
}
}
[Input("Quote Record to Copy")]
[ReferenceTarget("quote")]
public InArgument<EntityReference> QuoteReference { get; set; }
private static EntityCollection RetrieveRelatedQuoteProducts(IOrganizationService service, Guid quoteID)
{
QueryExpression query = new QueryExpression("quotedetail");
query.ColumnSet.AllColumns = true;
query.Criteria.AddCondition("quoteid", ConditionOperator.Equal, quoteID);
query.PageInfo.ReturnTotalRecordCount = true;
return service.RetrieveMultiple(query);
}
private static EntityCollection RetrieveRelatedNotes(IOrganizationService service, Guid objectID)
{
QueryExpression query = new QueryExpression("annotation");
query.ColumnSet.AllColumns = true;
query.Criteria.AddCondition("objectid", ConditionOperator.Equal, objectID);
query.PageInfo.ReturnTotalRecordCount = true;
return service.RetrieveMultiple(query);
}
}
}
Download/Resource Links
Visual Studio 2017 Community Edition
Setup a free 30 day trial of Dynamics 365 Customer Engagement
Source Code Management Solutions
- Visual Studio Team Services - Free for up to 5 users and my recommended choice when working with Dynamics 365 Customer Engagement
- BitBucket
- GitHub
Further Reading
Microsoft Docs - Create a custom workflow activity
MSDN - Register and use a custom workflow activity assembly
MSDN - Update a custom workflow activity using assembly versioning (This topic wasn’t covered as part of the video, but I would recommend reading this article if you are developing an ISV solution involving custom workflow assemblies)
MSDN - Sample: Create a custom workflow activity
You can also check out some of my previous blog posts relating to Workflows:
- Implementing Tracing in your CRM Plug-ins - We saw as part of the video how to utilise tracing, but this post goes into more detail about the subject, as well as providing instructions on how to enable the feature within the application (in case you are wondering why nothing is being written to the trace log 🙂 ). All code examples are for Plug-ins, but they can easily be repurposed to work with a custom workflow assembly instead.
- Obtaining the User who executed a Workflow in Dynamics 365 for Customer Engagement (C# Workflow Activity) - You may have a requirement to trigger certain actions within the application, based on the user who executed a Workflow. This post walks through how to achieve this utilising a custom workflow assembly.
If you have found the above video useful and are itching to learn more about Dynamics 365 Customer Engagement development, then be sure to take a look at my previous videos/blog posts using the links below:
- Dynamics 365 Customer Engagement Deep Dive: Creating a Basic Plug-in
- Dynamics 365 Customer Engagement Deep Dive: Creating a Basic Jscript Form Function
Have a question or an issue when working through the code samples? Be sure to leave a comment below or contact me directly, and I will do my best to help. Thanks for reading and watching!