Если вам просто нужны поля, рассчитанные для целей отображения, вы можете сделать что-то вроде этого
- Создайте свои новые поля
- Зарегистрируйте новый плагин для Post Retrieve и RetrieveMultiple объекта Project
- Скопируйте логику из приведенного ниже кода, поменяв местами имена сущностей / полей там, где это необходимо.
Мой код перехватывает записи контактов всякий раз, когда они должны отображаться в 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();
}
Свидетельство:
person
Mark T
schedule
09.11.2016