Here’s a quick snippet on how to get the Status Reason from within a CRM 2011 Plugin. The actual behind the scene name for Status reason is “statuscode”.
Terminology: Status code value is a numeric value in a drop down list (ex: 859760603) Status code label is a text value which corresponds to a numeric value (859760603 = “Active”)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// References you will need
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Metadata;
// I've omitted the namespace and class name due to lots
// of indentation
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context;
IOrganizationService service;
OrganizationServiceContext serviceContext;
// Setup Service Factory
IOrganizationServiceFactory serviceFactory =
serviceProvider.GetService(typeof(IOrganizationServiceFactory)) as
IOrganizationServiceFactory;
// Set context
context = serviceProvider.GetService(typeof(IPluginExecutionContext)) as
IPluginExecutionContext;
// Set Service
service = serviceFactory.CreateOrganizationService(context.UserId);
// Set Service Context
serviceContext = new OrganizationServiceContext(service);
// Create the entity from Target
Entity entity = (Entity)context.InputParameters["Target"];
// Get the numeric value of our current status code
OptionSetValue entityStatusCode =
(OptionSetValue)entity.Attributes["statuscode"];
// Create the attribute request (define which entities attribute
// information we want to get) entity.LogicalName is our current
// name of our entity (ex: contact, account, etc.)
RetrieveAttributeRequest attributeRequest = new RetrieveAttributeRequest
{
EntityLogicalName = entity.LogicalName,
LogicalName = "statuscode",
RetrieveAsIfPublished = true
};
// Execute the request to get the attribute information
RetrieveAttributeResponse attributeResponse =
(RetrieveAttributeResponse)serviceContext.Execute(attributeRequest);
AttributeMetadata attrMetadata =
(AttributeMetadata)attributeResponse.AttributeMetadata;
// Cast the AttributeMetadata to StatusAttribute data
StatusAttributeMetadata statusAttrMetadata =
(StatusAttributeMetadata)attrMetadata;
// Get the status code label by comparing all of the status code values
// possible for the status code drop down list. Once we get a match on
// the value we take the label for that value and assign it to our
// string variable
string statusCodeLabel = "";
// For every status code value within all of our status codes values
// (all of the values in the drop down list)
foreach (StatusOptionMetadata statusMeta in
statusAttrMetadata.OptionSet.Options)
{
// Check to see if our current value matches
if (statusMeta.Value == entityStatusCode.Value)
{
// If our numeric value matches, set the string to our status code
// label
statusCodeLabel = statusMeta.Label.UserLocalizedLabel.Label;
}
}
} // End of Execute method
That should be it.