RetrieveMultiple消息会在系统加载视图时触发。包括在代码里查询也会触发,所以使用是也要考虑清楚不要影响到其他插件的查询结果。
插件工具注册如下图。是需要注册在触发前,如果触发后好像是没有用的。
在OP环境中,新UCI、经典模式以及高及查找使用的查询类型是不一样的。online还有待验证。
UCI中使用的是FetchExpression 也是fetchXML查询
经典模式和高级查找使用的是QueryExpression。
所以如果要在多个模式同时使用,那就要分类别写逻辑。
有很多情况都可以使用这个消息,看个人需求所用。
以下举一个例子,现在有A、B、C三个表关系如下:
A–B 1:N
B–C 1:N
A–C没有直接关系
需求:需要在A表子网格里显示C表中和A表有关系的B表记录的所有C表记录。
处理方法,C表建立和A表的关系。在C表中加入了一个A表的查询字段。这个字段无需赋值,是为了配置视图。在子网格视图中选择仅关联记录。
这样就能顺利的触发我们的插件,之后就可以在插件里搞事情了。
var Query = context.InputParameters["Query"];
if (Query.GetType() == typeof(FetchExpression))
{
FetchExpression fetchXml = Query as FetchExpression;
//读取XML
XmlDocument XmlDo = new XmlDocument();
XmlDo.LoadXml(fetchXml.Query);
//获取link-entity节点
XmlNodeList Xmlnl = XmlDo.GetElementsByTagName("link-entity");
//加入你要处理的逻辑,比如修改filter或者删除节点。处理过滤器。
//如果按我上面的逻辑在XML中就会返回触发视图的A表ID,通过ID查询到关联B表记录ID就修改掉filter条件就可以在A表显示C表数据
//更新XML
fetchXml.Query = XmlDo.InnerXml;
context.InputParameters["Query"] = fetchXml;
}
else
{
QueryExpression queryExpression = Query as QueryExpression;
//获取筛选条件
FilterExpression filterExpression = queryExpression.Criteria;
if (filterExpression.Conditions.Count == 2)
{
foreach (ConditionExpression item in filterExpression.Conditions)
{
//加入你要处理的逻辑,比如修改filter或者删除节点。处理过滤器。
//这个相对XML要容易改一些,可以直接将filter值修改掉,同样也可以做增删改。
}
queryExpression.Criteria = filterExpression;
context.InputParameters["Query"] = queryExpression;
}
}