Сравнение времени в процессе у параметра Читать данные

Доброго времени суток.

Не могу сравнить два значения времени в процессе.

Задача для примера, есть ещё другие похожие задачи с этой же темой.

В текстовый параметр бизнес-процесса подставляется текст "Доброе утро", "Добрый день" и т.д. в зависимости от текущего времени. Время проверяется в соответствии с созданным справочником (унаследованный от базового), где используются колонки [Название], [Время от] (тип время) и [Время до] (тип время). Наполнение:

Доброе утро | 07:00 | 11:30

Добрый день | 11:30 | 17:30

Добрый вечер | 17:30 | 22:00

 

Что я хочу сделать: процессом Читаем данные справочника, где [Текущее время] => [Время от] И [Текущее время] < [Время до], вычитать текстовое поле Название.

В чём моя проблема: в процессе, в элементе Чтение данных, в фильтре у полей с типом Время нет параметров < = или >. Есть только = или !=, Заполнено или Не заполнено. У полей Дата/Время всё нормально есть любой вид сравнения.

Вопрос-бонус: поле с типом Время могу сравнивать только с заранее записанным Параметром процесса, а динамически указать Текущее время не могу, как это с Дата/Время указывается Текущая дата и время.

Изображение удалено.

Версия 7.13.0, Sales, Marketing, CustomerCenter Enterprise OnSite.

Нравится

2 комментария

Здравствуйте!

 

Данную задачу можно решить через элемент "Задание-сценарий", в котором построить select или esq запрос с необходимыми Вам фильтрами. 

 

UserConnection userConnection = Get&lt;UserConnection&gt;("UserConnection");
var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "UsrTestLookUp");
esq.AddColumn("Name");
esq.AddColumn("UsrTimeOn");
esq.AddColumn("UsrTimeTo");
var esqTimeOnFilter = esq.CreateFilterWithParameters(FilterComparisonType.Less, "UsrTimeOn", DateTime.Now.TimeOfDay);
var esqTimeToFilter = esq.CreateFilterWithParameters(FilterComparisonType.Greater, "UsrTimeTo", DateTime.Now.TimeOfDay);
esq.Filters.Add(esqTimeOnFilter);
esq.Filters.Add(esqTimeToFilter);
EntityCollection entityCollection = esq.GetEntityCollection(UserConnection);
if (entityCollection.IsNotEmpty()) {
        foreach (var name in entityCollection) {
        	var param1 = name.GetTypedColumnValue&lt;string&gt;("Name");
        	Set ("ProcessSchemaParameter1", param1);
        }
    }
/* или через select 
var select =
    (Select)new Select(userConnection)
        .Column("Name").As("Text")
    .From("UsrTestLookUp").WithHints(Hints.NoLock)
    .Where("UsrTimeOn").IsLess(Column.Parameter(DateTime.Now.TimeOfDay))
    .And("UsrTimeTo").IsGreater(Column.Parameter(DateTime.Now.TimeOfDay));
 
string sql = select.GetSqlText();
Set ("ProcessSchemaParameter1", sql);
using (var dbExecutor = userConnection.EnsureDBConnection()) {
    using (IDataReader dataReader = select.ExecuteReader(dbExecutor)) {
        while (dataReader.Read()) {
            string Name = dataReader.GetColumnValue&lt;string&gt;("Text");
            Set ("ProcessSchemaParameter1", Name);
        }
    }
}*/
return true;

 

Заричный Антон,

Здравствуйте.

 

Спасибо за предложенный вами вариант, он подошёл и отработал как и была поставлена задача.

Для тех, кто вдруг ещё ищет, итоговый вариант у меня получился следующим:

UserConnection userConnection = Get&lt;UserConnection&gt;("UserConnection");
var timenow = Get&lt;DateTime&gt;("CurrentTime"); // Параметр в процессе с типом Дата/Время
var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "TsiCCCustomerGreetingOnDaytime"); // Название справочника
esq.AddColumn("Name"); // Колонка "Название" в справочнике (где написано Добрый день/утро/вечер и т.п.)
esq.AddColumn("TsiCCCustomerGreetingTimeFrom"); // Колонка справочника Время от
esq.AddColumn("TsiCCCustomerGreetingTimeTo"); // Колонка справочника Время до
 
var esqTimeOnFilter = esq.CreateFilterWithParameters(FilterComparisonType.Less, "TsiCCCustomerGreetingTimeFrom", timenow); // Колонка справочника Время от.
var esqTimeToFilter = esq.CreateFilterWithParameters(FilterComparisonType.Greater, "TsiCCCustomerGreetingTimeTo", timenow); // Колонка справочника Время до
// В одном из двух фильтров желательно указать равенство, чтобы не было ошибок, т.е. LessOrEqual или GreaterOrEqual соответственно, в зависимости от ваших потребностей
 
esq.Filters.Add(esqTimeOnFilter);
esq.Filters.Add(esqTimeToFilter);
EntityCollection entityCollection = esq.GetEntityCollection(UserConnection);
if (entityCollection.IsNotEmpty()) {
	foreach (var name in entityCollection) {
		var paramValue = name.GetTypedColumnValue&lt;string&gt;("Name");  // Колонка "Название"
		Set ("TimeOfDayText", paramValue);  // Название параметра в процессе для записи текста сообщения
	}
}
return true;

 

Показать все комментарии