2016-11-08 33 views
1

在我們的Dynamics 365中,對於每個項目 - 我們顯示創建日期字段爲。該字段實質上表示項目創建的日期。計算Dynamics CRM 365中項目的持續時間

Created On

然而,我們應該表現出項目的持續時間。

像在許多地方,我們這些#2:

  • 問ň分鐘前
  • 問在n天前
  • 問ň一週前
  • 問ň一個月前
  • 和等等...

我們想顯示:

  • 生成的N分鐘前
  • 生成的N天前
  • 生成的N個星期前
  • 生成的N個月前
  • 等等...

如何計算Dynamics CRM 365項目的持續時間?

Running jobs is not an option for us

回答

1

如果你只需要顯示的目的計算的領域,你可以做這樣的事情

  1. 創建新的領域
  2. 註冊上發佈一個新的插件檢索和工程實體的RetrieveMultiple
  3. 從下面的代碼複製邏輯,在需要的地方交換實體/字段名稱。

我的代碼正在做的是攔截聯繫人記錄,只要它們在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(); 
    } 

證據:

enter image description here enter image description here

0

我假設你只需要這樣的形式。在數據庫中,您明顯存儲了實際創建的日期。

這是如何通常在網站上完成計算在JS中,基於給定的日期時間。使用像這樣的庫http://timeago.yarp.com/

你在CRM中如何做到這一點是完全一樣的。 *創建一個簡單的網絡資源,該資源從其父節點獲取createdon,並使用上面的腳本顯示「timeago」。 *把createdon放在窗體上(可以隱藏,無所謂)。 *將網頁資源放在表單上。如果您希望它看起來像一個表單域,請添加一個標籤並將其設置爲1行。