如果你只需要顯示的目的計算的領域,你可以做這樣的事情
- 創建新的領域
- 註冊上發佈一個新的插件檢索和工程實體的RetrieveMultiple
- 從下面的代碼複製邏輯,在需要的地方交換實體/字段名稱。
我的代碼正在做的是攔截聯繫人記錄,只要它們在CRM中顯示即可。這意味着在網格,表單,儀表板等等。然後它會計算現場的時差,並用結果填充字段。通過在OutputParameters中填充實體對象,前端可以接收這些值並在適當的位置顯示它們。
這裏唯一的缺點是,因爲這些字段是直接在CRM中計算的,所以您將無法編寫任何SSRS報告,因爲數據未保存到數據庫。如果你要實現這一點,然後對這些字段做一個SQL查詢,你會發現它們都是空的。這些領域只是充當佔位符。(見截圖)
protected void ExecutePreValidateContactRetrieve(LocalPluginContext localContext)
{
if (localContext == null)
{
throw new ArgumentNullException("localContext");
}
IPluginExecutionContext pluginContext = localContext.PluginExecutionContext;
if (pluginContext.OutputParameters.Contains("BusinessEntity"))
{
Entity target = (Entity)pluginContext.OutputParameters["BusinessEntity"];
PopulateKPIs(localContext.OrganizationService, target);
}
else if (pluginContext.OutputParameters.Contains("BusinessEntityCollection"))
{
EntityCollection contacts = (EntityCollection)localContext.PluginExecutionContext.OutputParameters["BusinessEntityCollection"];
foreach (Entity c in contacts.Entities)
PopulateKPIs(localContext.OrganizationService, c);
}
}
public void PopulateKPIs(IOrganizationService orgService, Entity contact)
{
DateTime createdOn;
if (!contact.Contains("createdon"))
createdOn = orgService.Retrieve(contact.LogicalName, contact.Id, new ColumnSet("createdon")).GetAttributeValue<DateTime>("createdon");
else
createdOn = contact.GetAttributeValue<DateTime>("createdon");
TimeSpan diff = DateTime.Now - createdOn;
contact["mst_secondssincecreation"] = Math.Floor(diff.TotalSeconds).ToString();
contact["mst_minutessincecreation"] = Math.Floor(diff.TotalMinutes).ToString();
contact["mst_hourssincecreation"] = Math.Floor(diff.TotalHours).ToString();
}
證據: