【问题标题】:Access ProcessId and StageId in Dynamics CRM Plugin在 Dynamics CRM 插件中访问 ProcessId 和 StageId
【发布时间】:2015-07-29 07:35:41
【问题描述】:

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

它们不会出现在插件注册工具的步骤图像中。如果我可以在其他字段中填充它们,它们甚至不会出现在 CRM 工作流程中。

关于如何实现这一点,有什么好的选择吗?

【问题讨论】:

  • 我的 Dynamics CRM 版本是 CRM 2015 Online。
  • 只是在此处发布的更新 - D365 v9 现在已在 2018 年 10 月版本中弃用了实体中的 StageId、ProcessId 字段。希望这对寻找 BPF 字段信息的人有所帮助。

标签: dynamics-crm


【解决方案1】:

为什么不直接从您的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),然后使用同步工作流填充这些字段strong> 触发流程/阶段更新。

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

【讨论】:

  • 谢谢!我想在插件注册步骤的图像中检索它。我认为那里不可用。
  • 你好,很遗憾,它不可用。如果您仍然对不在插件中进行服务调用感兴趣,我已经用另一种方法更新了我的答案。
【解决方案2】:

您应该能够通过将正确的输入参数传递给此业务流程中的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

【讨论】:

  • 谢谢谢恩!我想要它在插件注册步骤的图像中,因为我已经在使用它了。我想我需要打电话给 CRM。
【解决方案3】:

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

【讨论】:

  • 嗨。谢谢,我期待它可以在插件注册工具步骤的图像中使用。我需要拨打电话检索对 CRM 的呼叫。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多