访问Dynamics CRM插件中的ProcessId和StageId

时间:2015-07-29 07:35:42

标签: dynamics-crm

我在Campaign上编写了一个使用业务流程的插件。 ProcessId和StageId字段,由Campaign实体中的业务流程流创建。我需要为我的插件中的记录检索这些值。

它们不会出现在插件注册工具的步骤图像中。它们甚至没有出现在CRM工作流程中,我可以将它们填充到其他领域。

对于如何实现这一目标,还有一个很好的选择吗?

3 个答案:

答案 0 :(得分:2)

为什么不从您的IServiceProvider获取服务,并检索字段?

public void Execute(IServiceProvider serviceProvider)
{
    IPluginExecutionContext context = CommonPluginLibrary.GetContextFromIServiceProvider(serviceProvider);
    IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
    IOrganizationService service = factory.CreateOrganizationService(context.UserId);

    Entity campaign = service.Retrieve(context.PrimaryEntityId, context.PrimaryEntityName, new ColumnSet("processid", "stageid"));

    // ...
    // Do your stuff with campaign["processid"], campaign["stageid"]
    // ...
}

另一种方法是为stageidprocessid创建两个 shadow 字段(例如new_stageidnew_processid),并使用这些字段填充这些字段同步工作流程,可在流程/阶段更新时触发。

然后,您可以在这些 shadow 字段中注册您的插件,因为它们将是您实体的自定义属性。

答案 1 :(得分:0)

要访问进程和阶段ID,您可以使用记录的processid和stageid字段。我很确定你可以通过图像或通过直接读取记录来获取它。此外,您可以重新检查以下文章: https://deepakexploring.wordpress.com/tag/updating-process-id-in-crm-2013/

答案 2 :(得分:0)

您应该能够通过将正确的输入参数传递给此业务流程中的workflow activity来检索此内容。

1)如果您有这些字符串输入:

[RequiredArgument]
[Input("Process Name")]
public InArgument Process { get; set; }

[RequiredArgument]
[Input("Process Stage Name")]
public InArgument ProcessStage { get; set; }

2)执行代码Get Process

using (var _context= new OrganizationServiceContext(service))
{   
   // Get the processid using the name provided
   var process = (from p in _context.CreateQuery()
                  where
                  p.Name == Process.Get(executionContext)
                  &&
                  p.StateCode == WorkflowState.Activated
                  select new Workflow
                  {WorkflowId = p.WorkflowId}
                 ).FirstOrDefault();
   if (process==null)
       throw new InvalidPluginExecutionException(string.Format("Process '{0}' not found",Process.Get(executionContext)));

使用提供的名称获取stage id

var stage = (from s in _context.CreateQuery()
             where
             s.StageName == ProcessStage.Get(executionContext)
             &&
             s.ProcessId.Id == process.WorkflowId
             select new ProcessStage
             {ProcessStageId = s.ProcessStageId}
            ).FirstOrDefault();
if (stage == null)
    throw new InvalidPluginExecutionException(string.Format("Stage '{0}' not found", Process.Get(executionContext)));

您现在可以Change Update检索您的值...

Entity uStage = new Entity(context.PrimaryEntityName);
uStage.Id = context.PrimaryEntityId;      //
uStage["stageid"] = stage.ProcessStageId; //retrieved stage 
uStage["processid"] = process.WorkflowId; //process id