计算Dynamics CRM 365中项目的持续时间

时间:2016-11-08 11:37:32

标签: dynamics-crm dynamics-crm-365

在我们的Dynamics 365中,对于每个项目 - 我们将显示创建日期日期字段。该字段基本上代表创建项目的日期。

Created On

但是,我们应该显示项目的持续时间。

与许多地方一样,我们在Stackoverflow上有这些:

  • 在n分钟前被问到
  • 前一天被问到
  • 在一周前被问到
  • 在一个月前被问到
  • 等......

我们希望展示:

  • n分钟前创建
  • n天前创建
  • 一周前创建
  • n个月前创建
  • 等......

我们如何计算Dynamics CRM 365中项目的持续时间?

Running jobs is not an option for us

2 个答案:

答案 0 :(得分:1)

如果您只是需要为显示目的而计算的字段,您可以执行类似这样的操作

  1. 创建新字段
  2. 在Post Retrieve和RetrieveMultiple of Project实体上注册新插件
  3. 从下面的代码中复制逻辑,在需要时交换实体/字段名称。
  4. 我的代码正在做的是拦截联系人记录,只要他们要在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();
        }
    

    证据:

    enter image description here enter image description here

答案 1 :(得分:0)

我假设您只需要在表单上使用此功能。在数据库中,您显然可以存储实际创建日期。

如何在网站上正常进行此操作是基于给定的日期时间在JS中计算的。使用像这样的库http://timeago.yarp.com/

你在CRM中如何做到这一点是完全一样的。 *创建一个简单的网络资源,从父母的父母那里获取创建并显示&#34; timeago&#34;使用上面的脚本。 *将创建的内容放在表单上(可以隐藏,不重要)。 *将Web资源放在表单上。如果您希望它看起来像表单字段,请添加标签并将其设为1行。