Вопрос

Проблема с созданием детали с выбором из справочника

Всем привет!

Проблема заключается в том что следуя инструкции "https://academy.terrasoft.ru/documents/technic-sdk/7-12/sozdanie-detali-s-vyborom-iz-spravochnika" появляется ошибка при попытки добавить элементы из справочника:

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

Кто знает как решить проблему?

Объект детали "UsrProductsAndITStuff" имеют 2 lookup:

Title:       Productu Categorija и Product

Name:    UsrProductcategory и UsrDarbopriemones

Lookup:  Product category     и Product

Код: 

// Определение схемы и установка ее зависимостей от других модулей.
define("UsrSchema24Detail", ["ConfigurationEnums"],
    function(configurationEnums) {
        return {
            // Название схемы объекта детали.
            entitySchemaName: "UsrProductsAndITstuff",
            // Методы схемы детали.
            methods: {
                //Возвращает колонки, которые выбираются запросом.
                getGridDataColumns: function() {
                    return {
                        "Id": {path: "Id"},
                        "Product": {path: "UsrDarbopriemones"},
                        "Product.Name": {path: "UsrDarbopriemones.Name"}
                    };
                },
 
                //Конфигурирует и отображает модальное окно справочника.
                openDocumentLookup: function() {
                    //Конфигурационный объект
                    var config = {
                        // Название схемы объекта, записи которого будут отображены в справочнике.
                        entitySchemaName: "Product",
                        // Возможность множественного выбора.
                        multiSelect: true,
                        // Колонки, которые будут использованы в справочнике, например, для сортировки.
                        columns: ["Name", "Code", "Type", "Color"]
                    };
                    var ProductCategoryId = this.get("MasterRecordId");
                    if (this.Ext.isEmpty(ProductCategoryId)) {
                        return;
                    }
                    // Экземпляр класса [EntitySchemaQuery].
                    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                        // Установка корневой схемы.
                        rootSchemaName: this.entitySchemaName
                    });
 
 
                    // Добавление колонки [Id].
                    esq.addColumn("Id");
                    // Добавление колонки [Id] из схемы [darbo priemones].
                    esq.addColumn("Product.Id", "ProductId");
 
                    // Создание и добавление фильтров в коллекцию запроса.
                    esq.filters.add("filterProductCategory", this.Terrasoft.createColumnFilterWithParameter(
                        this.Terrasoft.ComparisonType.EQUAL, "UsrProductcategory", ProductCategoryId)); 
 
                    // Получение всей коллекции записей и отображение ее в модальном окне справочника.
                    esq.getEntityCollection(function(result) {
                        var existsDocumentsCollection = [];
                        if (result.success) {
                            result.collection.each(function(item) {
                                existsDocumentsCollection.push(item.get("ProductId"));
                            });
                        }
                        // Добавление фильтра в конфигурационный объект.
                        if (existsDocumentsCollection.length > 0) {
                            var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
                                existsDocumentsCollection);
                            existsFilter.comparisonType = this.Terrasoft.ComparisonType.NOT_EQUAL;
                            existsFilter.Name = "existsFilter";
                            config.filters = existsFilter;
                        }
                        // Вызов модального окна справочника
                        this.openLookup(config, this.addCallBack, this);
                    }, this);
                },
 
                // Обработчик события сохранения страницы редактирования.
                onCardSaved: function() {
                    this.openDocumentLookup();
                },
 
                //Открывает справочник документов в случае если страница редактирования заказа была ранее сохранена.
                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.openDocumentLookup();
                },
 
 
 
                // Добавление выбранных продуктов.
                addCallBack: function(args) {
                    // Экземпляр класса пакетного запроса BatchQuery.
                    var bq = this.Ext.create("Terrasoft.BatchQuery");
                    var ProductCategoryId = this.get("MasterRecordId");
                    // Коллекция выбранных в справочнике документов.
                    this.selectedRows = args.selectedRows.getItems();
                    // Коллекция, передаваемая в запрос.
                    this.selectedItems = [];
                    // Копирование необходимых данных.
                    this.selectedRows.forEach(function(item) {
                        item.ProductCategoryId = ProductCategoryId;
                        item.ProductId = item.value;
                        bq.add(this.getDocumentInsertQuery(item));
                        this.selectedItems.push(item.value);
                    }, this);
                    // Выполнение пакетного запроса, если он не пустой.
                    if (bq.queries.length) {
                        this.showBodyMask.call(this);
                        bq.execute(this.onDocumentInsert, this);
                    }
                },
 
                //Возвращает запрос на добавление текущего объекта.
                getDocumentInsertQuery: function(item) {
                    var insert = Ext.create("Terrasoft.InsertQuery", {
                        rootSchemaName: this.entitySchemaName
                    });
                    insert.setParameterValue("UsrProductcategory", item.ProductCategoryId, this.Terrasoft.DataValueType.GUID);
                    insert.setParameterValue("UsrDarbopriemones", item.ProductId, this.Terrasoft.DataValueType.GUID);
                    return insert;
                },
 
                //Метод, вызываемый при добавлении записей в реестр детали.
                onDocumentInsert: 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.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 "UsrDarbopriemones";
                }
            },
            // Массив модификаций.
            diff: /**SCHEMA_DIFF*/[
                {
                    // Тип операции — слияние.
                    "operation": "merge",
                    // Название элемента схемы, над которым производится действие.
                    "name": "DataGrid",
                    // Объект, свойства которого будут объединены со свойствами элемента схемы.
                    "values": {
                        "rowDataItemMarkerColumnName": "UsrDarbopriemones"
                    }
                },
                {
                    // Тип операции — слияние.
                    "operation": "merge",
                    // Название элемента схемы, над которым производится действие.
                    "name": "AddRecordButton",
                    // Объект, свойства которого будут объединены со свойствами элемента схемы.
                    "values": {
                        "visible": {"bindTo": "getToolsVisible"}
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    }
);

 

Нравится

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

Eduardas,

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

Если Вы используете SQL Server, то посмотреть запросы, которые идут в базу данных можно с помощью приложения SQL Server Profiler.

Рекомендую Вам все-таки воспользоваться советом Данилы и отладиться на клиенте.

Скорее всего валится onDocumentInsert. Надо встать дебаггером, посмотреть что в response приходит (думаю ошибка от вставки в бд)

Если SQLException, то нужно смотреть в профайлере, какие запросы идут в базу. Может, вставка в записи колонки с неправильным именем или значением.

Подскажите как проверить какие запросы идут в базу? 

Eduardas,

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

Если Вы используете SQL Server, то посмотреть запросы, которые идут в базу данных можно с помощью приложения SQL Server Profiler.

Рекомендую Вам все-таки воспользоваться советом Данилы и отладиться на клиенте.

Профайлером. См. статью. Но это только для случая, если система развёрнута on site.

Варфоломеев Данила пишет:

Скорее всего валится onDocumentInsert. Надо встать дебаггером, посмотреть что в response приходит (думаю ошибка от вставки в бд)

Как мне это проверить?  

Зверев Александр пишет:

Профайлером. См. статью. Но это только для случая, если система развёрнута on site.

Спасибо, пойду знакомится со статьей

Eduardas пишет:

Варфоломеев Данила пишет:Скорее всего валится onDocumentInsert. Надо встать дебаггером, посмотреть что в response приходит (думаю ошибка от вставки в бд)Как мне это проверить?  

Посмотрите статью на Академии - в ней подробно описано, каким образом выполнять отладку.

Добрый день

 

Вопрос первый что не спросили до меня Коллеги

в таблице UsrProductsAndITstuff

есть или нет поля Product, Product.Name 

мне кажеться правильно должно быть вот так написано 

getGridDataColumns: function() {

   return {

      "Id": {path: "Id"},

      "UsrDarbopriemones": {path: "UsrDarbopriemones"},

      "UsrDarbopriemones.Name": {path: "UsrDarbopriemones.Name"}

   };

},

так же и в методе openDocumentLookup описывается что для таблицы UsrProductsAndITstuff есть поля Product.Id

если таблица не наследовалась от базовой то откуда там такие поля, почему без префикса? вот здесь есть доля сомнения. 

потом в методе addCallBack идет присвоение значения колонкам ProductCategoryId, ProductId здесь тоже или явная ошибка или я не нашел

определения для ГРИДА данных колонок.

Чтобы все корректно работало, все колонги ГРИДА должны сначала правильно проинициализированы а уже только потом мы их обрабатываем

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