上一篇 Dynamic CRM 2013學習筆記(十一)利用Javascript實現子表合計(匯總,求和)功能 , 介紹了如何用js來實現子表合計功能,這種方法要求在各個表單上添加js方法,如果有很多實體要實現這個功能,有人覺得有點麻煩了,就不太喜歡這種方式,於是我寫了一個通用的子表合計功能的通用插件,只用在注冊插件時,填寫不同的參數就可以實現這個功能了。
1. 首先看下效果:
2. 注冊方法:
我們需要在子表上對create和update方法進行注冊:
注冊時要填寫4個參數:
第一個參數是要被合計的子表字段,第二個參數是主表的主健,第三個參數是主表實體名,第四個參數是主表上顯示合計值的字段。
注冊update時,要注意把子表里關聯主表的字段,也是主表的主健要加到image里,以方便插件里使用,而且可以加上filter 屬性,只用在這個字段時才觸發這個插件:
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();
是不是很簡潔,大功告成!