Добрый день, как можно c помощью entitySchemaQuery изменить значение колонки в детали на странице.

Есть страница, и на ней две детали в разных вкладках. Одна деталь - "позиции заказа", другая "Документы по заказу". В деталь "документы по заказу" добавила кнопку, при нажатии на которую, происходит update значения выбранной колонки(сделала через updateQuery по инструкции из документации). В этом же методе с помощью entitySchemaQuery создаю коллекцию с корневой схемой "позиции заказа". При обработке этой коллекции я пытаюсь поменять значение колонки с помощью инструкции this.set("NameColumn",value);

Однако это не работает, и значение колонки не меняется. 

Подскажите, пожалуйста, что я делаю не так и можно ли изменить значение колонки в детали через front-end?

Нравится

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

Здравствуйте,

 

Метод this.set("NameColumn",value) лучше заменить на обновление поля с помощью колл-бэк функции. Ниже представлен метод:

methodName: function() {
	var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: "YourSchemaName"});
	var filters = updateQuery.filters;
	filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
	  this.Terrasoft.ComparisonType.EQUAL, "YourDetailColumnName", "YourColumnNameFromPageDesigner",));
	updateQuery.setParameterValue("YourColumnNameToUpdate",
"ValueToWriteInUpdate", this.Terrasoft.DataValueType.TEXT);
	updateQuery.execute(function(result){ 
	if(result.success) this.updateDetail({detail: "YourDetailCodeName"});}, this);  
}

Более подробное описание вы можете найти тут: https://community.terrasoft.ua/questions/ustanovka-znacheniy-kolonok-cherez-esq-na-klientskoy-chasti#comment-88853

 

С уважением,

Ангелина!

Добрый день,

Пожалуйста, предоставьте пример entitySchemaQuery, который вы настраиваете.

Viktoriia Hrynchuk,

Ниже код метода, который вызывается при нажатии кнопки. С таким подходом ошибок не возникает, но и значение StatusComponentOrder не проставляется. При отладке коллекция формируется. 

setStatusDetail:function()
{
    /* Получает массив идентификаторов выбранных записей. */
                var selectedRows = this.get("SelectedRows");
                /* Обработка запускается в случае, если выбрана хотя бы одна запись. */
                if (selectedRows.length > 0) {
                    /* Создает экземпляр класса пакетных запросов. */
                    var batchQuery = this.Ext.create("Terrasoft.BatchQuery");
                    /* Обновляет каждую из выбранных записей. */
                    selectedRows.forEach(function(selectedRowId) {
                        /* Создает экземпляр класса UpdateQuery с корневой схемой Activity. */
                        var update = this.Ext.create("Terrasoft.UpdateQuery", {
                            rootSchemaName: "DocumentComponent" // DocumentComponent - схема отвечающая за документы по заказу 
                        });
            //Далее я пытаюсь создать ещё одну коллекцию, на основе другой схемы и получить по связям колонку, которую также необходимо обновить, но уже в другой детали.
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery",{
                rootSchemaName: "OrderPosition"
            });
            esq.addColumn("StatusComponentOrder","StatusComponent");
            esq.addColumn("RowDocumentComponent.DocumentId","DocMoving"); 
            esq.esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
            "RowDocumentComponent.DocumentId", selectedRowId);
            esq.filters.add("esqFirstFilter",esqFirstFilter);
                esq.getEntityCollection(function(result)
            {
                if(result.success)
                {
                    result.collection.each(function(item)
                    {
                        this.set("StatusComponentOrder",ConstantJS.StatusComponent);
                    }
                    
                )}
            },this);
 
                        /* Применяет фильтр для определения записи для обновления. */
                        update.enablePrimaryColumnFilter(selectedRowId);
                        /* Для колонки [Status] устанавливается значение из файла с константами */
                        update.setParameterValue("Status", "ConstantJS.DocShipped", this.Terrasoft.DataValueType.GUID);
                        /* Добавляет запрос на обновление записи в пакетный запрос. */
                        batchQuery.add(update);
                    }, this);
                    /* Выполняет пакетный запрос к серверу. */
                    batchQuery.execute(function() {
                        /* Обновляет реестр. */
                        this.reloadGridData();
                    }, this);
                }

}

Здравствуйте,

 

Метод this.set("NameColumn",value) лучше заменить на обновление поля с помощью колл-бэк функции. Ниже представлен метод:

methodName: function() {
	var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: "YourSchemaName"});
	var filters = updateQuery.filters;
	filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
	  this.Terrasoft.ComparisonType.EQUAL, "YourDetailColumnName", "YourColumnNameFromPageDesigner",));
	updateQuery.setParameterValue("YourColumnNameToUpdate",
"ValueToWriteInUpdate", this.Terrasoft.DataValueType.TEXT);
	updateQuery.execute(function(result){ 
	if(result.success) this.updateDetail({detail: "YourDetailCodeName"});}, this);  
}

Более подробное описание вы можете найти тут: https://community.terrasoft.ua/questions/ustanovka-znacheniy-kolonok-cherez-esq-na-klientskoy-chasti#comment-88853

 

С уважением,

Ангелина!

Anhelina,

спасибо за помощь! Помогло)

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

В разделе есть поле IsExpertRecBadTurnoverNotify (логическое), которое должно быть доступно на чтение всем пользователям, и пользователям роли "ЗГД по маркетингу" на запись. Делаю настройку по инструкции:



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

Роль "ЗГД по маркетингу" организационная, впрочем, с функциональной ролью все так же.



Если я пытаюсь затем отредактировать это поле в странице раздела, система сообщает "Недостаточно прав для изменения значения колонки "IsExpertRecBadTurnoverNotify " объекта "Арендатор"".



То же сообщение отображается, если убрать строку All Employees, или обе строки из списка прав на колонку. Но если просто отключить "Использовать доступ по колонкам", система разрешает изменение данных.



В чем проблема, почему не работает доступ по колонкам?

Нравится

2 комментария

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

Юрий, попробуйте сначала просто выполнить действие «Актуализировать роли» в разделе «Пользователи».

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

Коллеги, доброго времени суток!



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

 

Кейс: 

в реестре раздела Контрагенты вывести дополнительную колонку с названием "Контакты", и для каждой записи выводить имена всех Контактов соответствующего Контрагента (из детали "Контакты контрагента").

 

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

Необходимо, чтобы контакты отображались даже когда строка неактивна, то есть также, как данные других колонок (всегда).

Обычным способом такую колонку добавить не получается.

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

Если есть варианты, как реализовать этот кейс другим путем, буду рад их рассмотреть.

Заранее спасибо за помощь!

 

Нравится

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

Дмитрий, причина отсутствия колонок в изначальном вопросе в том, что в раздел можно выводить с детали только обобщённые значения: количество, сумму, среднее, минимум, максимум.

Дмитрий Анисько пишет:

то на мой взгляд проще добавить строковое поле в объект Контрагент и обновлять его на все нужные события для поддержания актуальности данных.

Лучше всего именно так. На уровне встроенного БП объекта детали или отдельным БП заполнять новое текстовое поле в объекте раздела. Можно ещё триггером в базе, но это Вам не подойдёт.

Дмитрий Анисько пишет:

Может быть Вы знаете, как можно добавить колонку в реестр именно на этапе формирования вью-модели?

 Даже если такое возможно, рисков больше, чем преимуществ. От большей нагрузки на сервер и базу, когда для каждой видимой в реестре строки будет отдельный запрос, до неполной функциональности, когда такая колонка не будет полноценно работать в выгрузке в Excel, итогах, печатных формах, OData и прочих интеграциях.

Здравствуйте!

 

Базовыми средствами, не прибегая к разработке, Вы не сможете реализовать подобный функционал.

Вариантов решения такой задачи несколько, например:

1. Добавляем view с 2 колонками - Guid и string. Средствами sql формируем запрос, который в первую колонку будет возвращать Id контрагента, во вторую все "склеенные" в одну строку имена относящихся к нему контактов

2. В контрагенте добавляем колонку-справочник на нашу view (не забываем про галочку контроля целосности)

3. На событии OnInserting контрагента копируем значение колонки Id в колонку из п.2

4. Дальше пользуемся базовой настройкой колонок

 

Манипуляции из пп. 2-3 нужны для того, чтобы сохранить прямую связь

Лопатин Константин,



Большое спасибо за ответ, но указанный способ не подходит.

Нужно сохранить поддержку всех 3-х субд, а создавать View для каждой - не очень удобно. Да и если идти подобным путем, то на мой взгляд проще добавить строковое поле в объект Контрагент и обновлять его на все нужные события для поддержания актуальности данных.

 

Может быть Вы знаете, как можно добавить колонку в реестр именно на этапе формирования вью-модели? Может вы знаете, что можно попробовать переопределить, чтобы изменить стандартное поведение?

 

Дмитрий, причина отсутствия колонок в изначальном вопросе в том, что в раздел можно выводить с детали только обобщённые значения: количество, сумму, среднее, минимум, максимум.

Дмитрий Анисько пишет:

то на мой взгляд проще добавить строковое поле в объект Контрагент и обновлять его на все нужные события для поддержания актуальности данных.

Лучше всего именно так. На уровне встроенного БП объекта детали или отдельным БП заполнять новое текстовое поле в объекте раздела. Можно ещё триггером в базе, но это Вам не подойдёт.

Дмитрий Анисько пишет:

Может быть Вы знаете, как можно добавить колонку в реестр именно на этапе формирования вью-модели?

 Даже если такое возможно, рисков больше, чем преимуществ. От большей нагрузки на сервер и базу, когда для каждой видимой в реестре строки будет отдельный запрос, до неполной функциональности, когда такая колонка не будет полноценно работать в выгрузке в Excel, итогах, печатных формах, OData и прочих интеграциях.

Коллеги, большое спасибо за ответы.

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

Дмитрий Анисько пишет:

Коллеги, большое спасибо за ответы.

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

Дело, конечно же, Ваше, но я, если честно, так и не понял каким образом уменьшится нагрузка на БД если сравнивать view и обновление колонки после каждого чиха на событийном слое

 

Нужно сохранить поддержку всех 3-х субд, а создавать View для каждой - не очень удобно

Тоже не вижу особой проблемы с учетом того, что синтаксис аналогичный.

Лопатин Константин пишет:

Дело, конечно же, Ваше, но я, если честно, так и не понял каким образом уменьшится нагрузка на БД если сравнивать view и обновление колонки после каждого чиха на событийном слое

Честно, не тестировал три обсуждаемых варианта, но можно предположить, что данные меняют намного реже, чем читают, следовательно затраты на обновление меньше, чем каждый раз вычислять. Хотя, возможно, с view всё не так страшно, ведь запрос отрабатывает не сервере БД раз и  целиком через веб-сервер попадает в браузер. В случае же программной вычитки для каждой записи каждый раз будут отрабатывать и БД, и сервер приложений.

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

Добрый день!

Создал кастомную страницу в разделе Активности, добавил деталь Файлы и ссылки активности. В данный момент в данной детали нет возможности настроить колонки и отсортировать файлы (например, по дате создания).

Можно ли как-то добавить доп. колонки к данной детали и настроить сортировку файлов?

Нравится

3 комментария

Попробуйте переопределить метод getGridDataColumns

 

getGridDataColumns: function () {
                var config = this.callParent(arguments);
 
                config["Название колонки"] = {
                    path: "Название колонки",
                    orderPosition: 1,
                    orderDirection: this.Terrasoft.OrderDirection.ASC
                };
 
 
                return config;
            },

 

Здравствуйте!

На Академии присутствует детальная инструкция: https://academy.terrasoft.ru/documents/technic-sdk/7-11/otobrazhenie-dopolnitelnyh-kolonok-na-detali-fayly-i-ssylki

Проводили данный опыт давным-давно.

Все что вам необходимо это добавить данный метод

getGridSettingsMenuItem: function() {
	return this.getButtonMenuItem({
		Caption: "Настройка колонок",
		Click: {"bindTo": "openGridSettings"}
	});
}

Таким образом вы сможете получить доступ к стандартной настройке колонок в этой детали)

Сортировка настраивается в методе:

getGridDataColumns: function() {
	return {
		"Id": {path: "Id"},
		"SysAdminUnit": {path: "SysAdminUnit"},
		"SysAdminUnit.SysAdminUnitTypeValue": {path: "SysAdminUnit.SysAdminUnitTypeValue"},
		"Name": {path: "KmName", orderPosition: 1, orderDirection: Terrasoft.OrderDirection.DESC}
	};
}

Кстати у выше упомянутой статьи странно, но уровень сложности очень высокий, хотя кастомизация ну если не типовая, то тривиальная.

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

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

К примеру. У детали "продукт в заказе" можно добавить поле "тип продукта". Которое будет информационным.

Как только мы делаем деталь с редактируемым реестром, мы уже не можем так сделать, у нас есть только те поля которые мы имеем.

Как быть? Чтобы отображать в редактируемом реестре связанные таблицы?

Нравится

1 комментарий

1) Осуществлять запросы в БД (ESQ запрос), например если Вам необходимо получить какое либо значение из текущей карточки (в которой деталь находиться), то в коде выполняемом в окружении детали всегда доступно значение

this.get("MasterRecordId")

Которое возвращает Вам то поле по которому деталь связана с карточкой (как правило это ее Id).
По нему - ESQ запросом можно получить уже любые данные из карточки (сохраненные на данный момент в БД)
2) Публикация события-запроса, подписка на событие-ответ, публикация события-ответа происходит в подписке на событие-запрос в необходимых вам схемах других объектов (н/п карточки, других деталях)
в событие-ответ передаются необходимые данные. (в виде JS-объекта вторым аргументом в вызове метода this.sundbox.publish)

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

Добрый день.
Заметил особенность.
Когда в среде Разработки настраиваем порядок отображения колонок.
"Деталь"- "Настройка колонок"
И переносим пакеты в тестовую среду, порядок и колонки уже не тот.

Скажите где порядок сохраняется? В Page, Detail или еще где то?

Нравится

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

Заметил особенность, сделали Профиль-Восстановить настройки по умолчанию.
Получилось.
А есть способ который позволит у всех менять? Без этого "сброса"

"Юсупов Марат" написал:Скажите где порядок сохраняется?

в таблице SysProfileData

Нет..сброс не помог. Что делать?

Спасибо.

Здравствуйте, Марат!

Как уже было замечено данные хранятся в таблице SysProfileData. Если пользователь самостоятельно настраивал отображение полей, тогда необходимо восстановить настройки по умолчанию.
По сути это действие выполнить следующий запрос:

declare @ContactId
delete from SysProfileData where ContactId = @ContactId

Вы можете выполнить этот запрос в SQL Management Studio для очистки профиля пользователя.

Показать все комментарии
Возможно уже было.Предлагаю добавить возможность вытягивать в реестры (разделов и деталей) колонку со связанных объектов для "первой записи из выборки" (select top 1 Name from...) с возможностью настраивать фильтрацию и сортировку. Например: в реестре контрагентов показать последний подписанный договор или в реестре продаж показывать продукт с наибольшей суммой
2 комментария

О, да!

Или без всяких синхронизаций отображать некоторые дополнительные средства связи!!!

Здравствуйте!

Спасибо за пожелание! Данный функционал запланирован и будет реализован в будущих версиях.

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

Добрый день!

Как на 7.6 можно перенести настройки колонок реестров и деталей с одной базы на другую (с базы разработки на тестовую) без SVN? И при этом сделать их для всех пользователей

Спасибо!

Нравится

3 комментария

Посмотрите в сторону таблицы SysProfileData , именно там хранятся данные настроек реестра. Первый приоритет настройки пользователя, второй приоритет настройки администратора системы, третий приоритет с ContactId = NULL

SELECT * FROM SysProfileData WHERE [Key] Like '%ContractSection%'

"Щиголь Максим" написал:второй приоритет настройки администратора системы, третий приоритет с ContactId = NULL

"ContactId = NULL" вроде это же и есть "настройки администратора системы"

Протестировал поведение, да, действительно, последние два приоритета сливаются в один.
До каких либо изменений в таблице существует запись с ContactId = NULL, после сохранения "для всех пользователей", именно она и обновляется.
Выходит есть только два приоритета. Пользователь, и ContactId = NULL.

Показать все комментарии
Реализовать возможность настройки нескольких вариантов колонок в списке пользователем.Например, для работы в разделе Контрагенты для поставщиков нужно видеть одни данные в списке, для клиентов - другие
7 комментариев

Владимир, идея принята для анализа и будет рассмотрена возможность ее реализации в одной из последующих версий программного продукта.

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

"Александр Свистунов" написал:Владимир, обычно в проектах для этой цели используем представления (сверху)

А можно пример привести?

"Александр Свистунов" написал:обычно в проектах для этой цели используем представления (сверху)

+1 по поводу примера. Делал это регулярно в 3.х, а вот как сделать в 7.х не видел

"Александр Кудряшов" написал:Делал это регулярно в 3.х

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

"Владимир Соколов" написал:А можно пример привести?

Конечно! Писал комментарий, но он стал слишком большим:smile: и я опубликовал отдельный пост
Готов комментировать, если будут вопросы.

"Александр Свистунов" написал:я опубликовал отдельный пост

Спасибо за прекрасный пример!

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

Добрый день.
Terrasoft XRM 3.3.2.304. Столкнулся с такой ситуацией.
В гриде детали необходимо программно скрывать и вытаскивать колонки.
делаю так:

Window.ComponentsByName('colYearNumber').IsVisible = true;     

если колонка была скрыта, то получаю вот такой результат:

нажимаем F5:

Аналогичный эффект достигается при попытке программного назначения ActiveView.
В чем может быть причина и как это победить?
Спасибо

Нравится

2 комментария

В SelectQuery поставьте для поля "Всегда выбирать в запросе"

Дмитрий, спасибо огромное.

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