是否存在可以在运行FetchXML(甚至SQL)报告时注册插件的事件?
RetrieveMultiple和Retrieve不会被解雇!
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
// The FetchXML report does not fire the plugin on RetrieveMultiple
if (context.InputParameters["Query"] is FetchExpression)
{
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = factory.CreateOrganizationService(context.UserId);
using (Context linq = new Context(service))
{
// Do the work.
}
}
}
2 回答
我有同样的问题,解决方案如下:
更多相关信息:https://crmbusiness.wordpress.com/2014/11/25/fetchxml-reports-do-not-trigger-retrievemultiple-plugins-in-crm-2011/
我有类似的需求在运行报告时执行操作,并且通过触发报告通过Javascript运行,我可以找到最好的[支持]方式来实现此目的 .
粗糙的过程是这样的:
在适用的实体中,创建功能区按钮以通过Javascript启动报告 . (这篇文章给出了一个方法:Trigger a report from a ribbon button)
作为运行报告的Javascript函数的一部分,在报告运行代码之前更新相应记录中的字段(例如"new_ReportRunOn")(标准REST更新操作在此处可用) . 这里的想法只是运行报告将始终导致"new_ReportRunOn"字段首先更新 .
通过仅应用过滤器"new_ReportRunOn"字段,让您的插件监听此字段的更改 . (或者,您可以让您的逻辑在Javascript中运行[作为第2步],而不是更新字段只是为了触发插件 . )
但这并非没有缺点:
您需要"hide" CRM报告部分中的报告,因此它基本上只能通过实体表单访问 . 如果用户选择在报告部分中浏览"All Reports",它仍会在“报告”部分中显示 . 如果"savy"用户以这种方式启动报告,那么它将绕过激活插件的Javascript代码 .
如果报告可以跨多个记录运行(例如,用户从实体网格视图中选择适用的记录),则需要进行其他考虑/编码 . 可以处理这种情况,但根据您的问题,它似乎不是用例 .
在2013年的安装中,我已经有类似的工作了一段时间,它实际上运行得很好 . 这不是理想的,但完成工作 .