Здравствуйте, помогите решить задачу, пожалуйста,

На странице редактирования выведены 2 поля: Оценка (число), Оценка традиционная (Справочник).

Справочник традиционная оценка содержит колонки Название (например Удовлетворительно), Балл от (напр. 50), Балл до (напр. 69).

Как сделать так, чтобы после ввода числового значения X в поле Оценка на странице редактирования, сравнивалось значение числа по справочнику [Балл от] < X < [Балл до], и затем в справочном поле Оценка традиционная заполнялось Id найденного значения?

Хотелось бы это сделать не процессом после сохранения и закрытия карточки, а именно на странице редактирования после изменения поля.

Колонки:

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

Справочник:

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

Нравится

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

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

attributes: {
	"UsrRatingLookup": {
		dependencies: [
			{
				columns: ["UsrRating"],
				methodName: "setRatingLookup"
			}
		]
	},
},
 
methods: {
	setRatingLookup: function() {
			var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
				rootSchemaName: "UsrRatingLookup"
			});
esq.addColumn("Id");
			esq.addColumn("Name");
			var esqIdFilter = esq.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.GREATER_OR_EQUAL, "UsrRatingMin", this.$UsrRating);
			esq.filters.add("esqFilter", esqIdFilter);
			var esqIdFilter2 = esq.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.LESS_OR_EQUAL, "UsrRatingMax", this.$UsrRating);
			esq.filters.add("esqFilter2", esqIdFilter2);
			esq.getEntityCollection(function (result) {
				if(result.success &amp;&amp; result.collection.collection.items.length&gt;0) {
					this.set("UsrRatingLookup", {value: result.collection.collection.get(0).get("Id"), displayValue: result.collection.collection.get(0).get("Name")});
				}
			}, this);
	},
}

 

Доброе утро.

 

Вам нужно Ваше поле сделать вычисляемым. Посмотрите на Академии пример, как это можно сделать, по ссылке.

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

Выполняется следующий порядок действий:

 

1) Открывается мини-карточка создания объекта Х

2) На мини-карточке есть справочное поле -- переходим к выбору его значений (открывается лукап объекта Y)

3) В лукапе есть кнопка "добавить" -- нажимаем, для добавления объекта Y

 

Происходит странное: лукап закрывается, остается мини-форма создания объекта X, а под ней полноценная карточка создания объекта Y. Это известная проблема? Есть способы ее решения?

Нравится

1 комментарий

Добрый день!

 

 

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

Рекомендуем в мини-карточках использовать для справочников выпадающий список.

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

Есть ли легитимная возможность определить источник вызова создания новой карточки?

Например, в контрагенте я выбираю Контакт, но могу нажать Добавить. В карточке контакта, в init или как-то еще можно определить Id контрагента, из которого вызвалось добавление?

Нравится

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

При открытии карточки контрагента, класть id контрагента в кэш. В карточке контакта считать значение из кэша.

Альтернативный вариант посылать на карточку контрагента сообщение, но карточка может не ловить сообщение.

Здравствуйте. Если не ошибаюсь, sandbox.id содержит гуид

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

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

 

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

Прошу подсказать - столкнулся с такой задачей:

Нужно добавить данные из иксель таблицы, но в справочнике нет импорта данных. 

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

В чем может быть проблема?

Нравится

1 комментарий

Добрый день.

 

Вносите данные через пункт [Импорт данных] главного меню:

 

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

Доброго времени суток коллеги. Как поставить значение по умолчанию в справочнике, так чтобы можно было поменять вручную. Имею контакт "Должность" - "Разработчик".

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

Мне нужно чтобы во всех случаях стояло "Маркетолог". И менять этот параметр когда будет надобно, то есть чтобы он был не заблокирован.  Тут  описан способ, но я не понял куда нужно вписать  "Reserved" . Прощу помощи, спасибо

Нравится

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

Установить константу. И выбираешь из списка.

Значение по умолчанию

Установить константу. И выбираешь из списка.

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

Добрый день, я сделал справочное поле мульти справочным

вот так

attributes: {
           "qrtClientAccountSigner": { // поле, в котором создаем мультилукап
              "dataValueType": this.Terrasoft.DataValueType.LOOKUP,
              "multiLookupColumns": ["qrtContact", "qrtCounterparty"]  // перечисляем созданные нами колонки, которые будет содержать мультилукап
          }
        },

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

Нравится

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

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

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

т.е вывести результат этого поля в реестре не выйдет?

и решение таковое, что выводим поля , по которым оно сформировано, а значения этих полей формируем при создании записи в мультисправочном поле

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

 

При выборе контрагента в мульти-поле Инвестор, контрагент сохраняется и в инвесторе и

Дублируется в поле Контрагент.

При выборе контакта в мультиполе Инвестор, Контакт заполняется в поле Контрагента, но сразу исчезает с детали

Из поля Инвестор, но в карточке детали в поле Инвестор отображается.

В другом объекте системы на подобной детали все наоборот. Сохраняются контракты в мультиполе на детали.

 

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

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

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

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

Нравится

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

Посмотрите BaseOpportunityPage в пакете Opportunity поле OpportunityClient

 

 

"Client": {
	"caption": {"bindTo": "Resources.Strings.Client"},
	"dataValueType": this.Terrasoft.DataValueType.LOOKUP,
	"multiLookupColumns": ["Contact", "Account"],
	"isRequired": true
}
....
 
{
	"operation": "insert",
	"parentName": "ProfileContainer",
	"propertyName": "items",
	"name": "OpportunityClient",
		"values": {
	    	"bindTo": "Client",
			"layout": {"column": 0, "row": 1, "colSpan": 24},
			"tip": {
				"content": {"bindTo": "Resources.Strings.ClientTip"}
			},
			"controlWrapConfig": {
				"classes": {"wrapClassName": ["client-edit-field"]}
			},
			"controlConfig": {
				"enableLeftIcon": true,
				"leftIconConfig": {"bindTo": "getMultiLookupIconConfig"}
			}
		},
		"alias": {
			"name": "Client",
			"excludeProperties": ["layout"],
			"excludeOperations": ["remove", "move"]
		}
	}





 

Посмотрите BaseOpportunityPage в пакете Opportunity поле OpportunityClient

 

 

"Client": {
	"caption": {"bindTo": "Resources.Strings.Client"},
	"dataValueType": this.Terrasoft.DataValueType.LOOKUP,
	"multiLookupColumns": ["Contact", "Account"],
	"isRequired": true
}
....
 
{
	"operation": "insert",
	"parentName": "ProfileContainer",
	"propertyName": "items",
	"name": "OpportunityClient",
		"values": {
	    	"bindTo": "Client",
			"layout": {"column": 0, "row": 1, "colSpan": 24},
			"tip": {
				"content": {"bindTo": "Resources.Strings.ClientTip"}
			},
			"controlWrapConfig": {
				"classes": {"wrapClassName": ["client-edit-field"]}
			},
			"controlConfig": {
				"enableLeftIcon": true,
				"leftIconConfig": {"bindTo": "getMultiLookupIconConfig"}
			}
		},
		"alias": {
			"name": "Client",
			"excludeProperties": ["layout"],
			"excludeOperations": ["remove", "move"]
		}
	}





 

Владимир Соколов,

Хорошо я вроде понял щас попробую

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

Здравствуйте. Давно думал как подойти к созданию справочника со страницей редактирования, как это реализовано в "Стадии продаж". Страницу редактирования для этого справочника я уже замучил, работает, но думаю все же нужно уже создавать новый справочник наконец.

В указанном справочнике страница редактирования "OpportunityStagePageV2", работает она понятно как, но как она вызывается не понятно.

Может у кого есть опыт с данным типом справочника?

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

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

Нравится

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

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

https://prnt.sc/vo7c2d

Если мне не изменяет память, делал так, создал деталь со страницей редактирования(через мастер раздела) и привязал ее к объекту справочника. Попробуйте так.

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

https://prnt.sc/vo7c2d

Если мне не изменяет память, делал так, создал деталь со страницей редактирования(через мастер раздела) и привязал ее к объекту справочника. Попробуйте так.

Через мастер деталей только.

Спасибо за ответы! Сам бы не за что не догадался

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

Есть необходимость перенести данные справочника Tax , включая id,на препрод

Я спросил как это правильно сделать, и мне посоветовали создать замещающий объект, но при попытке публикации пишет , что Элемент с именем "Tax" не найден

Для исправления ошибки, пробовал советы из этой темы  https://community.terrasoft.ru/questions/oshibka-sokhraneniya-element-n…

А именно генерацию исходных кодов, просто вылетает страница с ошибкой

А при компиляции всего, вылетает Элемент с именем "Tax" не найден

Нравится

1 комментарий

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

Если первое, то нужно, чтобы на базе, куда переностите, уже была такая схема и создавшаяся по ней после публикации таблица в БД. Или же схема создавалась или дополнялась в том же пакете, что и данные в неё. А наполнение справочника затем переносить при помощи привязки данных к пакету.

Если второе, то нужно не создавать объект или замещающий объект вручную, а переносить с сайта-источника готовую схему (или путём выгрузки в md-файл, или через SVN, или пакетами).

Объект Tax — стандартный, у Вас в нём есть какие-то доработки?

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

Есть раздел UsrTenant, в нем есть поле Room, принимающее значения из справочника UsrRoom. В свою очередь, в UsrRoom есть поле-справочник Shop, принимающее значение из справочника UsrShop. В UsrShop есть текстовое поле Name. Задача - показать в карточке UsrTenant значение UsrTenant.Room.Shop.Name (сделать привязку элемента управления на это значение), лучше в режиме "только чтение". Как это сделать?



Теоретически, можно прикрутить к UsrTenant атрибут, привязать к нему элемент управления в diff, в UsrTenant.onEntityInitialized() определять значение Room.Shop.Name через EntitySchemaQuery и присваивать его атрибуту. Но нет ли способа, позволяющего напрямую привязать элемент управления по такой иерархии? Что-то, может, вроде:

 

// Конечно, прямо в таком виде код не работает, выдается ошибка, 
// что невозможно найти колонку по конфигурации Room.Shop.Name
{
  "operation": "insert",
  "name": "ShopNameView",
  "values": {
    "layout": {
      "colSpan": 12,
      "rowSpan": 1,
      "column": 12,
      "row": 1,
      "layoutName": "Header"
    },
    "bindTo": "Room.Shop.Name",
    "enabled": false,
    "contentType": 5
  },
  "parentName": "Header",
  "propertyName": "items",
  "index": 3
}

 

Нравится

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

Добрый день.

 

В атрибутах добавляете виртуальное поле, которое будет отображаться в карточке:

			"DBMReady": {
				"dataValueType": Terrasoft.DataValueType.BOOLEAN,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"value": false
			}

В атрибутах указываете, какие поля справочного поля нужно ещё получить:

			"BTContactPatient": {
				"lookupListConfig": {
					"columns": ["BTDBMReady"]
				}
			},

Переопределяете метод onEntityInitialized - добавляете вызов метода, в котором будут считываться нужные значения из справочника и устанавливаться в виртуальные поля:

			onEntityInitialized: function() {
				this.callParent(arguments);
				if (!this.isNew) {
					this.setPatientFieldsValue();
					}
			},
			setPatientFieldsValue: function() {
				var patient = this.get("BTContactPatient");
				if (!patient) {
					return;
				}
				this.set("DBMReady", patient.BTDBMReady);
			},

 

Алла Савельева,

Добрый день. Может, я не совсем точно донес свою мысль...



В общем, моя ситуация такова, что BTDBMReady - не скалярное значение, а ссылка на справочник. И атрибуту на странице мне нужно присвоить, например, BTContactPatient.ВTDBMReady.CustomParameter (т.е. простым

ВTDBMReady.displayValue тут не обойтись). Можно ли это сделать без EntitySchemaQuery? 

Юрий, а почему не использовать EntitySchemaQuery?

Пример заполнения виртуальных полей таким образом есть в OpportunityMiniPage пакета Opportunity:

/**
 * Last activity in opportunity.
 * @type {Object}
 */
"LastActivity": {
	"dataValueType": Terrasoft.DataValueType.LOOKUP,
	"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
	"referenceSchemaName": "Activity"
},
 
/**
 * Last activity result caption in opportunity.
 * @type {String}
 */
"LastActivityCaption": {
	"dataValueType": Terrasoft.DataValueType.TEXT,
	"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
	"value": ""
},
...
onEntityInitialized: function() {
...
	this.getLastActivity();
...
	this.callParent(arguments);
},
...
/**
 * Gets last activity from opportunity.
 * @protected
 */
getLastActivity: function() {
	var esq = this.getLastActivitySelect();
	esq.getEntityCollection(function(response) {
		if (response &amp;&amp; response.success) {
			var collection = response.collection;
			if (collection.getCount() &gt; 0) {
var firstItem = collection.getByIndex(0);
this.setLastActivityAttributes(firstItem);
			}
		}
	}, this);
},
 
/**
 * Sets last activity attributes.
 * @protected
 * @param {Object} activity Activity object from response.
 */
setLastActivityAttributes: function(activity) {
	var date = this.getShortDate(activity.get("DueDate"));
	this.set("LastActivityCaption", Ext.String.format(
			this.get("Resources.Strings.LastActivityCaption"), date));
	this.set("LastActivity", {
		value: activity.get("Id"),
		displayValue: Ext.String.format("{0} / {1}", activity.get("CategoryName"),
				activity.get("StatusName"))
	});
},
 
/**
 * Gets last activity select.
 * @protected
 * @return {Terrasoft.EntitySchemaQuery} Last activity select query.
 */
getLastActivitySelect: function() {
	var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "Activity"
	});
	esq.rowCount = 1;
	esq.addColumn("Status.Name", "StatusName");
	esq.addColumn("ActivityCategory.Name", "CategoryName");
	var dueDate = esq.addColumn("DueDate");
	dueDate.orderPosition = 0;
	dueDate.orderDirection = Terrasoft.OrderDirection.DESC;
	this.setLastActivityRequestFilters(esq);
	return esq;
},
 
/**
 * Sets last activity filters.
 * @protected
 * @param {Terrasoft.EntitySchemaQuery} esq Activity select query.
 * @return {Terrasoft.EntitySchemaQuery} Activity select query with filter.
 */
setLastActivityRequestFilters: function(esq) {
	var id = this.get("Id");
	if (!Ext.isEmpty(id)) {
		esq.filters.add("opportunityFilter", Terrasoft.createColumnFilterWithParameter(
			Terrasoft.ComparisonType.EQUAL, "Opportunity", id));
	}
	return esq;
},

А если такого рода информацию нужно выводить неоднократно на разных страницах, можно сделать свой компонент в отдельной схеме и подключать его на странице, как это сделано для мультивалютного поля, выводящего и использующего информацию о валютах и курсах.

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