Вопрос

Добрый день, коллеги!

Как вы добиваетесь в английской версии bpm'online того, чтобы в фильтрах Week начинался не с воскресенья, а с понедельника?

Спасибо

У меня такой же вопрос

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

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

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

В данном случае можно было бы сразу предусмотреть возможность 'более гибкой' работы с этой функциональностью!  

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

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

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

В данном случае можно было бы сразу предусмотреть возможность 'более гибкой' работы с этой функциональностью!  

Да, некоторые вещи в системе непонятно почему захардкодены...

Уже в версии 7.12.3 получили какие-то изменения, но опять привязали Европу к американским стандартам :(

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

esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                                rootSchemaName: "CurrencyRate"
                                                        });
                                                        esq.addColumn("Rate");
                                                        //var startDate = esq.addColumn('StartDate');
                                                        //startDate.orderDirection = Terrasoft.OrderDirection.DESC;
                                                       
                                                        var yesterday = new Date();
                                                        var tomorrow = new Date();
                                                        yesterday.setDate(tomorrow.getDate() - 1);
                                                        tomorrow.setDate(tomorrow.getDate() + 1);
                                                       
                                                        esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                                        this.Terrasoft.ComparisonType.EQUAL, "Currency", this.get("LogCurrencyRow").value));
                                                        esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                                        this.Terrasoft.ComparisonType.GREATER, "Startdate", yesterday));
                                                        esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                                        this.Terrasoft.ComparisonType.LESS, "Startdate", tomorrow));

                                                        esq.getEntityCollection(function(response) {
                                                                if (response.success) {
                                                                        response.collection.each(function(item) {
                                                                                CurrencyRate = item.get("Rate");
                                                                        }, this);
                                                                }
                                                                else if (CurrencyRate === 0)
                                                                {

Не могу разобраться с датой. Без даты работает.
Что не так?
Помогите пож-та.

У меня такой же вопрос

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

"Юсупов Марат" написал:esq.addColumn('StartDate');

"Юсупов Марат" написал:this.Terrasoft.ComparisonType.GREATER, "Startdate", yesterday))

Так StartDate или Startdate? А вообще, хотелось бы увидеть скрин консоли с ошибкой)

Также обратите внимание, что в переменную yesterday и tomorrow попадёт текущее время:

yesterday
Sun Mar 19 2017 16:14:13 GMT+0300 (RTZ 2 (зима))
tomorrow
Tue Mar 21 2017 16:14:13 GMT+0300 (RTZ 2 (зима))

Для "чистоты" запроса можно его подправить:

yesterday = Terrasoft.startOfDay(yesterday)
Sun Mar 19 2017 00:00:00 GMT+0300 (RTZ 2 (зима))
tomorrow = Terrasoft.endOfDay(tomorrow)
Tue Mar 21 2017 23:59:59 GMT+0300 (RTZ 2 (зима))

Данила, спасибо.
Привыкнуть не могу что регистр важен.
Заработало, спасибо.

var LogCurrencyUpper = this.get("LogCurrencyRow"); //.value; toUpperCase()
 
							esq = Ext.create("Terrasoft.EntitySchemaQuery", {
								rootSchemaName: "CurrencyRate"
							});
							esq.addColumn("Rate");
							var yesterday = new Date();
							yesterday = Terrasoft.startOfDay(yesterday)
							var today = new Date();
							today = Terrasoft.endOfDay(today)
 
							esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
									this.Terrasoft.ComparisonType.EQUAL, "Currency", this.get("LogCurrencyRow").value));
							esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
									this.Terrasoft.ComparisonType.GREATER, "StartDate", yesterday));
							esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
									this.Terrasoft.ComparisonType.LESS, "StartDate", today));
 
							esq.getEntityCollection(function(response) {
								if (response.success) {
									response.collection.each(function(item) {
										CurrencyRate = item.get("Rate");
									}, this);
								}
								else if (CurrencyRate === 0)
								{
//код
								}

Спасибо еще раз. :smile:

Чтото перестало работать
ошибка в консоли

Error while sending request 
	response status: 500 (FormatException)
	request url: ../DataService/json/SyncReply/SelectQuery
	method: POST
	request data: {"rootSchemaName":"CurrencyRate","operationType":0,"filters":{"items":{"b5859fc2-36c6-4b78-a147-1a8f8cbff7cd":{"filterType":1,"comparisonType":3,"isEn...
var _tomorrow = new Date();
							_tomorrow.setDate(_tomorrow.getDate() + 1);
							var _yesterday = new Date();
							_yesterday.setDate(_yesterday.getDate() - 1);
 
							_tomorrow = Terrasoft.endOfDay(_tomorrow);
							_yesterday = Terrasoft.startOfDay(_yesterday);
 
 
							esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
									this.Terrasoft.ComparisonType.EQUAL, "Currency", LogCurrencyRow));
							esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
									this.Terrasoft.ComparisonType.GREATER, "StartDate", _yesterday));
							esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
									this.Terrasoft.ComparisonType.LESS, "StartDate", _tomorrow));
 
							esq.getEntityCollection(function(response) {
 
}
 
								else
								{
									}

Интересная вещь в хроме время нормальное показывает, а в файрфоксе по гринвичу.
Данный главное есть.

Id CreatedOn CreatedById ModifiedOn ModifiedById StartDate EndDate CurrencyId Rate ProcessListeners RateMantissa
906BD40D-2955-4E62-9F84-44B46CB6F5BF 2017-03-22 10:08:54.057 NULL 2017-03-22 10:08:54.057 NULL 2017-03-22 NULL C0057119-53E6-DF11-971B-001D60E938C6 62.2699 0

Еще нашел такое у responce

В "{0}" ожидалось шестнадцатеричное значение 0x.

Нашел свой косяк.

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                                                        this.Terrasoft.ComparisonType.EQUAL, "Currency", LogCurrencyRow.value));
Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Доброго времени суток всем!

JavaScript, используемый в открытом коде платформы 3.х поддерживает прекрасный объект Date, позволяющий управлять контролом календаря, полями типа Даты и Времени.
Тема, как оказалось, очень занимательна и интересна. С временем можно производить арифметические операции. Причем, не только прибавлять или вычитать из даты часы/минуты/секунды, дату можно умножить на число!

Начнем с простого - создадим объект даты:

var MyDateVariable = new Date(); //дата по умолчанию, в зависимости от среды выполнения, может быть 01.01.1970г. 0:00 например.

А если хотим в объект поместить сразу текущую дату и время:

var MyDateVariable = new Date(System.Now());

Нужно получить текущее значение минут?

var MyDateVariable = new Date(System.Now());
MyDateVariable .getMinutes()

А давайте положим в объект Data какую-то дату:

var MyDateVariable = new Date(2012, 10, 23);
var MyDateTimeVariable = new Date(2012, 10, 30, 23, 59); // = 30.10.2012 23:59
var MyDateTimeVariable = new Date(Dataset.Values('Date')); // при условии, что задан Dataset

Изменим дату:

var MyDateVariable = new Date(2012, 10, 23);
MyDateVariable.setMinutes(30);

Добавим немного Service Desk в XRM! :smile:

function FillDates(Dataset) {
    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).

Функция есть, осталось только поместить ее вызов в нужные места:

  1. Событие OnPrepare карточки редактирования: function wnd_IncidentEditOnPrepare(Window) перед закрывающей скобкой
  2. Обработчик события function DataChange(DataField) также поместил условие:
    if (Name == 'PriorityID') {
        FillDates(Dataset);
    }

'{0FF5CCF3-8260-4E66-B47C-AF239777EFAB}' - значение TimeUnitID из ds_IncidentPriority.

Поделиться

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

"Фильковский Павел" написал:
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.

А как можно получить текущую дату без времени?

ExtractDate(new Date(System.Now()));

А что делает 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».

Войдите или зарегистрируйтесь, чтобы комментировать