Showing posts with label custom actions. Show all posts
Showing posts with label custom actions. Show all posts

Tuesday, September 17, 2013

CRM 2013 – Create Custom Actions

The new version of Microsoft Dynamics CRM includes a feature called Custom Actions. In this post I want to show the process of creating an Action in the CRM UI and access it over a Console Application.

The Problem to solve:

Create a Custom Action, that creates a task or a phonecall for an existing account record, based on the “Industry” Optionset. It should also be possible to add the description of the task in the Request.

1. Create the Custom Action

In this example we create the action in the CRM UI. It is also possible to create it in Code (only OnPremise).

  • Navigate to Settings –> Processes

processes

  • Click “New” and set “CreateSalesActivities” as Process name
  • Set “Action” as Category
  • Select “New blank process”
  • Set “Account” as Entity
  • Click “OK”

action_screen_basic

  • Add the input parameter for Description

action_screen_input

  • Configure Ruleset

rules_for_action 

action_screen_ruleset_call

Accounting –> Create PhoneCall

action_screen_ruleset_task

Others –> Create Task

  • Save the Custom Action
  • Activate the Custom Action

activate_action 

2. Execute the Custom Action

For executing the Request i have created a Console Application. You can check the sources of my PluginQuickDeploy-Project when you need support creating it.

Executing Accounting-Case:

   1: private static void ExecuteCustomActionAccounting()
   2: {
   3:     IOrganizationService service = GenerateService();
   4:     Entity account = new Entity("account");
   5:     account.Attributes.Add(new KeyValuePair<string, object>("name",
   6:         string.Format("Account generated at {0}", DateTime.Now.ToShortTimeString())));
   7:     account.Attributes.Add(new KeyValuePair<string, object>("industrycode", 
   8:         new OptionSetValue(1)));
   9:     Guid accountId = service.Create(account);
  10:  
  11:     OrganizationRequest req = new OrganizationRequest("new_CreateSalesActivities");
  12:     EntityReference accountReference = new EntityReference("account", accountId);
  13:     req.Parameters.Add(new KeyValuePair<string, object>("Target", accountReference));
  14:     req.Parameters.Add(new KeyValuePair<string, object>("Description", "Text from Request"));
  15:  
  16:     OrganizationResponse resp = service.Execute(req);
  17: }

Executing Default-Case:



   1: private static void ExecuteCustomActionDefault()
   2: {
   3:     IOrganizationService service = GenerateService();
   4:     Entity account = new Entity("account");
   5:     account.Attributes.Add(new KeyValuePair<string, object>("name", 
   6:         string.Format("Account generated at {0}", DateTime.Now.ToShortTimeString())));
   7:     Guid accountId = service.Create(account);
   8:  
   9:     OrganizationRequest req = new OrganizationRequest("new_CreateSalesActivities");
  10:     EntityReference accountReference = new EntityReference("account", accountId);
  11:     req.Parameters.Add(new KeyValuePair<string, object>("Target", accountReference));
  12:     req.Parameters.Add(new KeyValuePair<string, object>("Description", "Text from Request"));
  13:  
  14:     OrganizationResponse resp = service.Execute(req);
  15: }


3. Testing


After execution of the both requests, a phonecall is generated and attached to the first account, a task is generated and attached to the second account. The description is passed by the request.


Created Call:


callCreated Task:


 task



Additional Information - Output Parameters


It is also possible to retrieve information from the custom action. Therefore you have to define Output-Parameters and set them in the rule wizard. In this example the Custom Action returns the Entity Reference of the created task.


return_value


assign_value_step


assign_value_rule


responseThe feature is very interesting and i look forward to use it in one of my next projects (lets hope CRM 2013 will be available and stable soon).


cheers

CRM 2013 – Custom Actions

Custom Actions are a feature shipped with CRM 2013. The easiest way to explain the feature (for developers) is:

You are able to create your own OrganizationRequest”

It is possible to use the CRM UI for creating an “Action” or you can write Code that creates a custom Action.

action_category

Key Points (SDK)

  • Is defined using a Workflow entity record, similar to a real-time workflow.
  • Can be associated with a single entity or be global, meaning not associated with any particular entity.
  • Is executed in the core operation stage 30 of the event execution pipeline.
  • Supports the invocation of plug-ins and real-time workflows registered in the pre-operation and post-operation stages of the event execution pipeline.
  • Can have plug-ins or real-time workflows registered in the pre-operation or post-operation stages while the action status is Draft.
  • Is available through the organization.svc and organization.svc/web endpoints, but not the organizationdata.svc (OData) endpoint.
  • Always runs under the security context of the calling user.
  • Record cannot be deleted while there are plug-in steps and other real-time workflows registered on the action.
  • Can be invoked only by a web service method call, not directly from a workflow. However, the workaround is to write a custom workflow activity that invokes the action and add that to a workflow.
  • Can optionally participate in the current database transaction.
  • Does not support a scope where the execution is restricted to a user, business unit, or organization.
  • Supports input and output parameters.
  • Supports auditing of data changes.
  • Is not supported with offline clients.

This feature will reduce plugin code in the future, because it is possible to encapsulate a sequence of operations in one request.

cheers