如何动态修改queueitem视图的过滤条件

时间:2014-03-01 15:24:55

标签: dynamics-crm-2011 dynamics-crm

Simon Hutson在this博客中说“每次访问CRM用户界面中的视图时,都会导致CRM平台通过引发RetrieveMultiple请求来执行查询。拦截拦截此请求可以在CRM平台执行之前修改查询“。

我想拦截插件中的queueitem实体的查看请求并修改它,但问题是PluginRegistration工具中有没有针对queueitem 实体的RetrieveMultiple消息。如何动态修改队列视图的过滤条件?

问题在Henk回复后更新:

我在queueitem实体中创建了一个个人视图。该个人视图中的过滤条件之一基于queueitem实体的自定义字段:

custom_field    Equals    10

我想动态地改变10的值,即当视图加载时。在sitemap的左侧导航区域中单击Queue实体时会加载queueitem实体的视图。

正如Henk建议的那样,我已在预验证步骤中为所有实体的RetrieveMultiple消息注册了一个插件。在该插件中,我使用了Henk提供的代码:

var query = (QueryExpression) context.InputParameters["Query"];

当我点击站点地图左侧导航区域中的队列实体时,我的插件会为实体运行3次:queue,userquery和savedquery。

我在插件中使用 query.EntityName 属性获得了这3个实体名称。 现在问题是我没有在这里获得queueitem实体,这意味着我的插件没有为queueitem执行。由于这个问题,我无法使用下面的代码行来更新queueitem视图的过滤条件:

query.Criteria.AddCondition("custom_field", ConditionOperator.Equal, 500);

如果我试图在插件中为上述任何3个实体运行此代码,即队列,用户查询和保存查询,我得到错误 “Microsoft Dynamics CRM中不存在指定的字段”这对我来说似乎合乎逻辑,因为“custom_field”存在于queueitem实体中,而不存在于这3个实体中的任何一个中。

1 个答案:

答案 0 :(得分:0)

您不必为特定实体注册RetrieveMultiple消息。如果您根本没有指定实体,则会针对发布给Dynamics CRM的任何RetrieveMultiple请求触发插件。

您可以在PreValidation步骤中修改QueryExpression的条件。

在下面的基本示例中,拦截了帐户实体的查询。代码添加了一个条件,强制查询仅返回活动帐户记录。 (请记住,这不是一个完整的解决方案,因为帐户实体也可以是LinkEntity集合的一部分。)

var context = (IPluginExecutionContext) serviceProvider.GetService(typeof (IPluginExecutionContext));

var query = (QueryExpression) context.InputParameters["Query"];

if (query.EntityName != "account")
    return;

if (query.Criteria.FilterOperator == LogicalOperator.Or)
{
    FilterExpression childFilter = query.Criteria;
    query.Criteria = new FilterExpression(LogicalOperator.And);
    query.Criteria.AddFilter(childFilter);
    query.Criteria.AddCondition("statecode", ConditionOperator.Equal, 0);
    return;
}

ConditionExpression condition = query.Criteria.Conditions.FirstOrDefault(c => c.AttributeName == "statecode");

if (condition == null)
{
    query.Criteria.AddCondition("statecode", ConditionOperator.Equal, 0);
    return;
}

condition.Operator = ConditionOperator.Equal;
condition.Values.Clear();
condition.Values.Add(0);
return;

您无需保存QueryExpression或将其替换为InputParameters集合。修改后的查询将简单地在插件执行管道中进一步传递。

RetrieveMultiple&实体队列

我在为RetrieveMultiple消息注册的插件上运行了一些测试,发现没有为实体队列触发事件。因此,虽然上面的代码确实适用于许多实体(包括自定义实体),但似乎我们必须考虑到有关某些内置实体的例外情况。

我还在Execute消息上注册了一个插件(过去曾为FetchXml请求触发),但也没有运气。看来,实体队列中的查询不能在插件中拦截。