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

Нравится

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

Игорь, здравствуйте.

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

Ранее уже обсуждался подобный вопрос в посте:

https://community.terrasoft.ru/questions/ispolzovanie-checkboxov-v-deta…

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

Всем доброго дня.

Подскажите пожалуйста, как проще всего добавить номер по порядку при создании новой записи в детали через "+"? 

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

Нравится

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

Я делал автонумерацию через процесс на объекте. Триггер на срабатываение кода - после добавления записи или после удаления.

 

Код следующий, на сколько тут все хорошо не знаю, но вроде работает. Ручное переименование можно запретить, либо добавить "стрелочки" с перетаскиванием позиции вверх-вниз на клиенте.

 

using System.Linq;
 
public virtual void RunNumeration()
        {
            string parentEnityName = "UsrParent"; //Колонка с родителем, например Invoice для объекта InvoiceProduct
            var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, Entity.Schema.Name);
            var positionNumberColumn = esq.AddColumn("UsrPositionNumber").Name; //колонка с номером по порядку
            esq.AddAllSchemaColumns();
            if (parentEnityName.IsNotNullOrEmpty())
            {
                Guid parentEnityId = Entity.GetTypedColumnValue<Guid>(parentEnityName+"Id");
                if (parentEnityId != Guid.Empty)
                {
                    esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, parentEnityName, parentEnityId));
                    var entityProductsCollection = esq.GetEntityCollection(UserConnection)
		            .OrderBy(x => x.GetTypedColumnValue<int>(positionNumberColumn) == 0)
		            .ThenBy(x => x.GetTypedColumnValue<int>(positionNumberColumn));
		            int newNumber = 0;
		            foreach (var item in entityProductsCollection)
		            {
		                int number = item.GetTypedColumnValue<int>(positionNumberColumn);
		                newNumber++;
		                if (number != newNumber)
		                {
		                    item.SetColumnValue("UsrPositionNumber", newNumber);
		                    item.Save();
		                }
		            }
                }
            }
        }

 

Я делал автонумерацию через процесс на объекте. Триггер на срабатываение кода - после добавления записи или после удаления.

 

Код следующий, на сколько тут все хорошо не знаю, но вроде работает. Ручное переименование можно запретить, либо добавить "стрелочки" с перетаскиванием позиции вверх-вниз на клиенте.

 

using System.Linq;
 
public virtual void RunNumeration()
        {
            string parentEnityName = "UsrParent"; //Колонка с родителем, например Invoice для объекта InvoiceProduct
            var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, Entity.Schema.Name);
            var positionNumberColumn = esq.AddColumn("UsrPositionNumber").Name; //колонка с номером по порядку
            esq.AddAllSchemaColumns();
            if (parentEnityName.IsNotNullOrEmpty())
            {
                Guid parentEnityId = Entity.GetTypedColumnValue<Guid>(parentEnityName+"Id");
                if (parentEnityId != Guid.Empty)
                {
                    esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, parentEnityName, parentEnityId));
                    var entityProductsCollection = esq.GetEntityCollection(UserConnection)
		            .OrderBy(x => x.GetTypedColumnValue<int>(positionNumberColumn) == 0)
		            .ThenBy(x => x.GetTypedColumnValue<int>(positionNumberColumn));
		            int newNumber = 0;
		            foreach (var item in entityProductsCollection)
		            {
		                int number = item.GetTypedColumnValue<int>(positionNumberColumn);
		                newNumber++;
		                if (number != newNumber)
		                {
		                    item.SetColumnValue("UsrPositionNumber", newNumber);
		                    item.Save();
		                }
		            }
                }
            }
        }

 

Трефилов Павел Сергеевич, 

 

спасибо, отлично работает с вашим кодом)

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

Есть необходимость по галке в основной карточке делать деталь с редактируемым реестром(и) ТДЧ. 

Судя по публикациям здесь, в текущей версии бизнес-правилами это не реализуемо. 

В разработке на Creatio я недавно, поэтому творческие варианты решения данной задачи приходят со скрипом. На данный момент решение такое:

 

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

Или есть другие более удачные решения данной задачи? 

Заранее благодарю за ответы, особенно, если они будут со ссылками на похожие реализации.

Нравится

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

Если отвечать на вопрос, то с помощью механизма сообщений.

А в качестве решения задачи надо попробовать сделать две схемы детали одна с редактируемым реестром, вторая обычная. Обе вывести на карточку и сделать у них видимость в зависимости от атрибута.

Если отвечать на вопрос, то с помощью механизма сообщений.

А в качестве решения задачи надо попробовать сделать две схемы детали одна с редактируемым реестром, вторая обычная. Обе вывести на карточку и сделать у них видимость в зависимости от атрибута.

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

Необходимо выводить полное наименование из справочника в детали с редактируемом реестром. Значение в справочнике может быть слишком длинным и в ширину колонки не умещается. Увеличить ширину колонки уже не получится, ширина на максимуме. Подумал о решение со всплывающей подсказкой при наведении на справочник, которое будет выводить полное наименование из справочника. Как я могу это реализовать? И какие есть еще варианты решения моей проблемы?

Нравится

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

У меня есть решение, но не очень красивое, там идет изменение в DOM. Могу поделиться (ставим код на свой страх и риск). Как раз в соседнем посте идею для вендора создал с вопросом, как сделать красивее.

У меня есть решение, но не очень красивое, там идет изменение в DOM. Могу поделиться (ставим код на свой страх и риск). Как раз в соседнем посте идею для вендора создал с вопросом, как сделать красивее.

А если сделать справочник в виде раздела и использовать мини-карточку?

Владимир Соколов,

в редактируемом реестре справочное поле отображается в виде текста, а не ссылки, поэтому и наводить некуда. Поэтому мини-карточка не поможет.

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

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

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

У меня есть деталь, она находится на странице заявки, мне нужно переопределить кнопку добавления на детали, что успешно сделал, но для моей логики мне надо отследить с какого именно раздела она была нажата и получить id, такое возможно?

Нравится

2 комментария
addRecord: function() {
              	var defaultValues = this.get("DefaultValues");
 
              	this.console.log("Данные")
              	this.console.log(defaultValues);
			 	this.showInformationDialog("Select All not implemented yet...");
 
 
			// 	//this.callParent(arguments);
 
			 },

Случайно нашел, в дефолт валуис =) содержится необходимая нам информация , айди и представление

Dima Avdoshin,

Все правильно там оно и лежит. Можете еще вывести console.log(this); там в values и не только можно найти интересные значения.

Также можно самому дописывать значения в defaultValues в коде карточки на которой размещена деталь.

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

Добрый день всем!

Можно ли в детали с редактируемым реестром сделать возможность вывода значения в процентах? То есть в БД будет лежать значение 0.2. А выводиться будет 20% (со знаком процента).

Пока в голову только пришла идея с добавлением строкового значения в таблицу в БД, в которой будет лежать строка "20 %" и соответственно её выводом, но такое решение некрасивое

Нравится

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

Линар, наверное, так будет действительно проще. Ещё можно смотреть в сторону доработки схемы ConfigurationGridUtilities, отвечающей за такой реестр: добавления там проверки на конкретное поле конкретного объекта и преобразовании в нужный вид при открытии в функции generateActiveRowControlsConfig и при сохранении в saveDataRow. Вопрос модификации редактируемого реестра с другой целью описан тут.

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

Добрый день, я сделал справочное поле мульти справочным
вот так

attributes: {
           "qrtClientAccountSigner": { // поле, в котором создаем мультилукап
              "dataValueType": this.Terrasoft.DataValueType.LOOKUP,
              "multiLookupColumns": ["qrtContact", "qrtCounterparty"]  // перечисляем созданные нами колонки, которые будет содержать мультилукап
          }
        },

С разделами оно работает все нормально, но когда я пытаюсь выбрать через него поле значение в редактируемом реестре, то представление этого поля просто становится пустым, хотя если упасть в саму карточку оно наполнено

Нравится

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

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

Зверев Александр,
т.е вывести результат этого поля в реестре не выйдет?
и решение таковое, что выводим поля , по которым оно сформировано, а значения этих полей формируем при создании записи в мультисправочном поле

Зверев Александр,

 

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

В другом объекте системы на подобной детали все наоборот. Сохраняются контракты в мультиполе на детали.

 

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

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

Пробывал разные варианты и filterMethod и lookupListConfig с указанием нужного поля, но для редактируемого реестра не заводится, каким еще способом можно отфильтровать записи справочного поля в детали с редактируемым реестром при создании или же изменении записи на детали?

Нравится

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

Добрый вечер.

Опишите подробнее, что именно не получается. Приведите пример Вашего кода.

Проблема решена при помощи переопредления метода:

getGridRowViewModelConfig: function(config) {
                var result = this.callParent(arguments);
                if (result && result.rowConfig && result.rowConfig.Contact) {
                    result.rowConfig.Contact.lookupListConfig = {
                        "filters": [
                            function() {
                                var vendor = this.get("Vendor");
                                var filterGroup = Ext.create("Terrasoft.FilterGroup");
                                if (vendor && vendor.value) {
                                    filterGroup.add("Account",
                                        Terrasoft.createColumnFilterWithParameter(
                                            Terrasoft.ComparisonType.EQUAL, "[AccountInVendor:Account:Account].Vendor", vendor.value));
                                } else {
                                    filterGroup.add("Empty", Terrasoft.createColumnIsNullFilter("Id"));
                                }
                                
                
                                return filterGroup;
                            }
                        ]
                    };
                }
                return result;
            },

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

Добрый день. Подскажите, пожалуйста, как сделать фильтр в детали с редактируемым реестром для справочного поля, что бы при выборе из него убирались уже выбранные записи. К примеру есть список овощей, и при добавлении записи с выбранной "капустой", выбрать снова этот овощ нельзя для другой записи

Нравится

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

Добрый день.

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

Ниже привожу пример подобной фильтрации:

if (project && project.value) {
	var filterGroup = this.Terrasoft.createFilterGroup();
	var subFilters = Terrasoft.createFilterGroup();
    subFilters.addItem(Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL, "EWBProject", project.value));
	filterGroup.addItem(this.Terrasoft.createExistsFilter("[BTProjectDisease:BTDiseaseType:Id].Id",
		subFilters));
	var subFilters1 = Terrasoft.createFilterGroup();
	subFilters1.addItem(Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL, "ProjectSpecification", this.get("MasterRecordId")));
	filterGroup.addItem(this.Terrasoft.createNotExistsFilter(" 
       [SpecificationByDiseaseType:DiseaseType:Id].Id",	subFilters1));
}

В результате в базу данных сформируется такой SQL-запрос:

SELECT
	[BTDiseaseType].[Id] [Id],
	[BTDiseaseType].[Name] [Name],
	[BTDiseaseType].[BTTherapeuticAreaId] [BTTherapeuticAreaId],
	[BTTherapeuticArea].[Name] [BTTherapeuticArea.Name]
FROM
	[dbo].[BTDiseaseType] [BTDiseaseType] WITH(NOLOCK)
	LEFT OUTER JOIN [dbo].[BTTherapeuticarea] [BTTherapeuticArea] WITH(NOLOCK) ON ([BTTherapeuticArea].[Id] = [BTDiseaseType].[BTTherapeuticAreaId])
WHERE
	(EXISTS (
SELECT
	[SubBTProjectDisease].[Id] [Id]
FROM
	[dbo].[BTProjectDisease] [SubBTProjectDisease] WITH(NOLOCK)
WHERE
	[SubBTProjectDisease].[BTDiseaseTypeId] = [BTDiseaseType].[Id]
	AND [SubBTProjectDisease].[EWBProjectId] = @EWBProjectId)
AND NOT EXISTS (
SELECT
	[SubSpecificationByDiseaseType].[Id] [Id]
FROM
	[dbo].[SpecificationByDiseaseType] [SubSpecificationByDiseaseType] WITH(NOLOCK)
WHERE
	[SubSpecificationByDiseaseType].[DiseaseTypeId] = [BTDiseaseType].[Id]
	AND [SubSpecificationByDiseaseType].[ProjectSpecificationId] = @ProjectSpecificationId))
ORDER BY
	[BTTherapeuticArea.Name] DESC

 

Добрый день.

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

Ниже привожу пример подобной фильтрации:

if (project && project.value) {
	var filterGroup = this.Terrasoft.createFilterGroup();
	var subFilters = Terrasoft.createFilterGroup();
    subFilters.addItem(Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL, "EWBProject", project.value));
	filterGroup.addItem(this.Terrasoft.createExistsFilter("[BTProjectDisease:BTDiseaseType:Id].Id",
		subFilters));
	var subFilters1 = Terrasoft.createFilterGroup();
	subFilters1.addItem(Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL, "ProjectSpecification", this.get("MasterRecordId")));
	filterGroup.addItem(this.Terrasoft.createNotExistsFilter(" 
       [SpecificationByDiseaseType:DiseaseType:Id].Id",	subFilters1));
}

В результате в базу данных сформируется такой SQL-запрос:

SELECT
	[BTDiseaseType].[Id] [Id],
	[BTDiseaseType].[Name] [Name],
	[BTDiseaseType].[BTTherapeuticAreaId] [BTTherapeuticAreaId],
	[BTTherapeuticArea].[Name] [BTTherapeuticArea.Name]
FROM
	[dbo].[BTDiseaseType] [BTDiseaseType] WITH(NOLOCK)
	LEFT OUTER JOIN [dbo].[BTTherapeuticarea] [BTTherapeuticArea] WITH(NOLOCK) ON ([BTTherapeuticArea].[Id] = [BTDiseaseType].[BTTherapeuticAreaId])
WHERE
	(EXISTS (
SELECT
	[SubBTProjectDisease].[Id] [Id]
FROM
	[dbo].[BTProjectDisease] [SubBTProjectDisease] WITH(NOLOCK)
WHERE
	[SubBTProjectDisease].[BTDiseaseTypeId] = [BTDiseaseType].[Id]
	AND [SubBTProjectDisease].[EWBProjectId] = @EWBProjectId)
AND NOT EXISTS (
SELECT
	[SubSpecificationByDiseaseType].[Id] [Id]
FROM
	[dbo].[SpecificationByDiseaseType] [SubSpecificationByDiseaseType] WITH(NOLOCK)
WHERE
	[SubSpecificationByDiseaseType].[DiseaseTypeId] = [BTDiseaseType].[Id]
	AND [SubSpecificationByDiseaseType].[ProjectSpecificationId] = @ProjectSpecificationId))
ORDER BY
	[BTTherapeuticArea.Name] DESC

 

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

Добрый день!

Имеется деталь счета, нужно вскрыть колонку ( в скрине отметил ).

 

Как это можно сделать? 

 

Нравится

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

А не лучше ли настроить права на колонку? Так, чтобы пользователь никак её не мог увидеть (в аналитике, например)

Спрятать?

Казанцев Андрей Юрьевич, да

Настройка колонок, выберите те колонки, которые вам нужны

Алексей-Карягин, это понятно, но нужно в зависимости от роли ее прятать

А не лучше ли настроить права на колонку? Так, чтобы пользователь никак её не мог увидеть (в аналитике, например)

Владимир Соколов,

можно подробнее где тыкать?

Бабахан Дастан пишет:
где тыкать?

Дастан, для начала можно сюда.

chapter_objects_permissions_section_permissions_administer_by_columns.png

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