【问题标题】: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】:
如果您只需要为显示目的计算的字段,您可以这样做
- 创建新字段
- 在项目实体的 Post Retrieve 和 RetrieveMultiple 上注册一个新插件
- 从下面的代码中复制逻辑,在需要的地方交换实体/字段名称。
我的代码正在做的是拦截要在 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 行。