Plugins 如何编写在相关子网格更新时触发的插件

Plugins 如何编写在相关子网格更新时触发的插件,plugins,dynamics-crm,dynamics-365,Plugins,Dynamics Crm,Dynamics 365,我正在创建一个插件,该插件应该在合同实体的子网格(contractdetail)中添加一条新记录时触发。合同和合同细节(合同行项目)之间存在1-N关系。我只希望在合同实体处于活动状态(statecode==0)时执行插件。。我只是想更新一些记录的基础上,然而,我不能让插件执行的标准,我想要的基础上。以下是我到目前为止的情况: 使用系统; 使用System.Collections.Generic; 使用System.ServiceModel; 使用Microsoft.Xrm.Sdk; 使用Micr

我正在创建一个插件,该插件应该在合同实体的子网格(contractdetail)中添加一条新记录时触发。合同和合同细节(合同行项目)之间存在1-N关系。我只希望在合同实体处于活动状态(statecode==0)时执行插件。。我只是想更新一些记录的基础上,然而,我不能让插件执行的标准,我想要的基础上。以下是我到目前为止的情况:

使用系统;
使用System.Collections.Generic;
使用System.ServiceModel;
使用Microsoft.Xrm.Sdk;
使用Microsoft.Xrm.Sdk.Query;
/// 
///此插件将在合同已开具发票后更新单位订单。
///更新将在alter unit orders上运行。
/// 
名称空间MAGA.Plugins
{
[CrmPluginRegistration(MessageNameEnum.Update,
“合同详情”,
术后分期,
ExecutionModeEnum.Asynchronous,
“收缩”,
“发票后合同”,
1000,
隔离模式枚举沙箱,
Image1Name=“PreImage”,
Image1Type=ImageTypeEnum.PreImage,
Image1Attributes=“”)]
公共类UnitPluginPostInvoice:IPlugin
{
public void Execute(IServiceProvider服务提供程序)
{
//提取跟踪服务以用于调试沙盒插件。
//将注册此插件,因此需要添加与跟踪服务相关的代码。
ITracingService跟踪=(ITracingService)serviceProvider.GetService(类型(ITracingService));
//从服务提供程序获取执行上下文。
IPluginExecutionContext上下文=(IPluginExecutionContext)
GetService(typeof(IPluginExecutionContext));
//InputParameters集合包含消息请求中传递的所有数据。
if(context.InputParameters.Contains(“目标”)&&
context.InputParameters[“Target”]是实体)
{
实体=(实体)上下文。输入参数[“目标”];
实体前图像=context.PreEntityImages[“PreImage”];
if(entity.LogicalName!=“contractdetail”&&entity.GetAttributeValue(“statecode”).Value!=0)
返回;
I组织服务工厂服务工厂=
(IOOrganizationServiceFactory)服务提供者.GetService(类型为(IOOrganizationServiceFactory));
IOOrganizationService=serviceFactory.CreateOrganizationService(context.UserId);
var contracted=entity.GetAttributeValue(“contracted”);
var contract=service.Retrieve(contracd.LogicalName、contracd.Id、new ColumnSet(true));
if(contract.GetAttributeValue(“statecode”).Value!=0)
返回;
尝试
{
//插件代码在这里
}
捕获(FaultException-ex)
{
抛出新的InvalidPluginExecutionException(“发生错误..Phil负责。”,ex);
}
捕获(例外情况除外)
{
Trace.Trace(“发生错误:{0}”,例如ToString());
投掷;
}
}
}
}
}
这是一张供视觉参考的图片


对代码的一些评论:

  • 插件是异步的。除非您正在与web服务通信,否则应切换到同步。它还为用户提供了更好的反馈
  • 事件为Update(MessageNameEnum.Update),仅应在这种情况下创建它
  • 获取合同状态时,请为this:new ColumnSet(“statecode”)更改this:new ColumnSet(true)。true表示返回所有列
  • 在试一试中抓住所有的东西

其余的看起来不错。祝你好运,帮我向菲尔问好。

这根本就没有触发吗?我在文档中没有看到这两个实体的关联消息。另外,我不认为有人可以为非活动合同添加contractdetail,(+)按钮不会显示。不,我只需要在合同开具发票时触发它。它应该更新此处未显示的另一个实体(称为单位订单)中的记录。签订合同时,在开具发票时会为其生成单位订单,但是,以后可以添加合同行(在合同发票之后)。创建新合同行时,需要更新单位订单!我可以在发票后添加合同行。。。上述合同已开具发票。插件应该在添加新合同行时触发。就像我说的,它必须更新另一个名为“单位订单”的实体中的现有记录。我不应该使用更新消息而不是关联,因为关系是1对多?!像往常一样,你是一个救生员!!