Доброго времени суток коллеги, я сделал все как описано тут , но при добавлении контактов не сохраняется значение в детали просидел уже все выходные. Пожалуйста помогите.
Создал объект: UsrCaseTest
- В этом объекте создал справочное поле UsrContact( родительский объект "Contact")
- Через мастера все добавил, настроил. Деталь работает справочное поле все показывает,
- После добавления значения не сохраняются.
- Код схемы детали:
// Определение схемы и установка ее зависимостей от других модулей.
define("UsrCaseTestDetail", ["ConfigurationEnums"],
function(configurationEnums) {
return {
// Название схемы объекта детали.
entitySchemaName: "UsrCaseTest",
// Методы схемы детали.
methods: {
//Возвращает колонки, которые выбираются запросом.
getGridDataColumns: function() {
return {
"Id": {path: "Id"},
"UsrContact": {path: "UsrContact"},
"UsrContact.Name": {path: "UsrContact.Name"}
};
},
openContactLookup: function() {
var config = {
entitySchemaName: "Contact",
multiSelect: true,
columns: ["Name"]
};
// Экземпляр класса [EntitySchemaQuery].
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
// Установка корневой схемы.
rootSchemaName: this.entitySchemaName
});
// Добавление колонки [Id].
esq.addColumn("Id");
// Добавление колонки [Id] из схемы [Document].
esq.addColumn("UsrContact.Id", "UsrContactId");
esq.getEntityCollection(function(result) {
var existsContactsCollection = [];
if (result.success) {
result.collection.each(function(item) {
existsContactsCollection.push(item.get("UsrContactId"));
});
}
// Добавление фильтра в конфигурационный объект.
if (existsContactsCollection.length > 0) {
var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
existsContactsCollection);
existsFilter.comparisonType = this.Terrasoft.ComparisonType.NOT_EQUAL;
existsFilter.Name = "existsFilter";
config.filters = existsFilter;
}
// Вызов модального окна справочника
this.openLookup(config, this.addCallBack, this);
}, this);
},// Обработчик события сохранения страницы редактирования.
onCardSaved: function() {
this.openContactLookup();
},//Открывает справочник документов в случае если страница редактирования заказа была ранее сохранена.
addRecord: function() {
var masterCardState = this.sandbox.publish("GetCardState", null, [this.sandbox.id]);
var isNewRecord = (masterCardState.state === configurationEnums.CardStateV2.ADD ||
masterCardState.state === configurationEnums.CardStateV2.COPY);
if (isNewRecord === true) {
var args = {
isSilent: true,
messageTags: [this.sandbox.id]
};
this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
return;
}
this.openContactLookup();
},// Добавление выбранных продуктов.
addCallBack: function(args) {
// Экземпляр класса пакетного запроса BatchQuery.
var bq = this.Ext.create("Terrasoft.BatchQuery");
// Коллекция выбранных в справочнике документов.
this.selectedRows = args.selectedRows.getItems();
// Коллекция, передаваемая в запрос.
this.selectedItems = [];
// Копирование необходимых данных.
this.selectedRows.forEach(function(item) {
item.UsrContactId = item.value;
bq.add(this.getDocumentInsertQuery(item));
this.selectedItems.push(item.value);
}, this);
// Выполнение пакетного запроса, если он не пустой.
if (bq.queries.length) {
this.showBodyMask.call(this);
bq.execute(this.onContactInsert, this);
}
},//Возвращает запрос на добавление текущего объекта.
getDocumentInsertQuery: function(item) {
var insert = Ext.create("Terrasoft.InsertQuery", {
rootSchemaName: this.entitySchemaName
});
insert.setParameterValue("UsrContact", item.UsrContactId, this.Terrasoft.DataValueType.GUID);
return insert;
},// Метод, вызываемый при добавлении записей в реестр детали.
onContactInsert: function(response) {
this.hideBodyMask.call(this);
this.beforeLoadGridData();
var filterCollection = [];
response.queryResults.forEach(function(item) {
filterCollection.push(item.id);
});
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: this.entitySchemaName
});
this.initQueryColumns(esq);
esq.filters.add("recordId", Terrasoft.createColumnInFilterWithParameters("Id", filterCollection));
esq.on("createviewmodel", this.createViewModel, this);
esq.getEntityCollection(function(response) {
this.afterLoadGridData();
if (response.success) {
var responseCollection = response.collection;
this.prepareResponseCollection(responseCollection);
this.getGridData().loadAll(responseCollection);
}
}, this);
},// Метод, вызываемый при удалении выбранных записей детали.
deleteRecords: function() {
var selectedRows = this.getSelectedItems();
if (selectedRows.length > 0) {
this.set("SelectedRows", selectedRows);
this.callParent(arguments);
}
},// Скрыть пункт меню [Копировать].
getCopyRecordMenuItem: Terrasoft.emptyFn,
// Скрыть пункт меню [Изменить].
getEditRecordMenuItem: Terrasoft.emptyFn,
// Возвращает имя колонки по умолчанию для фильтра.
getFilterDefaultColumnName: function() {
return "UsrContact";
}
},
// Массив модификаций.
diff: /**SCHEMA_DIFF*/[
{
// Тип операции — слияние.
"operation": "merge",
// Название элемента схемы, над которым производится действие.
"name": "DataGrid",
// Объект, свойства которого будут объединены со свойствами элемента схемы.
"values": {
"rowDataItemMarkerColumnName": "UsrContact"
}
},
{
// Тип операции — слияние.
"operation": "merge",
// Название элемента схемы, над которым производится действие.
"name": "AddRecordButton",
// Объект, свойства которого будут объединены со свойствами элемента схемы.
"values": {
"visible": {"bindTo": "getToolsVisible"}
}
}
]/**SCHEMA_DIFF*/
};
}
); -
Код карточки контакта: define("ContactPageV2", [], function() {
return {
entitySchemaName: "Contact",
attributes: {},
modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
details: /**SCHEMA_DETAILS*/{
"UsrCaseDetail": {
"schemaName": "UsrCaseTestDetail",
"entitySchemaName": "UsrCaseTest",
"filter": {
"detailColumn": "UsrContact",
"masterColumn": "Id"
}
}
}/**SCHEMA_DETAILS*/,
businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
methods: {},
dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
diff: /**SCHEMA_DIFF*/[****]/**SCHEMA_DIFF*/};
Нравится
Ислам Ибрагимжанов,
У вас деталь (UsrCaseTest) привязана к карточке Контактов (Contact) по полю UsrContact.
Допустим, вы находитесь в карточке ИвановИван
Выбирая в вашем справочнике значения - вы в базу пишете в ту же колонку UsrContact значения, которые выбрали, допустим вы выбрали 2 значения ПетровПетр и СидоровСидр.
Итого у вас в табличке UsrCaseTest запишутся значения:
ПетровПетр и СидоровСидр
Как вы хотите чтобы они отобразились в вашей карточке ИвановИван? У вас на детали стоит фильтр - отображать из таблицы UsrCaseTest те записи, в поле UsrContact лежит Id текущей записи - ИвановИван. Добавленные же записи вы сможете увидеть в карточке ПетровПетр или СидоровСидр (в соответствии с фильтром).
Чтобы все работало верно - посмотрите еще раз пример на академии.
Вам нужно 2 поля. Первое - связь с карточкой - по нему у вас привязана деталь UsrContact. Второе - в которое должны складываться выбранные значения. Пусть будет UsrSelectedContact. Исправляете в коде методы которые я говорил - и должно работать
Судя по коду, вы забываете заполнять колонку связи с вашим объектом (основной карточкой). Обратите внимание на функцию getDocumentInsertQuery в примере. Там заполняются 2 поля:
UsrOrder //связь с карточкой
UsrDocument // документ (то что выбираем из справочника)
Также обратите внимание на функцию addCallBack. В ней как раз и прокидывают поле связи с карточкой. Вы этот код также вырезали.
Fast traslate
Icon translate
Дмитрий Антохин,
Я их вырезал, потому что не смог понять зачем мне второй справочник. И после вашего ответа, так же мне не стало понятней, о какой связи идет речь? Можете пожалуйста более понятно описать, что я делаю не так или пропускаю.
Ислам Ибрагимжанов,
У вас деталь (UsrCaseTest) привязана к карточке Контактов (Contact) по полю UsrContact.
Допустим, вы находитесь в карточке ИвановИван
Выбирая в вашем справочнике значения - вы в базу пишете в ту же колонку UsrContact значения, которые выбрали, допустим вы выбрали 2 значения ПетровПетр и СидоровСидр.
Итого у вас в табличке UsrCaseTest запишутся значения:
ПетровПетр и СидоровСидр
Как вы хотите чтобы они отобразились в вашей карточке ИвановИван? У вас на детали стоит фильтр - отображать из таблицы UsrCaseTest те записи, в поле UsrContact лежит Id текущей записи - ИвановИван. Добавленные же записи вы сможете увидеть в карточке ПетровПетр или СидоровСидр (в соответствии с фильтром).
Чтобы все работало верно - посмотрите еще раз пример на академии.
Вам нужно 2 поля. Первое - связь с карточкой - по нему у вас привязана деталь UsrContact. Второе - в которое должны складываться выбранные значения. Пусть будет UsrSelectedContact. Исправляете в коде методы которые я говорил - и должно работать
Дмитрий Антохин,
Вот теперь я четко понял, что не так. Благодарю за уделенное время. Все сработало с первого раза.