【问题标题】:Calculate duration of project in Dynamics CRM 365在 Dynamics CRM 365 中计算项目的持续时间
【发布时间】:2016-11-08 11:37:31
【问题描述】:

在我们的 Dynamics 365 中,对于每个项目 - 我们都显示 创建日期 日期字段。该字段实质上表示项目的创建日期。

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

和很多地方一样,我们在 Stackoverflow 上都有这些:

  • n 分钟前询问
  • n 天前询问
  • 一周前询问
  • 一个月前问过
  • 等等……

我们想展示:

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

我们如何在 Dynamics CRM 365 中计算项目工期?

Running jobs is not an option for us

【问题讨论】:

    标签: dynamics-crm dynamics-crm-365


    【解决方案1】:

    如果您只需要为显示目的计算的字段,您可以这样做

    1. 创建新字段
    2. 在项目实体的 Post Retrieve 和 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();
        }
    

    证据:

    【讨论】:

      【解决方案2】:

      我假设您只需要在表单上使用它。在数据库中,您显然存储了实际创建的日期。

      这是在 JS 中根据给定的日期时间计算通常在网站上完成的方式。使用像这样的库http://timeago.yarp.com/

      在 CRM 中执行此操作的方式完全相同。 * 创建一个简单的 Web 资源,它从其父级获取 createdon,并使用上面的脚本显示“timeago”。 * 将createdon放在表单上(可以隐藏,没关系)。 * 将网络资源放在表单上。如果您希望它看起来像一个表单字段,请添加一个标签并将其设为 1 行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-12
        • 2020-06-22
        • 2019-02-25
        • 2011-07-30
        • 1970-01-01
        • 2017-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多