2016-11-08 2 views
1

В нашей Dynamics 365 для каждого проекта - показано значение Дата создания дата. Это поле по существу представляет дату создания проекта.Вычислить продолжительность проекта в Dynamics CRM 365

Created On

Однако, мы должны показать, продолжительность проекта.

Как во многих местах, у нас есть это на Stackoverflow:

  • Задаваемые п минут назад
  • Задаваемые п день назад
  • Задаваемые п неделю назад
  • Задаваемые н месяц назад
  • и и так далее ...

Мы хотели бы показать:

  • Создано п минут назад
  • Создано п дней назад
  • Создано п неделю назад
  • Создано н месяц назад
  • и так далее ...

Как рассчитать продолжительность проекта в Dynamics CRM 365?

Running jobs is not an option for us

ответ

1

Если вам просто нужны поля, рассчитанные для целей отображения вы могли бы сделать что-то вроде этого

  1. Создать новых полей
  2. Зарегистрировать новый плагин на сообщение Получить и RetrieveMultiple Проектного объекта
  3. Скопируйте логику из приведенного ниже кода, заменив имена объектов и полей там, где это необходимо.

Что мой код делает, это перехватывать записи контактов, когда они должны отображаться в 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:

enter image description here enter image description here

0

Я предполагаю, что вам нужно только это в форме. В БД вы, очевидно, сохраняете фактическую дату создания.

Как это обычно делается на веб-сайтах, рассчитывается в JS на основе заданного времени. Использование этой библиотеки http://timeago.yarp.com/

Как вы это делаете в CRM, это точно так же. * Создайте простой веб-ресурс, который берет созданный из его родителя и отображает «timeago», используя сценарий выше. * Поместите созданный на форму (может быть скрыт, не имеет значения). * Поместите веб-ресурс в форму. Добавьте метку и сделайте ее 1 строку, если вы хотите, чтобы она выглядела как поле формы.

Смежные вопросы