Доброго времени суток.
Не могу сравнить два значения времени в процессе.
Задача для примера, есть ещё другие похожие задачи с этой же темой.
В текстовый параметр бизнес-процесса подставляется текст "Доброе утро", "Добрый день" и т.д. в зависимости от текущего времени. Время проверяется в соответствии с созданным справочником (унаследованный от базового), где используются колонки [Название], [Время от] (тип время) и [Время до] (тип время). Наполнение:
Доброе утро | 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;