Коллеги, нужна помощь.

В inputBox пытаюсь вывести колонку DateTime.

Сам вывод получился как то вот так:

Terrasoft.utils.inputBox("Make task value", function(result, arg) {
	if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
		alert(result);
	}
}, [{
		className: "Terrasoft.Button",
		caption: "Next",
		returnCode: "yes"
	}, "Cancel"],
	this,
	{
		name: {
			dataValueType: Terrasoft.DataValueType.TEXT,
			caption: "Caption",
			customConfig: {
				className: "Terrasoft.MemoEdit",
				height: "77px"
			},
			isRequired: true
		},
		startDate: {
			dataValueType: Terrasoft.DataValueType.DATE_TIME,
			caption: "Start date",
			customConfig: {
				className: "Terrasoft.Container",
				value: {"bindTo" : "startDate"},
				items: [
					{
						className: "Terrasoft.DateEdit",
						id: "newStartDateEdit",
						width: "50%"
					},
					{
						className: "Terrasoft.TimeEdit",
						id: "newStartTimeEdit",
						width: "50%"
					}
				]
		}
	}
}

Выглядит это дело вот так:

Изображение удалено.

 

При клике на кнопку Next закрывается форма и консоль в red-style с содержимым:

Uncaught TypeError: b[c].control.getValue is not a function

    at i.updateCustomControl (all-combined.js:formatted:79169)

    at i.onStateChanged (all-combined.js:formatted:78983)

    at i.fire (all-combined.js:formatted:6223)

    at i.continueFireEvent (all-combined.js:formatted:7144)

    at i.fireEventArgs (all-combined.js:formatted:7129)

    at i.fireEvent (all-combined.js:formatted:7120)

    at i. (all-combined.js:formatted:79078)

    at i.fire (all-combined.js:formatted:6223)

    at i.continueFireEvent (all-combined.js:formatted:7144)

    at i.fireEventArgs (all-combined.js:formatted:7129)

 

Кто сталкивался или кто знает как решить этот вопрос?

Нравится

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

потестил, он пытается взять value контейнера (этого сделать конечно же нельзя). А по другому никак, ибо Date_Time - это по сути контейнер из 2х других контролов. Можно попробовать раздробить

startDate: {
	caption: "Start date",
	dataValueType: Terrasoft.DataValueType.DATE_TIME,
	value: {"bindTo" : "startDate"},
	customConfig: {
		className: "Terrasoft.DateEdit"
	}
},
startTime: {
	caption: "Strat time",
	dataValueType: Terrasoft.DataValueType.DATE_TIME,
	value: {"bindTo" : "startDate"},
	customConfig: {
		className: "Terrasoft.TimeEdit"
	}
}

 

Пробовали, className: "Terrasoft.TimeEdit" напрочь отказывается показывать. В консоли сообщение о том что присутствует недопустимое значение.

В любом случае логика контролов с типами DATE_TIME и TIME фейлятся в inputBox, похоже это деффект платформы:



DATE_TIME

TIME

Господа, не знаю, что у вас там не работает... У меня завелось вот так:

Terrasoft.utils.inputBox("Make task value", function(result, args) {
	if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
		//alert(result);
		debugger;
		console.log(args);
	}
}, [{
		className: "Terrasoft.Button",
		caption: "Next",
		returnCode: "yes"
	}, "Cancel"],
	this,
	{
		kappa: {
			dataValueType: Terrasoft.DataValueType.TEXT,
			caption: "Caption",
			customConfig: {
				className: "Terrasoft.MemoEdit",
				height: "80px"
			},
			value: "",
			isRequired: true
		},
		startDate: {
			caption: "Start date",
			dataValueType: Terrasoft.DataValueType.DATE,
			value: new Date(),
			customConfig: {
				className: "Terrasoft.DateEdit"
			}
		},
		endDate: {
			caption: "Start time",
			dataValueType: Terrasoft.DataValueType.TIME,
			value: new Date(),
			customConfig: {
				className: "Terrasoft.TimeEdit"
			}
		}
});

Правды выглядит это всё сомнительно

И значения придётся вытаскивать из args, которые приходят из модуля в коллбеке.

 

ps. 12 часов ночи, чем я, блин, занимаюсь...

Так. всё. я вконец упоролся, но таки сделал.

Хочется передать привет товарищу из террасофта, который лепит затычки в Terrasoft.utils.controls.getControlConfigByDataValueType. Там в свитчере:

    switch (a) {
    case Terrasoft.DataValueType.TEXT:
        b = {
            className: "Terrasoft.TextEdit"
        };
    //тут куча других типов
    //....
    //А для 3х оставшихся сделать поленились
    case Terrasoft.DataValueType.GUID:
    case Terrasoft.DataValueType.DATE_TIME:
    case Terrasoft.DataValueType.BLOB:
        b = null
    }

Ну и то, что в итоге получилось у меня:

Terrasoft.utils.inputBox("Make task value", function(result, args) {
	if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
		//alert(result);
		debugger;
		console.log(args);
	}
}, [{
		className: "Terrasoft.Button",
		caption: "Next",
		returnCode: "yes"
	}, "Cancel"],
	this,
	{
		kappa: {
			dataValueType: Terrasoft.DataValueType.TEXT,
			caption: "Caption",
			customConfig: {
				className: "Terrasoft.MemoEdit",
				height: "80px"
			},
			value: "",
			isRequired: true
		},
		DateTimer: {
			dataValueType: Terrasoft.DataValueType.DATE_TIME,
			caption: "Start date",
			value: new Date(),
			customConfig: {
				className: "Terrasoft.Container",
				getValue: function() {
					//debugger;
					var dateValue = this.items.items[0].value;
					var timeValue = this.items.items[1].value;
					dateValue.setHours(timeValue.getHours());
					dateValue.setMinutes(timeValue.getMinutes());
					return dateValue;
				},
				items: [
					{
						className: "Terrasoft.DateEdit",
						id: "newStartDateEdit",
						value: new Date(),
						width: "50%"
					},
					{
						className: "Terrasoft.TimeEdit",
						id: "newStartTimeEdit",
						value: new Date(),
						width: "50%"
					}
				]
			}
		}
});

 

Варфоломеев Данила, отдельное вам спасибо!)

Кстати, как насчет вывода в InputBox справочных полей (Terrasoft.DataValueType.LOOKUP)

Есть идеи ?

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

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

Добрый день!

Подскажите, пожалуйста, как поменять программно дату в DateTimeControl?

Спасибо!

Нравится

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

как-то так например

		var ADate = new Date ((new Date(System.Now()).getYear()), Month, Day);
		dtcDateTimeControl.Value = ADate.getVarDate();

http://terrasoft.ru/sdk/!!MEMBEROVERVIEW_IDateTimeControl.html

Не работает, пишет "Неопознанная ошибка"...

откопипастили? ))
по пунктам
1) получить переменную типа Date
http://javascript.ru/Date

2) преобразовать к типу VT_DATE с которым работает Террасофт
http://msdn.microsoft.com/ru-ru/library/ie/4d4x3w61(v=vs.94).aspx

3) присвоить это значение вашему полю

var ADate = new Date ();
dtcDateTimeControl.Value = ADate.getVarDate();

Если вы присваиваете значение поля из датасета, то .getVarDate() не нужно

Если честно - откопипастил)

Сделал так:

var CurrentDate = new Date(DateTimeControl.value);
var Date1 = AddDateDays(CurrentDate ,30).getVarDate();
    dtcEnd100.value = Date1;

Почему-то перестало выдавать ошибку только в таком варианте.
Спасибо!

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

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

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».

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