Добавление записей детали

В эту деталь (UsrLoyaltyObj)
Пустая Деталь

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

Полазив на форуме, сказали что делается это через InsertQuery, и что я пробовал:

var insert = Ext.create("Terrasoft.InsertQuery", {
                                        rootSchemaName: "UsrLoyaltyObj"
                                });
insert.setParameterValue("UsrParam", item, Terrasoft.DataValueType.GUID);
insert.setParameterValue("UsrLoyalty", item.get("LoyaltyObj"), Terrasoft.DataValueType.GUID);
insert.execute();
this.updateDetails();

Где, UsrParam и UsrLoyalty - справочные поля детали. А Item элемент коллекции из EntitySchemaQuery.

Но, после вставки этого значения выдает ошибку в консоле:
Ошибка вставки

Означает, что я где-то что-то не так или не туда делаю вставку?

Нравится

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

Ага, и есть еще одна проблема. Даже если вручную добавить записи (при помощи "+" действия), и сохранить изменения и выйти, то когда заходишь в карточку опять - записи исчезают.

Аналогично, записи исчезают после метода: this.updateDetails();

Значит я где-то не донастроил деталь?

А можно пример всего кода, ибо на первый взгляд все выглядит крайне неправильно)

"Варфоломеев Данила" написал:

А можно пример всего кода, ибо на первый взгляд все выгляди крайне неправильно)

getInsertLtyParamDetailQuery: function() {
				var insert = Ext.create("Terrasoft.InsertQuery", {
					rootSchemaName: "UsrLoyaltyObj"
				});
				var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
					rootSchemaName: "UsrRefLoyaltyParams"
				});
				esq.addColumn("Name", "ParamName");
				esq.addColumn("UsrContactLoyalty.Name", "ContactLoyalty");
				esq.addColumn("UsrContactLoyalty", "LoyaltyObj");
 
				var contactLty = this.get("UsrLoyalty");
				var esqLtyFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
					"UsrContactLoyalty.Name", contactLty.displayValue);
				esq.filters.add(esqLtyFilter);
				esq.getEntityCollection(function(result) {
					if (!result.success) {
 
					     result.collection.each(function(item) {
 
insert.setParameterValue("UsrParam", item, Terrasoft.DataValueType.LOOKUP);
insert.setParameterValue("UsrLoyalty", item.get("LoyaltyObj"), Terrasoft.DataValueType.LOOKUP);
					    });
                                       }
 
				}, this);
				insert.execute();
				return insert;
			}

Да, пока писал вроде понял, что 100% неверно здесь:

esq.addColumn("Name", "ParamName");
				esq.addColumn("UsrContactLoyalty.Name", "ContactLoyalty");
				esq.addColumn("UsrContactLoyalty", "LoyaltyObj");

Поле UsrParam, - ссылается на справочник с полями: Name, Description и справочным полем UsrLoyalty.

Но еще остается вопрос с пропадающими записями...

Здравствуйте, Илья.

1) Ошибка, показанная Вами на скриншоте, указывает на то, что в InsertQuery была добавлена колонка UsrParam несколько раз. Возможно это возникает по причине того, что this.UpdateQuery вызывается до того, как прошел INSERT запрос. Рекомендую Вам обновлять деталь в функции обратного вызова метода execute. Пример:

insert.execute(function() {
	this.updateDetails();
, this);

2) Записи на детали пропадать по следующим причинам: не настроенные колонки для реестра детали или же некорректное связывание детали и карточки (что более вероятно).

ого..... Всё, что можно было написать неправильно, тут неправильно xDD как оно вообще работает?)) должно же быть примерно так:

getInsertLtyParamDetailQuery: function() {
	var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "UsrRefLoyaltyParams"});
	esq.addColumn("Name", "ParamName");
	esq.addColumn("UsrContactLoyalty.Name", "ContactLoyalty");
	esq.addColumn("UsrContactLoyalty", "LoyaltyObj");
 
	var contactLty = this.get("UsrLoyalty");
	esq.filters.addItem(esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrContactLoyalty.Name", contactLty.displayValue));
	esq.getEntityCollection(function(result) {
		 if (result.success) {
				var batchQuery = Ext.create("Terrasoft.BatchQuery");
				result.collection.each(function(item) {
					var insertQuery = Ext.create("Terrasoft.InsertQuery", { rootSchemaName: "UsrLoyaltyObj" });
					insertQuery.setParameterValue("UsrParam", item.get("Id"), Terrasoft.DataValueType.GUID);
					insertQuery.setParameterValue("UsrLoyalty", item.get("LoyaltyObj").value, Terrasoft.DataValueType.GUID);
					batchQuery.add(insertQuery);
				 }, this);
				batchQuery.execute(this.insertQueryCallback, this);
			}
	}, this);
},
insertQueryCallback: function(result) {
	/*коллбэк вставки записей в бд*/
}

"Мотков Илья" написал:
2) Записи на детали пропадать по следующим причинам: не настроенные колонки для реестра детали или же некорректное связывание детали и карточки (что более вероятно).

Я создавал деталь через мастер деталей, по идее же все само должно было связаться.
Но если это не так, то каким образом это сделать?
Из этой статьи https://academy.terrasoft.ru/documents/technic-sdk/7-8/sozdanie-detali-…
не вариант, т.к. нет доступа к БД (или как это называется, локальный режим)...

"Варфоломеев Данила" написал:

ого..... Всё, что можно было написать неправильно, тут неправильно xDD как оно вообще работает?)) должно же быть примерно так:


Спасибо, вроде работает (по крайней мере без ошибок), но результата не видно, т.к. обновление деталей сбрасывает все записи детали.

Илья. Деталь сама по себе является таблицей в базе данных и в ней хранятся все записи, добавляемые в неё из любого места где она выведена. При добавлении детали на карточку через Мастер разделов, Вы выбираете поля для связи детали с карточкой. По этим полям происходит фильтрация (в момент добавления записи с колонки карточки будет взято значение и записано в выбранную колонку детали).

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

Аналогично происходит и в Вашем случае, запись видна пока не будет обновлен реестр, поскольку запись не проходит фильтрацию.

Колонки, по которым происходит фильтрация можно посмотреть, как в Мастере разделов, так и в самой схеме карточки. Пример из схемы CasePage для детали Файлы и ссылки:

"Files": {
	"schemaName": "FileDetailV2",
	"entitySchemaName": "CaseFile",
	"filter": {
		"masterColumn": "Id",
		"detailColumn": "Case"
	}
},

В данном случае фильтрация происходит по колонке Id обращения и колонке Case детали.

"Мотков Илья" написал:

СПАСИБО!!! Назначил фильтр правильно по моим ячейкам, и все заработало.

И, что удивительно, 200+ записей было внесено, т.о. код выше работает, просто не отображался (фильтровался).

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