Коллеги, здравствуйте!

Беру [#Системная переменная.Текущее значение времени#] и мне из нее необходимо:

  • вычитать день и месяц из текущей даты;
  • сравнить день и месяц текущей даты с другими значениями дня и месяца;
  • написать сравнение в Формулу условного потока.

Фактический пример: сегодня 19.07.2021.

19.07 < 15. 11 и 19.07 > 01.01, поэтому идем по условному потоку 1, иначе по условному потоку 2.



Возможно ли данное условие прописать через формулу? Какие системные переменные необходимо создать для того, чтобы корректно описать формулу?

Нравится

4 комментария
Лучший ответ

Коллеги, решили вопрос такой формулой.

В каждый условный поток поставили формулу в зависимости от требуемого периода.

Например, в одном потоке такая формула для промежутка времени 01.01 - 31.08:

([#Системная переменная.Текущее значение даты#].Day >= 1 && [#Системная переменная.Текущее значение даты#].Month == 1) || ([#Системная переменная.Текущее значение даты#].Month == 2) || ([#Системная переменная.Текущее значение даты#].Month == 3) || ([#Системная переменная.Текущее значение даты#].Month == 4) || ([#Системная переменная.Текущее значение даты#].Month == 5) ||  ([#Системная переменная.Текущее значение даты#].Month == 6) ||  ([#Системная переменная.Текущее значение даты#].Month == 7) || ([#Системная переменная.Текущее значение даты#].Month == 8)



в другом потоке такая формула для промежутка времени16.11 - 31.12:

([#Системная переменная.Текущее значение даты#].Day >= 16 && [#Системная переменная.Текущее значение даты#].Month == 11 ) || ([#Системная переменная.Текущее значение даты#].Month == 12 )

Правильно ли я понял, вы хотите, чтоб ваш поток срабатывал ежегодно в определённый период дат (с 01.01 по 15.11)? Поэтому вы хотите отделить год от даты?

Николай Ходаковский,

да, верно

Александра Дубс, добрый день!

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

В параметр процесса записываем текущую дату по формуле:

new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day)

Во второй параметр записываем дату сравнения с текущим годом:

new DateTime(DateTime.Now.Year, [#Дата сравнения 1#].Month,[#Дата сравнения 1#].Day)

Созданные параметры можно сравнивать в формуле или условном потоке в виде:

[#Текущая дата#] < [#Дата сравнения#]

Коллеги, решили вопрос такой формулой.

В каждый условный поток поставили формулу в зависимости от требуемого периода.

Например, в одном потоке такая формула для промежутка времени 01.01 - 31.08:

([#Системная переменная.Текущее значение даты#].Day >= 1 && [#Системная переменная.Текущее значение даты#].Month == 1) || ([#Системная переменная.Текущее значение даты#].Month == 2) || ([#Системная переменная.Текущее значение даты#].Month == 3) || ([#Системная переменная.Текущее значение даты#].Month == 4) || ([#Системная переменная.Текущее значение даты#].Month == 5) ||  ([#Системная переменная.Текущее значение даты#].Month == 6) ||  ([#Системная переменная.Текущее значение даты#].Month == 7) || ([#Системная переменная.Текущее значение даты#].Month == 8)



в другом потоке такая формула для промежутка времени16.11 - 31.12:

([#Системная переменная.Текущее значение даты#].Day >= 16 && [#Системная переменная.Текущее значение даты#].Month == 11 ) || ([#Системная переменная.Текущее значение даты#].Month == 12 )

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

Добрый день. Применил валидацию даты согласно статье https://academy.terrasoft.ru/documents/technic-sdk/7-15/dobavlenie-validacii-k-polyu-stranicy

Всё работает хорошо. Но при удалении значения  поля почему, то распознаёт что не проходит валидацию. 

У меня поле желаемая дата не должна быть меньше текущей даты и времени или должно быть пусто. Пустым полем он не даёт сохранить. Скрин вложил. 

https://i.imgur.com/H9hksBj.png

 

Вот код:

// Метод-валидатор значения колонок [UsrCustomDate] и [CreatedOn].

            dueDateValidator: function() {

                // Переменная для хранения сообщения об ошибке валидации.

                var invalidMessage = "";

                // Проверка значений колонок [UsrCustomDate] и [CreatedOn].

                if (this.get("UsrCustomDate") < this.get("UsrDateReal"))  {

                    // Если значение колонки [UsrCustomDate] меньше значения колонки [CreatedOn], 

                    // в переменную invalidMessage помещается значение локализуемой строки с сообщением

                    // об ошибке валидации.

                    invalidMessage = this.get("Resources.Strings.CreatedOnLessDueDate");

                }

        

                // Объект, свойство которого содержит сообщение об ошибке валидации.

                // Если валидация прошла успешна, в объекте возвращается пустая строка.

                return {

                    // Сообщение об ошибке валидации.

                    invalidMessage: invalidMessage

                };

            }

Нравится

7 комментариев
Лучший ответ

Если в базе в поле Null, не факт, что в переменной JS тоже так. добавьте вывод в лог, посмотрите что там, а затем можно будет вписать в условие if проверку на такое значение.

Не смотрели, что попадает в переменную при очистке? Может, там как раз минимальная дата, вроде 01.01.01? Или оба сравниваемые поля пустые, их значения одинаковы и строгое сравнение при помощи «<» даёт отрицательный ответ? Попробуйте отладиться или просто выводить в консоль значение полей и результаты проверки.

Зверев Александр,

Насколько я понял NULL. А NULL это меньше текущей даты. Можно ли 

        if (this.get("UsrCustomDate") < this.get("UsrDateReal")) как то изменить.? Чтобы принимал тоже NULL.

 

 

Если в базе в поле Null, не факт, что в переменной JS тоже так. добавьте вывод в лог, посмотрите что там, а затем можно будет вписать в условие if проверку на такое значение.

Я по трассировке проверил почему то window.console.log(); ничего не возвращает. 

  if (this.get("UsrCustomDate") < this.get("UsrDateReal"))  {

                      if (this.get("UsrCustomDate") !== null)  {

                    // Если значение колонки [UsrCustomDate] меньше значения колонки [CreatedOn], 

                    // в переменную invalidMessage помещается значение локализуемой строки с сообщением

                    // об ошибке валидации.

                    invalidMessage = this.get("Resources.Strings.CreatedOnLessDueDate");

                }

                }

 

А есть ли текущее значение, а то я через бизнес-процессы обновляю всегда поле UsrDateReal???

В JS текущую дату и время можно узнать при помощи присвоения или сравнения с new Date().

Я проще нашёл решение. Просто к сравнительному полю привязал системную переменную текущая дата https://i.imgur.com/Xf3bcEA.png.&nbsp;

С new Date() нужно было попотеть по моему. 

Мне кажется, от лишнего поля в таблице расходов ресурсов всё же больше, чем от пары строк на JS, даже если нужно привести к нужному формату кодом.

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

Нужно в отчете Word отобразить текущую дату. Нашел метод

Selection.InsertDateTime()

который принимает параметры. Собственно вопрос: какие нужно передать параметры, чтобы дата отобразилась в формате "13 июня 2012"?

Нравится

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

В целом формат команды при вызове (подробнее):

function InsertDateTime(
	 DateTimeFormat : Object, 
	 InsertAsField : Object, 
	 InsertAsFullWidth : Object, 
	 DateLanguage : Object, 
	 CalendarType : Object
);

Для указанного вами отображения попробуйте указать при вызове следующие параметры:
DateTimeFormat:="dd MMMM yyyy"
DateLanguage:=1049

Языки - 1049 для русского, 1058 для украинского, 1059 для белорусского

Попробуйте разобраться с описанием метода InsertDateTime()

И еще -- в отчете Ворд, насколько я помню, можно вставить текущую дату через макросы. А формат отображения зависит от региональных настроек самого компьютера.

Спасибо большое за помощь

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

Выставляю на суд общественности функцию сравнения дат. Прошу высказать свое мнение. В частности можно ли как-то красивее? И где можно получить помощь?

function us_0(Dataset) {

        // текущая дата
        var CurrentData = new Date().setHours(0, 0, 0, 0);

        // дата из поля 'планируемая дата начала' плюс одна секунда
        var EstimatedStartDate = new Date(Dataset.Values('EstimatedStartDate')).getVarDate()+1

        if ((EstimatedStartDate CurrentData) & (Dataset.Values('StartDate')==null || Dataset.Values    ('StartDate')==''))
        {return true }
        else {return false}            
}

Нравится

6 комментариев

IsEqualDate c scr_DateUtils

в скрипте scr_DateUtils есть только function IsEqualDateTime(DateTime1, DateTime2)

Эта функция не подходит.
1. Она может только сравнить, а надо больше-меньше
2. для моего случая она даже не может сравнить
дата в поле (EstimatedStartDate) - 06.04.2010
текущая дата (CurrentData) - 29.05.2010 0:13:23

"chess" написал:(Dataset.Values('StartDate')==null || Dataset.Values    ('StartDate')=='')

Лишнее. Есть более короткая и надежная функция ValIsNull

"chess" написал:&

Это у Вас побитовое И? А зачем?

Спасибо за конструктивные предложения и критику. И так, исправленый вариант …
(кстати, а что такое <пустое значение> в ValIsNull)

function us_0(Dataset) {
 
        // текущая дата
        var CurrentData = new Date().setHours(0, 0, 0, 0);
 
        // дата из поля 'планируемая дата начала' плюс одна секунда
        var EstimatedStartDate = new Date(Dataset.Values('EstimatedStartDate')).getVarDate()+1
 
        if ((EstimatedStartDate < CurrentData) && (Dataset. ValIsNull ('StartDate')) ) 
        {return true }
        else {return false}             
}

"chess" написал:(кстати, а что такое <пустое значение> в ValIsNull)

Можно прочитать вот тут

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

Как добавить в штатные фильтры дат, ещё пункты?:
текущая дата в прошлом году
текущая дата в прошлом месяце

Указанные выше фильтры сделают аналитику итогов удобнее...
Нам например необходимо сравнить в итогах количество подписанных договоров за период менее текущей даты этого года и менее текущей даты в прошлом году.
Заранее благодарен за ответ.

Нравится

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

Александр, Вы имеете в виду фильтры в FilterBuilder или фильтры раздела?

Список значений для фильтров в FilterBuilder формируется в ядре системы и не может быть изменён без корректировки ядра.

Если же речь идёт о фильтрах раздела (блок "Показать за период"), думаю, всё сведётся к добавлению нескольких значений в перечисление "Тип периода" и обработки этих значений в функциях скрипта scr_DatePeriod.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Зато в FilterBuilder, наверняка, можно добавить пункт "Количество месяцев тому назад"...
И подставляя 1 или 12 получим необходимую Вам фильрацию

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