Dynamics crm 在Dynamics CRM 365中计算项目的工期

Dynamics crm 在Dynamics CRM 365中计算项目的工期,dynamics-crm,dynamics-crm-365,Dynamics Crm,Dynamics Crm 365,在Dynamics 365中,对于每个项目,我们将显示在日期字段上创建的日期字段。此字段基本上表示项目创建的日期 然而,我们应该显示项目的持续时间 像在许多地方一样,我们在Stackoverflow上有以下功能: n分钟前问 一天前问 一周前问 一个月前问 等等 我们想展示: n分钟前创建的 创建于n天前 创建于n周前 创建于n个月前 等等 我们如何计算Dynamics CRM 365中的项目持续时间 如果您只需要为显示目的而计算的字段,您可以执行以下操作 创建新字段 在项目实体的Po

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

然而,我们应该显示项目的持续时间

像在许多地方一样,我们在Stackoverflow上有以下功能:

  • n分钟前问
  • 一天前问
  • 一周前问
  • 一个月前问
  • 等等
我们想展示:

  • n分钟前创建的
  • 创建于n天前
  • 创建于n周前
  • 创建于n个月前
  • 等等
我们如何计算Dynamics CRM 365中的项目持续时间


如果您只需要为显示目的而计算的字段,您可以执行以下操作

  • 创建新字段
  • 在项目实体的Post Retrieve和RetrieveMultiple上注册一个新插件
  • 从下面的代码复制逻辑,必要时交换实体/字段名称
  • 我的代码所做的是在CRM中显示联系人记录时拦截这些记录。这意味着在网格、表单、仪表板等中,它将计算现场的时差,并用结果填充字段。然后,通过在OutputParameters中填充实体对象,前端接收这些值,并可以在适当的位置显示它们

    这里唯一的缺点是,由于这些字段是直接在CRM中计算的,因此您将无法编写任何SSRS报告,因为数据不会持久化到数据库中。如果要实现这一点,然后对这些字段执行SQL查询,您会发现它们都为空。这些字段仅充当占位符。(见截图)

    protectedvoid ExecutePreValidateContactRetrieve(localpluginontext localContext)
    {
    if(localContext==null)
    {
    抛出新ArgumentNullException(“localContext”);
    }
    IPluginExecutionContext pluginContext=localContext.PluginExecutionContext;
    if(pluginContext.OutputParameters.Contains(“BusinessEntity”))
    {
    实体目标=(实体)pluginContext.OutputParameters[“BusinessEntity”];
    PopulateKPIs(localContext.OrganizationService,target);
    }
    else if(pluginText.OutputParameters.Contains(“BusinessEntityCollection”))
    {
    EntityCollection联系人=(EntityCollection)localContext.PluginExecutionContext.OutputParameters[“BusinessEntityCollection”];
    foreach(contacts.Entities中的实体c)
    PopulateKPIs(localContext.OrganizationService,c);
    }
    }
    公共无效PopulateKPIs(IOR组织服务或服务、实体联系人)
    {
    DateTime createdOn;
    如果(!contact.Contains(“createdon”))
    createdOn=orgService.Retrieve(contact.LogicalName,contact.Id,新列集(“createdOn”)).GetAttributeValue(“createdOn”);
    其他的
    createdOn=contact.GetAttributeValue(“createdOn”);
    TimeSpan diff=DateTime.Now-createdOn;
    联系人[“mst_secondssincecreation”]=数学地板(diff.TotalSeconds.ToString();
    联系人[“mst_minutessincecreation”]=数学楼层(diff.TotalMinutes.ToString();
    联系[“mst_hourssincecreation”]=数学楼层(差异总小时数).ToString();
    }
    
    证据:


    我想您只需要在表单上填写这个。在数据库中,您显然存储了实际创建的日期

    在网站上通常是如何做到这一点的,是在JS中根据给定的日期和时间进行计算的。使用像这样的库

    您在CRM中如何做到这一点完全相同。 *创建一个简单的web资源,它从其父级获取createdon并使用上面的脚本显示“timeago”。 *将createdon放在表单上(可以隐藏,无所谓)。 *将web资源放在表单上。如果希望标签看起来像表单字段,请添加标签并将其设为1行

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