0

我正在开发一个 CRM 2011 插件,如果用户停用帐户,该插件会更改帐户实体上的一个字段的值。我花了很多时间想知道出了什么问题,因为每次我停用某个帐户时都会收到以下错误

“错误。发生错误。重试此操作。如果问题仍然存在,请查看 Microsoft Dynamics CRM 社区以获取解决方案或联系您组织的 Microsoft Dynamics CRM 管理员。最后,您可以联系 Microsoft 支持”

但过了一段时间我注意到,即使我的插件出现错误,我的插件实际上也能正常工作。我的代码如下以防万一(请注意,我们将帐户称为客户)

Entity client = (Entity)context.InputParameters["Target"];

OptionSetValue state = (OptionSetValue)client["statecode"];

if (state.Value == 1)
{
    OptionSetValue clientStatus = new OptionSetValue(100000000);
    client["customertypecode"] = clientStatus;                   
    service.Update(client);
}

那么有没有人有任何想法可能导致这个问题?如果我禁用我的插件然后停用任何帐户,它可以完美运行而不会出现任何错误。

我的插件在 Pre-operation 阶段同步注册。

先感谢您!

4

2 回答 2

0

当您的插件订阅SetStateorSetStateDynamicEntity消息时,实体不在IPluginExecutionContext.InputParameters["Target"].
这些消息具有三个 InputParameters:

  • “EntityMoniker”(实体引用)
  • “状态”(选项集值)
  • “状态”(选项集值)

所以没有“目标”。

EntityReference clientRef = context.InputParameters["EntityMoniker"] as EntityReference;
OptionSetValue newStateCode = context.InputParameters["State"] as OptionSetValue;

if (newStateCode.Value == 1)
{
    Entity updateClient = new Entity(clientRef.LogicalName);
    updateClient.Id = clientRef.Id;
    updateClient["customertypecode"] = new OptionSetValue(100000000);

    service.Update(updateClient);
}

当您的插件订阅Update消息时:

由于您处于预操作阶段,并且目标实体是您要更新的实际实体,您为什么要调用service.Update?只需将属性添加到目标实体并完成它......

Entity client = (Entity)context.InputParameters["Target"];

OptionSetValue state = (OptionSetValue)client["statecode"];

if (state.Value == 1)
{
    OptionSetValue clientStatus = new OptionSetValue(100000000);
    client["customertypecode"] = clientStatus;
}
于 2013-08-30T14:34:30.000 回答
0

那么你的插件是在 SetStateDynamic 消息的 Pre-Operation 上注册的吗?而您所要做的就是更新客户类型代码?我的猜测是,由于您没有显示代码,因此您没有从插件上下文中获取 IOrganizationService 。

于 2013-08-30T13:02:37.653 回答