Доброго времени суток всем!
JavaScript, используемый в открытом коде платформы 3.х поддерживает прекрасный объект Date, позволяющий управлять контролом календаря, полями типа Даты и Времени.
Тема, как оказалось, очень занимательна и интересна. С временем можно производить арифметические операции. Причем, не только прибавлять или вычитать из даты часы/минуты/секунды, дату можно умножить на число!
Начнем с простого - создадим объект даты:
А если хотим в объект поместить сразу текущую дату и время:
Нужно получить текущее значение минут?
MyDateVariable .getMinutes()
А давайте положим в объект Data какую-то дату:
var MyDateTimeVariable = new Date(2012, 10, 30, 23, 59); // = 30.10.2012 23:59
var MyDateTimeVariable = new Date(Dataset.Values('Date')); // при условии, что задан Dataset
Изменим дату:
MyDateVariable.setMinutes(30);
Добавим немного Service Desk в XRM!
var NowTime = new Date(System.Now());
var ResponseLastDate = new Date();
var DueDate = new Date();
var PriorityDataset = GetSingleItemByCode('ds_IncidentPriority');
ApplyDatasetFilter(PriorityDataset, 'ID', Dataset.Values('PriorityID'), true);
PriorityDataset.Open();
//минуты
if (PriorityDataset.Values('TimeUnitID') == '{C0730FFD-ADCF-4A59-B398-B823AD049406}') {
ResponseLastDate.setMinutes(NowTime.getMinutes() +
PriorityDataset.Values('TimeUnitQuantity'));
DueDate.setMinutes(ResponseLastDate.getMinutes() +
PriorityDataset.Values('RSLTimeUnitQuantity'));
}
// часы
if (PriorityDataset.Values('TimeUnitID') == '{0FF5CCF3-8260-4E66-B47C-AF239777EFAB}') {
ResponseLastDate.setHours(NowTime.getHours() +
PriorityDataset.Values('TimeUnitQuantity'));
DueDate.setHours(ResponseLastDate.getHours() +
PriorityDataset.Values('RSLTimeUnitQuantity'));
}
Dataset.DisableEvents();
Dataset.Values('ResponseLastDate') = ResponseLastDate.getVarDate();
Dataset.Values('DueDate') = DueDate.getVarDate();
Dataset.EnableEvents();
}
Предоставленная выше функция, будет автоматически заполнять время реакции и разрешения в карточке инцидента отраслевого решения XRM. Актуально в тех случаях, когда такая автоматизация действительно нужна, но в XRM указанные временные параметры не задаются автоматически. Это происходит в решении Service Desk (на базе договоров SLA).
Функция есть, осталось только поместить ее вызов в нужные места:
- Событие OnPrepare карточки редактирования: function wnd_IncidentEditOnPrepare(Window) перед закрывающей скобкой
- Обработчик события function DataChange(DataField) также поместил условие:
if (Name == 'PriorityID') {
FillDates(Dataset);
}
'{0FF5CCF3-8260-4E66-B47C-AF239777EFAB}' - значение TimeUnitID из ds_IncidentPriority.
"Фильковский Павел" написал:
var MyDateTimeVariable = new Date(Dataset.Values(Date)); // при условии, что задан Dataset
Dataset.Values(Date) - где определено Date? И что будет если перед этой строкой программист добавит var Date = "StartDate"?
"Агутин Алексей" написал:А если хотим в объект поместить сразу текущую дату и время:var MyDateVariable = new Date(System.Now());
А зачем писать
System.Now()
?
new Date ()
и так возвращает текущую дату и время.
"Агутин Алексей" написал:var MyDateTimeVariable = new Date(Dataset.Values(Date)); // при условии, что задан Dataset
Dataset.Values(Date) - где определено Date? И что будет если перед этой строкой программист добавит var Date = "StartDate"?
Замечание дельное. у меня Опечатка была.
Правильно так:
var MyDateTimeVariable = new Date(Dataset.Values('Date'));
Где Date - поле датасета, а не строковая переменная :smile:
Так же надо обратить внимание на нумерацию месяцев.
var MyDateVariable = new Date(2012, 10, 23);
В данном случае это 23 ноября 2012 года, т.е. нумерация месяцев идет с 0 а не с 1
"Евгений Либин" написал:
new Date () и так возвращает текущую дату и время.
Согласен, можно оптимизировать код. Пример взят из конфигурации.
Возможно, правилом хорошего тона будет объявлять объект даты именно таким образом, ибо вот что говорит MSDN по этому поводу:
function Date( [dateVal : { Number | String | System.DateTime } ] )
"Евгений Либин" написал:Так же надо обратить внимание на нумерацию месяцев.
В данном случае это 23 ноября 2012 года, т.е. нумерация месяцев идет с 0 а не с 1
Да, честно говоря, странно, мочему именно так. Тот же MSDN говорит:
month
Required. The month as an integer between 0 and 11 (January to December).
date
Required. The date as an integer between 1 and 31.
А что делает getVarDate()?
в таком коде:
var Today = GetTodayDate();
Today = Today.getVarDate();
Преобразует значение переменной с датой из одного формата в другой, с которым в дальнейшем работают. Подробнее см. тут.
Returns a VT_DATE value.
Не совсем понял , а для чего нужно VT_DATE value?
Можете на пальцах объяснить какое отличие между форматами и зачем нужен именно этот формат?
В результате выполнения строки кода
var Today = GetTodayDate();
Today = Today.getVarDate();
Dataset.Values('DateOtk') = Today;
в поле таблицы вставляется формат: 2015-11-09 00:00:00.000
в реесте CRM выводится формат: 09.11.2015
какое будет отличие если код будет:
var Today = GetTodayDate();
Dataset.Values('DateOtk') = Today;
Ошибка преобразования типов будет.
В Terrasoft в разных случаях используют оба формата данных.
В одну сторону преобразование происходит с помощью «переменная_с_датой_1 = переменная_с_датой_2.getVarDate()», в другую — с помощью «переменная_с_датой_2 = new Date(переменная_с_датой_1)».
При работе с датасетами, фильтрами и подобным используется тот формат, что получается после «getVarDate».