Добрый день! Подскажите, пожалуйста, какие есть функции для того, чтобы рассчитать дату.

Например есть одна дата,
и необходимо рассчитать другую дату 2 = как дата 1 + столько дней/месяцев

Спасибо

Нравится

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

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

C# или JavaScript?

Дарья,

используйте функции того языка программирования, с которым Вы работаете.

JavaScript: https://learn.javascript.ru/datetime
C#: https://msdn.microsoft.com/ru-ru/library/bb546099(v=vs.110).aspx

Добрый день. Спасибо

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

Добрый день!
Подскажите, пожалуйста, как
1) очистить дату через элемент "Изменение данных" - то есть как обозначить пустую дату?
2) как сравнить в условии(условный поток) в бизнес-процессе дату с null (то есть проверить заполнена дата или нет)

Собственно, интересует вопрос как обозначить пустую дату? (незаполненную)
Например, строка - это string.Empty
а в случае даты?

Нравится

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

Дарья, добрый день!

На уровне приложения поле с типом DateTime является non-nullable. Т.е. установить значение null в элемент “Изменить данные” не получится.
Список доступных методов DateTime можно посмотреть в документации https://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx
Если не указывать значение для поля с типом DateTime при создании записи в объекте – в базе данных будет установлено значение null.

а в условном потоке можно как-то проверить, заполнена дата или нет?

Если нельзя очистить дату с помощью элемента "Изменить данные", тогда как действовать? использовать элемент сценарий?

Здравствуйте, Дарья!

Для проверки заполнена дата или нет Вы можете в условном потоке сравнивать [#Параметр#] c минимальной датой (DateTime.MinValue).

Дата не заполнена, если [#Параметр#]<=(DateTime.MinValue).

Для очистки даты Вам нужно использовать задание-сценарий, т.к. элементом "Изменить данные" Вы сможете только задать значение DateTime.MinValue, которое соответствует 01.01.0001 (такое значение будет отображаться на странице редактирования/в реестре, что не очень красиво).

спасибо

Добрый день!
Использую такой код в сценарии для очищения даты
UserConnection userConnection = context.UserConnection;
var update = new Update(userConnection, "Case")
.Set("SolutionProvidedOn", new QueryParameter(null))
.Where("Id").IsEqual(new QueryParameter(RecordId));
update.Execute();
Возникает ошибка при исполнении процесса -
Ссылка на объект не указывает на экземпляр объекта.

Пробую использовать такой код в сценарии для очищения даты
UserConnection userConnection = context.UserConnection;
var update = new Update(userConnection, "Case")
.Set("SolutionProvidedOn", null)
.Where("Id").IsEqual(new QueryParameter(RecordId));
update.Execute();
При публикации объекта возникает ошибка

Как очистить дату с помощью элемента-сценарий?

Здравствуйте, Дарья!

Вы можете использовать CustomQuery.

var dr = new CustomQuery(UserConnection, String.Format(
"update case set SolutionProvidedOn = null where Id = 974ca9fc-c066-4a7a-ac65-7ec91a44a067")).ExecuteReader(dbExecutor);

При этом сам запрос Вам необходимо формировать отдельно (так как Id каждый раз будет новый).

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

Добрый день.
Подскажите пожалуйста, как увеличить дату ровно на 1 год. В договоре есть поле "Дата начала" (StartDate) типа дата/время и есть поле "Дата завершения" (DueDate) типа дата/время. Так вот, мне нужно чтобы в поле "Дата завершения" автоматически проставлялась дата на год больше, чем стоит в поле "Дата начала."

Нравится

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

scr_Utils
функция AddDateDays

есть же високосные года)

добавьте в function dlDataOnDatasetDataChange(DataField) скрипта wnd_ContractEditScript

	if (DataField.Name == 'StartDate') {
		var NewDate = new Date(dlData.Dataset.Values('StartDate'));
		NewDate.setYear(NewDate.getYear() + 1);
		dlData.Dataset.Values('DueDate')= NewDate.getVarDate();
	}

Спасибо, все получилось

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

Здравствуйте. При формировании отчета в Word дата и время отображается в формате 28.12.2012 10:00:00.
Как сделать так, чтобы секунды не выводились в отчет?

Нравится

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

Здравствуйте, Александр!
Не могли бы Вы более детально описать используемые макросы в отчете?

При настройке отчета используется <#Деталь 3.Дата начала>

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

Спасибо, Сергей, это помогло. Единственное, что при таком решении часы и минуты, если их значение меньше 10, выводятся в таком виде, например, 8:5. Хотелось бы, конечно, в формате 08:05. Наверное, здесь ничего нельзя сделать

Вы правы, тут уже ничего.
как вариант, можете писать 8 часов 10 минут

Да, этот вариант я тоже уже рассмотрел) Спасибо)

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

Как вставить дату контракта в формате "7 июля 2012 года" в Word-отчет?
Ну, или другой формат другой даты. Иногда необходимо немного видоизменять данные пользовательского запроса для отчета Word

Нравится

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

Здравствуйте.
Изменить формат отображения даты в отчете можно открыв с помощью карточки редактирования запрос, который используется в отчете. Далее, Вам необходимо кликнуть правой кнопкой в области данных, и выбрать меню изменить колонку/нужная Вам колонка с датой. В открывшемся окне в поле "Формат даты" можно изменить формат отображения даты.
Если конкретно в таком варианте как Вы указали (месяц прописью, число и год - цифрами) - то только изменив региональные настройки в панели управления, а именно формат "короткой" даты, к примеру на такой:

1

Однако, обратите внимание, что после изменений везде, где используется поля типа "Дата/время" дата будет отображена в данном формате.

А если конкретно в одном отчете?

Здравствуйте, Владимир.

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

1

Может, в Word'е можно вставить какую-то формулу соотстветствия номера месяца и его названия?

Попробуйте следующим образом:

Создайте новую закладку Word с именем, к примеру, Test. (Вставка - Закладка)

Далее, поместите курсор в начало документа и нажмите Alt+F9, потом Ctrl+F9.
Между фигурных скобок вставьте следующий текст:

SET test #макрос с датой из террасофт  \* MERGEFORMAT

в том месте где нужно вывести дату в нужном Вам формате - нажмите Alt+F9, потом Ctrl+F9 и между фигурных скобок вставьте следующий текст:

\@ "dd MMMM yyyy"  \* MERGEFORMAT

далее, между отрывающейся фигурной скобкой и символом \@ нажмите еще раз Ctrl+F9 и между фигурных скобок вставьте текст:

 REF  test

В итоге у меня вышло следующее:

1

Файл Word во вложении.

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

Для определения возраста по дате рождения у меня получилась такая функция:

function GetAgeByDate(BirthDate) {
        if (IsEmptyValue(BirthDate)) {
                return null;
        }
        var NowDate = System.Now();
        var TempBirthDate = new Date(BirthDate);
        var TempNowDate = new Date(NowDate);
       
        var BirthFullYear = TempBirthDate.getFullYear();
        var BirthMonth = TempBirthDate.getMonth();
        var BirthDay = TempBirthDate.getDate();

        var NowFullYear = TempNowDate.getFullYear();
        var NowMonth = TempNowDate.getMonth();
        var NowDay = TempNowDate.getDate();
       
        if (BirthFullYear >= NowFullYear) {
                return 0;
        } else {
                if ((BirthMonth > NowMonth) || ((BirthMonth == NowMonth) && (BirthDay > NowDay))) {
                        return (NowFullYear - BirthFullYear - 1);
                } else {
                        return (NowFullYear - BirthFullYear);
                }
        }
}

Нравится

Поделиться

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

может лучше возвращать 0 в этих строка кода:

if (IsEmptyValue(BirthDate)) {
                return null;
}

Изначально было 0, но затем заменил на null. Считаю так правильнее, ведь это всё же разные ситуации.

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

Добрый день!

Подскажите пожалуйста, как решить проблему:

Нужен отчет в Fast Report в котором записи фильтруются по диапазону дат, введенных пользователем во время запуска отчета. + Возможность запуска генерации отчета по расписанию и рассылки с автоматическим проставлением дат.

Что меня смущает и поправьте пожалуйста, если я не прав:
1) Я не могу использовать для построения отчета датасет, который базируется на запросе с параметрами. Т.к. как передать из FR параметры в запрос я не нашел. Какой выход - писать кастомный запрос в самом FR?
2) Допустим, я создам датасет, который будет выбирать все данные независимо от дат. Но когда я жму кнопку "Установить фильтры" то я не могу задать там фильтр >= и =. Вопрос - эти фильтры работают только для текстовых полей?
3) Насколько я понимаю, функционал запуска по расписанию придется решать как то так:
создавать форму, на которой ничего не будет, в обработчике OnPrepare например писать скрипт который сформирует отчет и потом разошлет пользователям а затем закроет форму. Потом в Scheduled Tasks создавать задачу, которая будет по расписанию запускать террасофт с параметром - кодом окна.

Буду благодарен за любые комментарии/решения/предложения и тем более примеры :)
Спасибо.

Нравится

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

Реализовать отчет FastReport, в котором записи фильтруются по диапазону дат Вы можете двумя способами: создать собственное окно фильтрации, в котором пользователь будет выбирать период фильтрации; использовать встроенное окно фильтрации FastReport.
В качестве примера для создания отчета с собственным окном фильтрации можно использовать отчеты "Анализ конкурентов" (fr_OpportunitiesCompetitors), "Отчет по продажам" (fr_ReportOpportunitiesSalesCycleAnalisys) с окном фильтрации wnd_ServiceDeskDateFilter. Также во вложении прилагаю для ознакомления файл, в котором описан принцип создания окна фильтрации для отчета.

"komgbu" написал:2) Допустим, я создам датасет, который будет выбирать все данные независимо от дат. Но когда я жму кнопку "Установить фильтры" то я не могу задать там фильтр >= и <=. Вопрос - эти фильтры работают только для текстовых полей?

Встроенное окно фильтрации FastReport позволяет устанавливать фильтры >= и <= для полей с типом "Дата/время", "Целое число", "Дробное число":
http://www.community.terrasoft.ru/system/files/1_12.png

Здравствуйте,
По поводу 1) и 2) вопроса, предлагаю вам почитать в теме http://www.community.terrasoft.ru/blogs/7286
если, что либо не понятно, опишу более подробно
3) Как вариант можно создать и так,
1
На сколько я понял, под Scheduled Tasks вы имеете ввиду Task Scheduler Windows'а

Наталия, Алексей, спасибо!

Да, под Scheduled Tasks я имел ввиду планировщик Windows.

Добрый день!

Не подскажете, как для кастомного окна фильтрации переопределить заголовок (не разваливая стандартный скрипт, который автоматически присваивает названия типа: "имя_сервиса (Просмотр)")?

Форма стандартной фильтрации конечно... не айс...

Спасибо!

Здравствуйте,
Скрипт scr_BaseFastReportPreviewScript

function PrepareReport(AWindow) {
	CheckAttribute(AWindow, 'Report');
	frpMain.Report = GetAttribute(AWindow, 'Report');
	var FiltersCaption = frpMain.Report.Caption + " (Фильтры)";
	var PreviewCaption = frpMain.Report.Caption + " (Просмотр)";
	frpMain.PrepareReport();
	Self.WindowCaption = PreviewCaption;
	if (IsAttributeExists(AWindow, 'ShowFilterForm'))
...

Строчка формирует название

var PreviewCaption = frpMain.Report.Caption + " (Просмотр)"; 

присваиваем значение,

Self.WindowCaption = PreviewCaption;

можете в этом моменте проверять с каким отчетом вы работаете

if (ExtractUSICodeEx(frpMain.Report.USI)=='fr_ReportContactTasks')
{
...
}

и формировать нужное вам значение заголовка окна

Алексей,

Спасибо за подробные разъяснения.
Т.е. без изменения в этом стандартном скрипте переопределить заголовок окна не получится... жаль...

Еще один вопрос, если можно:

По поводу разграничения прав доступа к отчету.

1) Я так понимаю, через какие-то настройки прав определенной группе пользователей дать на отчет нельзя, и придется все реализовывать программно?

2) Если запрос отчета выбирает данные из таблиц/полей недоступных пользователю, они будут пустыми в отчете?

Спасибо!

1) Права доступа к отчету вы можете настроить в детали [Доступ]
1
где указать необходимые вам группы пользователей
2) Поля на которые нет доступа у пользователя отображается не будут

"komgbu" написал:когда я жму кнопку "Установить фильтры"

Подскажите, пожалуйста, где эта кнопка. Как подключить встроенное окно фильтрации FastReport?

Здравствуйте,
Нажатие кнопки (выделено красным) в Terrasoft Administrator, вызовет окно на которое показывает стрелка на рисунке
1

Спасибо! Выручили.

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

Добавил в окно несколько DataTimeControl, но при открытии окна они заполняются значением текущей даты, мне же необходимо оставлять их пустыми. Оказалось, что сделать данное поле пустым не получается, оно принимает значение "0:0:0", но визуально отображается дата. Подскажите, как заставить указанные поля "опустеть"?

Нравится

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

Здравствуйте, Олег!

Сделать поле DataTimeControl пустым не получится.
Дело в том, что когда мы работаем с источником данных (DateTimeDatControl), значение в поле может быть пустое, тогда при сохранении в базу данных, соответствующее поле у нас будет пустым, но когда мы используем просто DatTimeControl, нам нужен контрол для ввода даты и времени, и этот контрол позволяет ввести только корректное значение даты и времени, это зашито в компоненте ядра, также как и в NumericControl не могут быть внесены не цифровые символы.

Это корректная ситуация, так как непонятно, что должно происходить, если, например, на нажатии Ок у нас пустой контрол, кроме того, на самом деле, если в поле уже введена текущая дата (или другая дата, предусмотренная Вашей логикой), пользователю удобнее ее исправить, чем начинать вводить с нуля, потому что, если это поле пустое, то куда бы в нем пользователь не поставил курсор, остальные значения подставятся сегодняшние. Например, пользователь начнет вводить день, а год и месяц тут же подтянутся сегодняшние.

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

Инна Безверхняя,
II линия службы поддержки Terrasoft

Пользователю отображается окно с дюжиной полей указанного типа. После нажатия "ОК" создаются записи в разделе операции, кол-во создаваемых операций должно совпадать с кол-вом заполненных полей.

У компонента есть свойство IsNull, надо присвоить ему true - и он будет пустым.
Аналогично по этому свойству надо проверять, оставил пользователь компонент пустым, или там дата.

Здравствуйте, Олег!

Может быть, сделать чек-боксы около полей. Если чек-бокс установлен, то поле активно, запись создается. То есть, количество операций будет совпадать с количеством отмеченных чек-боксов.
Другой вариант - использовать все же DateTimeDatаControl, создав специально под эту задачу датасет.
Или использовать Edit с соответствующей маской даты/времени, а затем преобразовывать его в нужный формат.

Инна Безверхняя,
II линия службы поддержки Terrasoft

Здравствуйте, Валерий!

Да, Вы правы.
Это намного проще, спасибо! как-то упустила это свойство :)

"Валерий Андрусик" написал:У компонента есть свойство IsNull, надо присвоить ему true - и он будет пустым.
Аналогично по этому свойству надо проверять, оставил пользователь компонент пустым, или там дата.

Валерий, спасибо!

Маленькое дополнение к этой теме http://www.community.terrasoft.ua/forum/topic/7217

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

В датасете по умолчанию дата хранится в расширенном виде.
Задача: записать в переменную дату без времени.

Если в переменной только дата, можно привести к формату dd.mm.yyyy следующим образом:

ExtractDateAsStr(new Date(Dataset.ValAsDateTime('Date'))).getVarDate);

Если дата должна выводиться в строке:

DateToStr(Dataset.ValAsDateTime('Date'));

Нравится

Поделиться

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

Пример на эту тему :
Задача : Как в скрипте получить дату в виде XXXX-XX-XX XX:XX:XX из поля даты в датасете

Пример кода:

var theDate = new Date(Date.parse(Dataset.ValAsDateTime('Date')))
MessageBox( theDate.getFullYear() + "-" + (theDate.getMonth()+ 1) + "-" + theDate.getDate() + " "+theDate.getHours() + ":" + theDate.getMinutes() + ":" + theDate.getSeconds() );

где Date - поле с датасета

Результат работы : 2011-6-27 12:45:0

При выводе таким способом в строку даты, минуты и часы до 10 (0-9) выводятся без ноля.

Например:

theDate = new Date();
theDate.setMinutes(09);
 
Log.Write(1, theDate.getMinutes(09));

Результат: 9

Можно ли как-то это побороть без парсинга?

Метод getMinutes не имеет параметров, его стоит вызывать просто theDate.getMinutes(). И он возвращает число.

Чтобы получить строку с нулём, можно обернуть функцией:

function AddZero(number) {
	return (number < 10) ? '0' + number : number;
}
 
theDate = new Date();
theDate.setMinutes(9);
 
Log.Write(1, AddZero(theDate.getMinutes()));
Показать все комментарии

Подскажите, как построить фильтр, в котором можно указать период, за который будет создаваться отчет (FastReport), и вывести даты начала и окончания указанного периода в отчет.

Нравится

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

Нужно создать свою форму фильтрации, в которой пользователь выберет даты, указать ее при регистрации отчета, а на обработчик кнопки OK передать эти даты атрибутами в отчет следующим образом:

ReportPreviewer.Report.Attributes('FromDate') = DateToStr(FromDate);
	ReportPreviewer.Report.Attributes('ToDate') = DateToStr(ToDate);

Там же можно получить доступ к набору данных отчета и наложить фильтр. Пример смотрите в wnd_ServiceDeskDateFilterScript TerrasoftXRM.

Олег, прикрепила небольшую инструкцию.
Также этот вопрос описан здесь:
http://community.terrasoft.ua/forum/topic/3541

Спасибо. Буду пробовать.

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