Hi Sally,
You will need to create a custom workflow activity. You will need to pass the following parameters: Account, Account Optionset Field Name, Opportunity Account Lookup Field Name, Opportunity Optionset Field Name (You can also replace the Account Optionset Field Name with the actual value).
Below is sample code that should get you the results that you are looking for:
using System;
using System.Activities;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Workflow;
namespace XrmWorkflowTools
{
public class CopyOptionSet : CodeActivity
{
#region Input/Output Parameters
[Input("Account")]
[RequiredArgument]
[ReferenceTarget("account")]
public InArgument<EntityReference> Account { get; set; }
[Input("Account Optionset Field Name")]
[RequiredArgument]
public InArgument<string> AccountFieldName { get; set; }
[Input("Opportunity Account Lookup Field Name")]
[RequiredArgument]
public InArgument<string> OpportunityAccountLookupFieldName { get; set; }
[Input("Opportunity Optionset Field Name")]
[RequiredArgument]
public InArgument<string> OpportunityFieldName { get; set; }
#endregion
protected override void Execute(CodeActivityContext executionContext)
{
// Extract the tracing service
ITracingService tracingService = executionContext.GetExtension<ITracingService>();
try
{
//Create the context
IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
EntityReference refAccount = Account.Get<EntityReference>(executionContext);
string accountFieldName = AccountFieldName.Get<string>(executionContext);
ColumnSet columns = new ColumnSet(new string[] { accountFieldName });
Entity account = service.Retrieve(refAccount.LogicalName, refAccount.Id, columns);
// Validate Field Contains Value
int accountPicklistValue = account.GetAttributeValue<OptionSetValue>(accountFieldName).Value;
string accountLookupFieldName = OpportunityAccountLookupFieldName.Get<string>(executionContext);
EntityCollection opportunities = RetrieveOpportunities(service, refAccount, accountLookupFieldName);
if (opportunities.Entities.Count > 0)
{
string opportunityFieldName = OpportunityFieldName.Get<string>(executionContext);
foreach(Entity opportunity in opportunities.Entities)
{
Guid opportunityId = opportunity.Id;
UpdateOpportunity(service, opportunityId, opportunityFieldName, accountPicklistValue);
}
}
}
catch (FaultException<OrganizationServiceFault> ex)
{
throw new Exception("SBS.Workflow.CopyOptionSet: " + ex.Message);
}
}
private EntityCollection RetrieveOpportunities(IOrganizationService service, EntityReference account, string attributeName)
{
QueryExpression query = new QueryExpression("opportunity")
{
ColumnSet = new ColumnSet("opportunityid"),
Criteria = new FilterExpression(LogicalOperator.And)
{
Conditions =
{
new ConditionExpression(attributeName, ConditionOperator.Equal, account.Id)
}
}
};
try
{
EntityCollection results = service.RetrieveMultiple(query);
return results;
}
catch (FaultException<OrganizationServiceFault> ex)
{
throw new Exception("XrmWorkflowTools.CopyOptionSet.RetrieveOpportunities: " + ex.Message);
}
}
private void UpdateOpportunity(IOrganizationService service, Guid opportunityId, string opportunityFieldName, int accountPicklistValue)
{
Entity opportunity = new Entity("opportunity");
opportunity.Id = opportunityId;
opportunity[opportunityFieldName] = new OptionSetValue(accountPicklistValue);
try
{
service.Update(opportunity);
}
catch (FaultException<OrganizationServiceFault> ex)
{
throw new Exception("XrmWorkflowTools.CopyOptionSet.UpdateOpportunity: " + ex.Message);
}
}
}
}