是否有一个插件可以在FetchXML(甚至SQL)报告运行时注册的事件?
retrievmultiple和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.
}
}
}
我有同样的问题,解决方案如下:
报表不触发插件。SQL报表完全绕过CRM,并且获取报告也绕过了插件管道
更多信息请访问:https://crmbusiness.wordpress.com/2014/11/25/fetchxml-reports-do-not-trigger-retrievemultiple-plugins-in-crm-2011/
我也有类似的需求,在报告运行时执行操作,我能找到的最好的[支持的]方式是通过Javascript触发报告运行。
大致流程如下:
- 在适用的实体中,创建ribbon按钮以通过Javascript启动报告。(这篇文章给出了如何:从ribbon按钮触发报告)
- 作为运行报告的Javascript函数的一部分,更新一个字段(例如:"new_ReportRunOn"),在报告运行代码之前在各自的记录中(这里可以使用标准的REST更新操作)。这里的想法是简单地运行报告将总是导致"new_ReportRunOn"字段首先更新。
- 让你的插件通过只对"new_ReportRunOn"字段应用过滤器来监听该字段的变化。(或者,你可以让你的逻辑在Javascript中运行[作为第2步],而不是更新字段来触发插件。)
这也不是没有缺点:
- 您需要在CRM Reports部分中"隐藏"报告,因此它基本上只能通过实体表单访问。如果用户选择在报告部分中浏览"所有报告",它仍然可以在报告部分中看到。如果一个"精明"的用户以这种方式启动报告,那么它将绕过触发插件的Javascript代码。
- 如果报告可以跨多个记录运行(例如,用户从实体网格视图中选择适用的记录),则需要做额外的考虑/编码。处理这种情况是可能的,但根据你的问题,这似乎不是用例。
我在2013年的安装中有过类似的过程,它实际上工作得很好。这并不理想,但可以完成工作。