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

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

Создал объект: UsrCaseTest

  1. В этом объекте создал справочное поле UsrContact( родительский объект "Contact")
  2. Через мастера все добавил, настроил. Деталь работает справочное поле все показывает,

    Изображение удалено.
  3. После добавления значения не сохраняются. 

    Изображение удалено.
  4. Код схемы детали: 

     

    // Определение схемы и установка ее зависимостей от других модулей.

    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*/

            };

        }

    );

  5. Код карточки контакта: 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*/};

Нравится

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

Ислам Ибрагимжанов,

У вас деталь (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. Исправляете в коде методы которые я говорил - и должно работать

Дмитрий Антохин,

Вот теперь я четко понял, что не так. Благодарю за уделенное время. Все сработало с первого раза.

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