среда, 16 июня 2010 г.

Форматирование даты и времени в бизнес процессах в Microsoft Dynamics CRM 4.0

В процессе работы с бизнес процессами CRM выяснилась одна интересная особенность - никоим образом отформатировать поле даты/времени при вставке в текстовое поле нельзя. Результат можно посмотреть на скриншоте:




Я решил разработать кастомную активность бизнес процесса для того, чтобы можно было задавать формат выводимой даты.
В качестве параметров активности передаются дата, которую необходимо отформатировать и формат, который должен быть получен на выходе:

using System;
using System.Text;
using System.Collections.Generic;
using System.Workflow.Activities;
using Microsoft.Crm.Workflow;
using System.Workflow.ComponentModel;
using Microsoft.Crm.Sdk;

namespace DateTimeFormatting
{
[CrmWorkflowActivity("Formats date time with required format", "Formatting Routines")]
public class FormatDateTime : SequenceActivity
{
protected override System.Workflow.ComponentModel.ActivityExecutionStatus Execute(System.Workflow.ComponentModel.ActivityExecutionContext executionContext)
{
string result = string.Empty;

if (!string.IsNullOrEmpty(DateFormat) && datetime != null)
{
result = DateTime.Parse(datetime.Value).ToString(DateFormat);
}

Result = result;

return ActivityExecutionStatus.Closed;
}

public static DependencyProperty DateFormatProperty = DependencyProperty.Register("DateFormat", typeof(string), typeof(FormatDateTime));

[CrmInput("Format of DateTime")]
public string DateFormat
{
get
{
return (string)base.GetValue(DateFormatProperty);
}
set
{
base.SetValue(DateFormatProperty, value);
}
}

public static DependencyProperty datetimeProperty = DependencyProperty.Register("datetime", typeof(CrmDateTime), typeof(FormatDateTime));

[CrmInput("DateTime to format")]
public CrmDateTime datetime
{
get
{
return (CrmDateTime)base.GetValue(datetimeProperty);
}
set
{
base.SetValue(datetimeProperty, value);
}
}

public static DependencyProperty ResultProperty = DependencyProperty.Register("Result", typeof(string), typeof(FormatDateTime));

[CrmOutput("Formatted DateTime")]
public string Result
{
get
{
return (string)base.GetValue(ResultProperty);
}
set
{
base.SetValue(ResultProperty, value);
}
}

}
}


Следующие скриншоты демонстируют каким образом можно использовать данную активность в бизнес процессах:
1. Вставьте эту активность в бизнес процесс:


2. Нажмите кнопку "Set Properties" чтобы установить дату и формат:


3. Заполните поля "Format of DateTime" и "DateTime to Format":


4. Добавьте в бизнес процесс какой-нибудь шаг, в которому будет использоваться результат форматирования (например отсылка письма):





Сохраните шаг, сохраните и опубликуйте бизнес процесс. Результат работы этого бизнес процесса:


Исходники:

3 комментария:

  1. Дата форматируется в зависимости от региональных параметров, указанных на вкладке "Список типов" окна настроек параметров CRM ("Параметры" - "Администрирование" - "Системные параметры").

    По скриншотам видно, что стоит англоязычная локаль, поэтому и дата так форматируется. Если выбрать "Текущий формат - русский (Россия)", то будет "16.06.2010 12:15".

    Если же не хочется менять все региональные параметры разом, можно для регионального профиля настроить разделители для даты, времени, денежных типов и т.п.

    ОтветитьУдалить
  2. Спасибо большое, но я это знаю.

    Как не играйся с региональными настройками, а формат 16-Jun-10 - не добьёшщься. При помощи моего действия - запросто. Формат dd-MMM-yy.

    ОтветитьУдалить
  3. А если необходимо вырезать только дату - без времени. Можно это как то в системе настроить?

    ОтветитьУдалить