在动态CRM中分解日期



我被要求使业务用户能够将许多实体上的日期字段子集分解为年、月和日的字符串字段。Dynamics似乎没有开箱即用的功能。

我想使用计算字段添加它。最吸引人的方法是扩展计算字段表达式中可用的函数列表,并公开调用 DateTime.ToString 或其好友之一的函数。找不到有关该主题的文档。这可能或支持吗?

在没有这种可能性的情况下,有没有人对如何完成分解有好的想法?除了编写插件...


注意:我知道由于日期文化和演示问题,这可能是一个坏主意。但这是企业想要的,唯一的选择是开发最不糟糕的解决方案。

您可以考虑安装Dynamics-365-Workflow-Tools。

安装后,您可以创建一个工作流,以便在任何给定的 DateTime 字段更新时运行。

工作流将涉及一个步骤,该步骤使用工作流工具中的"日期函数"步骤。此步骤接受两个 DateTime 参数(尽管可以选择一个(并计算多个输出值,即针对你的方案:

最后一个工作流步骤将根据需要将分解的实体字段设置为三个输出值之一。

为了回答我自己的问题,计算字段的函数列表似乎无法扩展。计算字段表达式"编译"为标量值函数,这些函数由基础表上的计算列表达式调用。这些 SQL 函数由Microsoft.Crm.CalculatedField.dll中的代码生成。

在不深入太多细节的情况下,表达式函数列表似乎与Microsoft.Crm.dll中的Microsoft.Crm.Workflow.Activities.ExpressionOperator枚举相关联。绑定到该枚举表示列表是硬编码的。

对于那些需要的解决方案不包括Dynamics-365-Workflow-Tools中包含的所有附加功能的人,这里有一个:

public class DateFormatter : CodeActivity
{
public const string DEFAULT_LOCALE = "en-us";
[Input("Date")]
[RequiredArgument]
public InArgument<DateTime> Date
{
get;
set;
}
[Input("Locale")]
[Default(DEFAULT_LOCALE)]
public InArgument<string> Locale
{
get;
set;
}
[Input("Format")]
public InArgument<string> Format
{
get;
set;
}
[Output("Formatted Date")]
public OutArgument<string> DateAsString
{
get;
set;
}
protected override void Execute(CodeActivityContext context)
{
DateTime? date = this.Date.Get(context);
string locale = this.Locale.Get(context);
string format = this.Format.Get(context);
if (date.HasValue == false)
{
this.DateAsString.Set(context, null);
return;
}
DateTime value = date.Value;
CultureInfo culture = CultureInfo.GetCultureInfo(locale ?? DEFAULT_LOCALE);
string dateAsString = (format == null) ? value.ToString(culture) : value.ToString(format, culture);
this.DateAsString.Set(context, dateAsString);
}
}

最新更新