Технические вопросы
7.x

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

В эту деталь (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();

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

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

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

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


[javascript]
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;
}
[/javascript]

Да, пока писал вроде понял, что 100% неверно здесь:
[javascript]
esq.addColumn("Name", "ParamName");
esq.addColumn("UsrContactLoyalty.Name", "ContactLoyalty");
esq.addColumn("UsrContactLoyalty", "LoyaltyObj");
[/javascript]
Поле UsrParam, - ссылается на справочник с полями: Name, Description и справочным полем UsrLoyalty.

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

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

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

[javascript]
insert.execute(function() {
this.updateDetails();
, this);
[/javascript]

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

ого..... Всё, что можно было написать неправильно, тут неправильно xDD как оно вообще работает?)) должно же быть примерно так:
[javascript]
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) {
/*коллбэк вставки записей в бд*/
}
[/javascript]

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

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

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

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


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

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

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

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

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

[javascript]
"Files": {
"schemaName": "FileDetailV2",
"entitySchemaName": "CaseFile",
"filter": {
"masterColumn": "Id",
"detailColumn": "Case"
}
},
[/javascript]

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

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

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

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

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