Если вам просто нужны поля, рассчитанные для целей отображения вы могли бы сделать что-то вроде этого
- Создать новых полей
- Зарегистрировать новый плагин на сообщение Получить и RetrieveMultiple Проектного объекта
- Скопируйте логику из приведенного ниже кода, заменив имена объектов и полей там, где это необходимо.
Что мой код делает, это перехватывать записи контактов, когда они должны отображаться в CRM. Это означает, что в сетках, формах, панелях мониторинга и т. Д. Затем вычисляется разница во времени на месте и заполняется поля результатом. Затем заполняя объект сущности в OutputParameters, передний конец получает эти значения и может отображать их там, где это необходимо.
Единственным недостатком является то, что, поскольку эти поля вычисляются непосредственно в CRM, вы не сможете писать отчеты SSRS, поскольку данные не сохраняются в базе данных. Если вы должны были реализовать это, а затем пойти SQL-запрос с этими полями, вы найдете их все null. Эти поля просто действуют как заполнители.(См скриншоты)
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();
}
Evidence:
