【问题标题】:Dynamics CRM 2016 Changing state attributes is not allowed in create stage 20 pluginsDynamics CRM 2016 在创建阶段 20 插件中不允许更改状态属性
【发布时间】:2015-11-24 06:48:38
【问题描述】:

我正在使用 Dynamics CRM 2016 Sandbox Org。在操作前事件管道中设置状态码和状态码值时出现此错误。 “在创建阶段 20 插件中不允许更改状态属性。”

由于某些业务需求,我无法更新我的插件以进行后期操作。它在 CRM 2015,2013 中运行良好。

【问题讨论】:

  • 我正在尝试创建自定义实体
  • 你只是通过改变属性来设置状态/状态吗?
  • 我正在设置这样的实体["statuscode"] = new OptionSetValue(1)
  • 您真的能够在 CRM 2015/2013 中做到这一点吗?在这方面我并没有真正挑战你,因为我认为我不必创建状态为 X 的记录,而是将它们更新为状态 X,并且你必须使用 SetStatusRequest。只是出于好奇,阻止您在后期使用 setstatusrequest 更新创建的对象的业务要求是什么?
  • 是的,它在 CRM 2013/2015 中运行良好,但在 CRM 2016 沙盒组织中无法运行。

标签: c# dynamics-crm


【解决方案1】:

要设置 Pre-Create 事件的状态和状态,您可以使用下面的代码。我已经在 Pre-Validation 阶段对 CRM 2015 上的 SalesOrder 实体进行了测试。创建新订单时,它将销售订单状态直接设置为待处理。

您必须确保设置正确的状态和状态值组合。

                Int32 statusVal = 2;
                Int32 stateVal = 0;

                if (((Entity)context.InputParameters["Target"]).Contains("statuscode"))
                {
                    ((Entity)context.InputParameters["Target"])["statuscode"] = new OptionSetValue(statusVal);
                }
                else {
                    ((Entity)context.InputParameters["Target"]).Attributes.Add("statuscode", new OptionSetValue(statusVal));
                }

                if (((Entity)context.InputParameters["Target"]).Contains("statecode"))
                {
                    ((Entity)context.InputParameters["Target"])["statecode"] = new OptionSetValue(stateVal);
                }
                else
                {
                    ((Entity)context.InputParameters["Target"]).Attributes.Add("statecode", new OptionSetValue(stateVal));
                }

...

如果您想使用具有实体 ID 的 Post Create 事件,您可以尝试使用 SetStateRequest

确保您拥有状态和状态值的有效组合。

public static void SetStatusOfObject(IOrganizationService service, string entityName, Guid entityId, int state, int status)
    {
        SetStateRequest updateStatus = new SetStateRequest();
        updateStatus.EntityMoniker = new EntityReference(entityName, entityId);
        updateStatus.State = new OptionSetValue(state);
        updateStatus.Status = new OptionSetValue(status);
        service.Execute(updateStatus);
    }

【讨论】:

  • 在预创建中你没有 entityId,我认为在新的 crm 版本中你可以通过更新来做到这一点。
  • 您在预创建中是正确的,这将不起作用,感谢您的更正。我将介绍一些关于预创建的内容。
  • 还有一点,约束应该是针对目标的,而不是针对状态或状态的,因为您没有使用状态值,您只是在设置数据:)。 if (context.InputParameters.Contains("Target") & context.InputParameters["Target"] is Entity)
  • 我的意思是检查不是必需的,因为如果我有一个实体,我可以使用entity["state"] = valueentity["status"] = value 设置状态和状态,你不需要询问包含state 或 status 因为那最终是一个 DataCollection。
  • 您不应该使用 SetStateRequest,因为它已被弃用。您应该在术后阶段使用常规更新请求。
猜你喜欢
  • 1970-01-01
  • 2019-03-03
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多