Отображаемое поле в 7.х

Товарищи, это что же получается? Пишешь пишешь код, а тут бац - в модной 7ой версии не могу сделать отображаемое поле :( просветите, люди добрые примером что-ли?

Конкретизируем задачу для облегчения понимания. На странице редактирования Контакта хочу увидеть не только название Контрагента (поле Контрагент), а еще и его Код, или Альтернативное название.
Про реестр в карточке знаю - можно сделать деталью подробную информацию, а вот просто обычное тестовое поле со значением Кода как?

Не хочу я добавлять новое поле в объект Контакт, оно ж в таблице создастся, а это против самой сути реляционной базы данных идет - ну зачем мне лишние поля... а если отобразить я их штук 10 захочу?

Вот как это сделать в 2.х, 3.х, 5х знаю, а как в 7.х - не знаю...

Нравится

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

Интересный вопрос. Возможно, его можно решить с помощью Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN ?

"Салихов А" написал:Возможно его можно решить с помощью Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN ?

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

Возможно это поможет:

{
type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
name: 'ReverseAccountA',
caption: resources.localizableStrings.AccountCaption,
columnType: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
dataValueType: Terrasoft.DataValueType.LOOKUP,
customConfig: {
	enabled: false
},
rules: [{
	ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
	property: BusinessRuleModule.enums.Property.VISIBLE,
	conditions: [{
		leftExpression: {
			type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
			attribute: 'RelationTypeFilter'
 
		},
		comparisonType: Terrasoft.core.enums.ComparisonType.EQUAL,
		rightExpression: {
			type: BusinessRuleModule.enums.ValueType.CONSTANT,
			value: 'Account'
		}
	}]
}],
dependencies: ['AccountB'],
methodName: 'setReverseAccountA'
},
......
 
 
		this.methods.setReverseAccountA = function() {
			var accountB = this.get('AccountB');
			if (accountB) {
				this.set('ReverseAccountA', accountB);
			} else {
				this.set('ReverseAccountA', null);
			}
		};

Нашел в RelationshipDetailPage

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

"Салихов А" написал:Нашел в RelationshipDetailPage

Вот так по кирпичикам может и решиться вопрос) Спасибо за наводку, покопаюсь там. Смущает только то, что это опять же реестр и его колонки - в него то можно и вьюшку сделать да из нее все тащить.

"Салихов А" написал:кроме как делать запрос в бд в методе и результат записывать в виртуальное поле

Это понятно, вопрос как поле то на форме редактирования создать... заполнить его я сумею

Может с горя label какой создать, да его текст нужный прописывать...

Скорее всего вопрос изначальный можно переформулировать - как создать на странице редактирования некое поле или визуальный объект типа label или ему подобный, и при этом не связывать его с данными. Создавать видимо надо кодом, так как мастер не предлагает ничего кроме полей данных.
Как назначить ему текст/значение/прочее в скрипте примеры есть.

"Александр Кудряшов" написал:Смущает только то, что это опять же реестр и его колонки - в него то можно и вьюшку сделать да из нее все тащить.

Не, это не реестр) Это страница редактирования записи детали, но не сама деталь.

"Салихов А" написал:Не, это не реестр) Это страница редактирования записи детали, но не сама деталь.

Так, пойду прямо сейчас читать код да разбираться с ней :smile:

Выложите потом результат, если все получится)

С помощью вот такой чудо конструкции создал label.

{
	"operation": "insert",
	"parentName": "Header",
	"propertyName": "items",
	"name": "label_name",
	"values": {
		itemType: Terrasoft.ViewItemType.LABEL,
		"caption": "Test3",
		"layout": {
			"column": 10,
			"row": 5,
			"colSpan": 12,
			"rowSpan": 1
		}
	}
}

Дальше в общем то надо просто при открытии/обновлении писать туда нужный текст, вытащенный как угодно, запросом через EntityShemaQuery например.

Остался осадочек.
1. Terrasoft.ViewItemType.LABEL написал наугад, не нашел список возможных значений нигде, что лишний раз говорит о безобразном состоянии документации.
2. Это все ж label, а хотелось бы просто TextEdit (стандартно создается поле, где обязателен параметр bind to, а биндить то мне понятно некуда). Гадать, какой ViewItemType будет содержать нужное значение неохота.

Как доделаю полностью заполнение caption по событиям, выложу сюда.

"Александр Кудряшов" написал:1. Terrasoft.ViewItemType.LABEL написал наугад

А как же консоль браузера? Там можно вытащить все значения.

"Салихов А" написал:А как же консоль браузера? Там можно вытащить все значения.

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

Коллеги, постараюсь Вам помочь в Ваших мучениях)
В принципе, направление мысли правильное, только непонятно, для чего делать еще один запрос для получения значения дополнительного поля, если можно это сделать в уже текущем запросе (см. http://www.community.terrasoft.ru/forum/topic/10906).
В целом, решение добавления колонки "Альтернативное название контрагента" может выглядеть следующим образом:

attributes: {
	"Account": {
		lookupListConfig: {
			columns: ["AlternativeName"]
		}
	},
	"AccountAlternativeName": {
		dataValueType: Terrasoft.DataValueType.TEXT,
		type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
	}
},
methods: { 
	onEntityInitialized: function() {
		this.callParent();
		var account = this.get("Account");
		var accountAlternativeName = account ? account.AlternativeName : "";
		this.set("AccountAlternativeName", accountAlternativeName);
	}
}
diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"parentName": "Header",
		"propertyName": "items",
		"name": "AccountAlternativeName",
		"values": {
			"layout": {"column": 12, "row": 3, "colSpan": 12},
			"caption": "Альтернативное название контрагента" //лучше использовать локализированную строку
		}
	}
//...
]/**SCHEMA_DIFF*/

Андрей, огромное спасибо!
Добавил динамически меняющееся значение поля при изменении контрагента в карточке

methods: {
	getAccountCode: function() {
		var account = this.get("Account");
		var accountAlternativeName = account ? account.AlternativeName : "";
		this.set("AccountAlternativeName", accountAlternativeName);
	}
}
attributes: {
	"AccountAlternativeName": {
		dataValueType: Terrasoft.DataValueType.TEXT,
		type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		dependencies: [
			{
				columns: ["Account"],
				methodName: "getAccountCode"
			}
		]
	}
}

Использую динамические поля в детали...но потом не могу отобразить в виде колонок. Как это сделать?

"Юсупов Марат" написал:Использую динамические поля в детали...но потом не могу отобразить в виде колонок. Как это сделать?

А никак, в реестре вы можете вывести только физические колонки.

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