Вопрос

Выделение записей реестра цветом

Добрый день.

Коллеги, прошу помочь.

Бизнес-задача: необходимо выделить запись в реестре Контрагентов, если в контрагенте добавлен юридический адрес.

 

Реализация через запрос esq:

prepareResponseCollectionItem: function(item) {
    this.callParent(arguments);
	let accountId = item.get("Id");
	var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "AccountAddress"
	});
	esq.addColumn("Account");
	esq.addColumn("AddressType");
	var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Account", accountId);
	var esqSecondFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "AddressType", "0092db56-5b25-4804-a900-ab3b00912832");
	esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
	esq.filters.add("esqFirstFilter", esqFirstFilter);
	esq.filters.add("esqSecondFilter", esqSecondFilter);
	esq.getEntityCollection(function(result) {
		if (result.success) {
			result.collection.each(function(item) {
				item.customStyle = {
				"background": "#ffaf3e"
				};
			});
		}
	}, this);
},

Реализация через вызов сервиса (который возвращает true/false):

prepareResponseCollectionItem: function(item) {
	this.callParent(arguments);
	let accountId = item.get("Id");
	var serviceData = {
		AccountId: accountId
	};
	ServiceHelper.callService("MyService", "MyMethod", function(response) {
		if (response.MyServiceResult === true) {
			item.customStyle = {
				"background": "#ffaf3e"
			};
		}
	}, serviceData, this);
},

 

Оба варианта не успевают выполниться при отрисовке страницы.

Прошу подсказать как можно поменять цвет записи реестре путем обращения в БД, а не относительно колонки обьекта.

 

Спасибо.

Нравится

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

Соловьев Сергей Николаевич,

Добрый день! Есть решение.

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

			addGridDataColumns: function(esq) {
						this.callParent(arguments);
						this.AccountAdressColumn(esq);
					},
 
					AccountAdressColumn: function(esq) {
						var aggregationColumn = this.Ext.create("Terrasoft.SubQueryColumn", {
							aggregationType: Terrasoft.AggregationType.COUNT,
							columnPath: "[AccountAddress:Account].Id",
							subFilters: this.getFilterGroup()
						});
						if (!esq.columns.contains("HasAddress")) {
							esq.addColumn(aggregationColumn, "HasAddress");
						}
					},
					getFilterGroup: function(){
						var filterGroup = Ext.create("Terrasoft.FilterGroup");
										filterGroup.add("AddressType",
									Terrasoft.createColumnFilterWithParameter(
										Terrasoft.ComparisonType.EQUAL,
										"AddressType",
										"770bf68c-4b6e-df11-b988-001d60e938c6"));
						return filterGroup;
					},
					prepareResponseCollectionItem: function(item) {
						this.callParent(arguments);
						if(item.get("HasAddress")>0) {
							console.log(item.get("Name"));
						}
					},

 

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

 

Вашу задачу можно реализовать таким образом.

 

1. В таблицу контрагентов добавьте булевское поле 'IsLegalAddressExists', для которого нужно реализовать логику установки значения true, если для контрагента есть хотя бы один юридический адрес, и false, если нет ни одного юридического.

 

2. А в реестре подсветку реализуйте в зависимости от значения нового поля 'IsLegalAddressExists'.

Сергей, добрый день!

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

Добрый день.

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

 

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

Соловьев Сергей Николаевич,

Не совсем понимаю чем вам не подходят указанные варианты. В приведённом мною примере записи логика успеет выполниться перед отрисовкой страницы. Само же условие можно сделать любым, главное чтобы выполнилось условие true для блока if, где ставиться стиль, хороший пример условия if описала Алла в своём сообщении. Также замечу, что стили не хранятся в БД, поэтому невозможно написать такой к ней запрос, который изменит цвет для записи.

Дима Вовченко,

 

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

 

Для того что выполнить мою бизнес-задачу  с использованием колонки, то нужно добавить (в моем понимании) "костыльную" логику:

1. Добавить колонку в обьект

2. Реализовать логику заполнения и снятия признака с колонки.

Соловьев Сергей Николаевич,

Добрый день! Есть решение.

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

			addGridDataColumns: function(esq) {
						this.callParent(arguments);
						this.AccountAdressColumn(esq);
					},
 
					AccountAdressColumn: function(esq) {
						var aggregationColumn = this.Ext.create("Terrasoft.SubQueryColumn", {
							aggregationType: Terrasoft.AggregationType.COUNT,
							columnPath: "[AccountAddress:Account].Id",
							subFilters: this.getFilterGroup()
						});
						if (!esq.columns.contains("HasAddress")) {
							esq.addColumn(aggregationColumn, "HasAddress");
						}
					},
					getFilterGroup: function(){
						var filterGroup = Ext.create("Terrasoft.FilterGroup");
										filterGroup.add("AddressType",
									Terrasoft.createColumnFilterWithParameter(
										Terrasoft.ComparisonType.EQUAL,
										"AddressType",
										"770bf68c-4b6e-df11-b988-001d60e938c6"));
						return filterGroup;
					},
					prepareResponseCollectionItem: function(item) {
						this.callParent(arguments);
						if(item.get("HasAddress")>0) {
							console.log(item.get("Name"));
						}
					},

 

Трефилов Павел Сергеевич пишет:

Добрый день! Есть решение.

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


 
			addGridDataColumns: function(esq) {
						this.callParent(arguments);
						this.AccountAdressColumn(esq);
					},
 
					AccountAdressColumn: function(esq) {
						var aggregationColumn = this.Ext.create("Terrasoft.SubQueryColumn", {
							aggregationType: Terrasoft.AggregationType.COUNT,
							columnPath: "[AccountAddress:Account].Id",
							subFilters: this.getFilterGroup()
						});
						if (!esq.columns.contains("HasAddress")) {
							esq.addColumn(aggregationColumn, "HasAddress");
						}
					},
					getFilterGroup: function(){
						var filterGroup = Ext.create("Terrasoft.FilterGroup");
										filterGroup.add("AddressType",
									Terrasoft.createColumnFilterWithParameter(
										Terrasoft.ComparisonType.EQUAL,
										"AddressType",
										"770bf68c-4b6e-df11-b988-001d60e938c6"));
						return filterGroup;
					},
					prepareResponseCollectionItem: function(item) {
						this.callParent(arguments);
						if(item.get("HasAddress")>0) {
							console.log(item.get("Name"));
						}
					},

Дякую!

Це те що треба! 

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