Microsoft Dynamics 365 Customer Relationship Management (CRM) provides powerful tools for managing customer data, automating business processes, and building custom solutions. One essential aspect of CRM development is retrieving records and their related data. In this article, we’ll explore how to achieve this using CRM plugins.
Understanding CRM Plugins
Before diving into record retrieval, let’s briefly discuss CRM plugins. A plugin is a custom code component that runs in response to specific events within the CRM system. These events can be triggered by user actions (such as creating or updating records) or system events (such as record deletion).
Plugins allow developers to extend CRM functionality by adding custom business logic. When it comes to retrieving records, plugins are a valuable tool.
Retrieving Records
To retrieve records from CRM, we’ll focus on using C# code within a plugin. Here are the steps:
- Create a New Plugin:
- In your CRM solution, create a new plugin assembly.
- Define the plugin steps (events) that will trigger your code execution (e.g., “Pre-Create,” “Post-Update,” etc.).
- Connect to CRM Service:
- Inside your plugin code, establish a connection to the CRM service using the
IOrganizationService
interface. - You can use the
ServiceClient
class to authenticate and connect.
- Inside your plugin code, establish a connection to the CRM service using the
- Query Records:
- Use the
QueryExpression
class to construct your query. - Specify the entity name, columns to retrieve, and any filtering conditions.
- An example query to retrieve all active accounts
- Use the
var query = new QueryExpression("account")
{
ColumnSet = new ColumnSet("name", "accountnumber"),
Criteria = new FilterExpression
{
Conditions =
{
new ConditionExpression("statecode", ConditionOperator.Equal, 0) // Active records
}
}
};
4. Execute the Query:
- Use the
RetrieveMultiple
method to execute your query and retrieve records. - Process the results as needed (e.g., display, manipulate, or perform additional actions).
Retrieving Related Data
Now let’s explore how to retrieve related data (associated records):
- Identify the Relationship:
- Determine the relationship between the main entity (e.g., account) and the related entity (e.g., contact, opportunity, etc.).
- You can find relationship names in the CRM customization area.
- Query Related Records:
- Construct a query similar to the one above but include the relationship information.
- Let’s consider a scenario where we need to retrieve the details of an account and its related contacts whenever a new opportunity record is created. We’ll implement a plugin that hooks into the
Create
message of the opportunity entity to achieve this functionality.
using Microsoft.Xrm.Sdk;
using System;
namespace RetrieveDataPlugin
{
public class RetrieveDataPlugin : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
// Retrieve the execution context
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
// Check if the plugin is triggered by the Create message of the Opportunity entity
if (context.MessageName.ToLower() == "create" && context.PrimaryEntityName.ToLower() == "opportunity")
{
// Retrieve the newly created opportunity record
Entity opportunity = (Entity)context.InputParameters["Target"];
// Retrieve the account associated with the opportunity
Guid accountId = ((EntityReference)opportunity.Attributes["customerid"]).Id;
// Retrieve account details
Entity account = RetrieveAccountDetails(serviceProvider, accountId);
// Retrieve related contacts
EntityCollection contacts = RetrieveRelatedContacts(serviceProvider, accountId);
// Process retrieved data (e.g., logging, further operations)
ProcessRetrievedData(account, contacts);
}
}
private Entity RetrieveAccountDetails(IServiceProvider serviceProvider, Guid accountId)
{
// Implement logic to retrieve account details
// Example:
// IOrganizationService service = (IOrganizationService)serviceProvider.GetService(typeof(IOrganizationService));
// return service.Retrieve("account", accountId, new ColumnSet("name", "email"));
throw new NotImplementedException();
}
private EntityCollection RetrieveRelatedContacts(IServiceProvider serviceProvider, Guid accountId)
{
// Implement logic to retrieve related contacts
// Example:
// IOrganizationService service = (IOrganizationService)serviceProvider.GetService(typeof(IOrganizationService));
// QueryExpression query = new QueryExpression("contact");
// query.Criteria.AddCondition("parentcustomerid", ConditionOperator.Equal, accountId);
// return service.RetrieveMultiple(query);
throw new NotImplementedException();
}
private void ProcessRetrievedData(Entity account, EntityCollection contacts)
{
// Implement logic to process retrieved data
// Example:
// Log account and contact details, perform additional operations, etc.
}
}
}
Retrieving records and related data in Microsoft Dynamics 365 CRM plugins is essential for building robust solutions. By understanding the basics and leveraging the CRM SDK, you can create efficient and effective code to meet your business needs.