Доброго времени суток.
Не могу сравнить два значения времени в процессе.
Задача для примера, есть ещё другие похожие задачи с этой же темой.
В текстовый параметр бизнес-процесса подставляется текст "Доброе утро", "Добрый день" и т.д. в зависимости от текущего времени. Время проверяется в соответствии с созданным справочником (унаследованный от базового), где используются колонки [Название], [Время от] (тип время) и [Время до] (тип время). Наполнение:
Доброе утро | 07:00 | 11:30
Добрый день | 11:30 | 17:30
Добрый вечер | 17:30 | 22:00
Что я хочу сделать: процессом Читаем данные справочника, где [Текущее время] => [Время от] И [Текущее время] < [Время до], вычитать текстовое поле Название.
В чём моя проблема: в процессе, в элементе Чтение данных, в фильтре у полей с типом Время нет параметров < = или >. Есть только = или !=, Заполнено или Не заполнено. У полей Дата/Время всё нормально есть любой вид сравнения.
Вопрос-бонус: поле с типом Время могу сравнивать только с заранее записанным Параметром процесса, а динамически указать Текущее время не могу, как это с Дата/Время указывается Текущая дата и время.
![]()
Версия 7.13.0, Sales, Marketing, CustomerCenter Enterprise OnSite.
Нравится
Здравствуйте!
Данную задачу можно решить через элемент "Задание-сценарий", в котором построить select или esq запрос с необходимыми Вам фильтрами.
UserConnection userConnection = Get<UserConnection>("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<string>("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<string>("Text");
Set ("ProcessSchemaParameter1", Name);
}
}
}*/
return true;
Заричный Антон,
Здравствуйте.
Спасибо за предложенный вами вариант, он подошёл и отработал как и была поставлена задача.
Для тех, кто вдруг ещё ищет, итоговый вариант у меня получился следующим:
UserConnection userConnection = Get<UserConnection>("UserConnection");
var timenow = Get<DateTime>("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<string>("Name"); // Колонка "Название"
Set ("TimeOfDayText", paramValue); // Название параметра в процессе для записи текста сообщения
}
}
return true;