1

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

创建于

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

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

  • n 分钟前提问
  • 前 n 天问过
  • n 周前询问
  • n 个月前问过
  • 等等...

我们想展示:

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

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

运行作业不是我们的选择

4

2 回答 2

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();
    }

证据:

在此处输入图像描述 在此处输入图像描述

于 2016-11-09T11:57:19.803 回答
0

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

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

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

于 2017-02-15T11:15:02.330 回答