上一篇 Dynamic CRM 2013学习笔记(十一)利用Javascript实现子表合计(汇总,求和)功能 , 介绍了如何用js来实现子表合计功能,这种方法要求在各个表单上添加js方法,如果有很多实体要实现这个功能,有人觉得有点麻烦了,就不太喜欢这种方式,于是我写了一个通用的子表合计功能的通用插件,只用在注册插件时,填写不同的参数就可以实现这个功能了。

1. 首先看下效果:

Dynamic CRM 2013学习笔记(十二)实现子表合计(汇总,求和)功能的通用插件-LMLPHP

 

2. 注册方法:

我们需要在子表上对create和update方法进行注册:

Dynamic CRM 2013学习笔记(十二)实现子表合计(汇总,求和)功能的通用插件-LMLPHP

注册时要填写4个参数:

Dynamic CRM 2013学习笔记(十二)实现子表合计(汇总,求和)功能的通用插件-LMLPHP

第一个参数是要被合计的子表字段,第二个参数是主表的主健,第三个参数是主表实体名,第四个参数是主表上显示合计值的字段。

注册update时,要注意把子表里关联主表的字段,也是主表的主健要加到image里,以方便插件里使用,而且可以加上filter 属性,只用在这个字段时才触发这个插件:

Dynamic CRM 2013学习笔记(十二)实现子表合计(汇总,求和)功能的通用插件-LMLPHP

 

3. 实现方法

  • 获取当前实体
  1: Entity entity = (Entity)context.InputParameters["Target"];
  2: Entity preEntity = msg == "update" ? (Entity)context.PreEntityImages["preEntity"] : entity;

 

  • 获取参数
  1: public SumSubgrid(string unsecure)
  2: {
  3:     m_config = unsecure;
  4: }

 

  • 合计获取子表

            使用 OrganizationServiceContext svcContext = new OrganizationServiceContext(adminService) 来读写实体

  1: var ents = svcContext.CreateQuery(entity.LogicalName).Where(e => e[parameters[1]] == preEntity[parameters[1]] && e[parameters[0]] != null).Select(e => e[parameters[0]]);
  2: decimal amount = 0;
  3: foreach (var ent in ents)
  4: {
  5:   amount += Convert.ToDecimal(ent);
  6: }

 

  • 把合计值保存到主表上的合计字段
  1: var primaryEnt = svcContext.CreateQuery(parameters[2]).Where(e => e[parameters[1]] == preEntity[parameters[1]]).FirstOrDefault();
  2: primaryEnt[parameters[3]] = amount;
  3: svcContext.UpdateObject(primaryEnt);
  4: svcContext.SaveChanges();

 

是不是很简洁,大功告成!

 

Dynamic CRM 2013学习笔记 系列汇总

05-03 22:11