Вопрос

Фильтрация Lookup

Добрый день!

 

Есть две таблицы:

1) ListObject с колонками ObjectName(строка), ObjectType(Lookup), ObjectRule(Lookup на RulesList )

2) RulesList с колонками NameRule(строка),  ObjectType(Lookup)

Нужно реализовать фильтр, для колонки ObjectRule, таблицы ListObject. 

Фильтр должен выводить доступными только те записи ObjectRule, ObjectType которых соответствует ObjectType таблицы ListObject.

 

rules: {
  "typeObjectFilter": {
	 lookupListConfig: {
	   filters: [
	     function() {
		   var ruleToObject = this.get("ObjectRule");
		   var filterGroup = Ext.create("Terrasoft.FilterGroup");
		   if (ruleToObject) {
			  var filterByTypeRule = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"[RulesList:ObjectType].value", ruleToObject.value);
			  filterGroup.add("filterByTypeRule", filterByTypeRule);
			  return filterGroup;
		   }
		 }
	   ]
    }
  }
}

В настоящий момент фильтр не работает, страница не загружается.

Нравится

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

engineer7,

По первому пункту рекомендую ознакомиться со статьей по построению путей к колонкам относительно корневой схемы на академии:

https://academy.terrasoft.ru/documents/technic-sdk/7-13/postroenie-putey-k-kolonkam-otnositelno-kornevoy-shemy

Изначально Вы писали о том, что хотите фильтровать поле ObjectRule, а в коде реализуете фильтрацию для поля ObjectType.

Дальше Вы реализуете её в блоке rules, но, если делать через  lookupListConfig, то реализовывать нужно через блок attributes.

На мой взгляд, в данном случае Вы сильно усложнили себе задачу.

Ваш запрос на sql выглядит таким образом:

select Id

from RuleList

where RuleList.ObjectTypeId = @ObjectTypeId

где @ObjectTypeId - это значение ObjectType из таблицы ListObject

Реализовать такую фильтрацию можно легко с помощью мастера бизнес-правил https://academy.terrasoft.ru/documents/administration/7-13/nastroyka-biznes-pravil либо внести изменения в страницу редактирования на уровне конфигурации https://academy.terrasoft.ru/documents/technic-sdk/7-13/primer-primeneniya-pravila-filtration

1. Почему в выражении "[RulesList:ObjectType].value" Вы указали "value"?

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

Например: "[RulesList:ObjectType].ObjectRule"

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

Алла,  добрый день! Спасибо за ответ!

1. Не знал этот момент.

2. Sql запрос выглядит таким образом:

SELECT ObjectRule

  FROM ListObject INNER JOIN RulesList ON

  ListObject.ObjectTypeId =  ListObject.ObjectRule.ObjectTypeId

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

Возможно мне нужно идти по другому пути и для начала получить значение из поля "Тип объекта"(ObjectRule таблицы ListObject), которое я добавляю первым? 

engineer7,

По первому пункту рекомендую ознакомиться со статьей по построению путей к колонкам относительно корневой схемы на академии:

https://academy.terrasoft.ru/documents/technic-sdk/7-13/postroenie-putey-k-kolonkam-otnositelno-kornevoy-shemy

Изначально Вы писали о том, что хотите фильтровать поле ObjectRule, а в коде реализуете фильтрацию для поля ObjectType.

Дальше Вы реализуете её в блоке rules, но, если делать через  lookupListConfig, то реализовывать нужно через блок attributes.

На мой взгляд, в данном случае Вы сильно усложнили себе задачу.

Ваш запрос на sql выглядит таким образом:

select Id

from RuleList

where RuleList.ObjectTypeId = @ObjectTypeId

где @ObjectTypeId - это значение ObjectType из таблицы ListObject

Реализовать такую фильтрацию можно легко с помощью мастера бизнес-правил https://academy.terrasoft.ru/documents/administration/7-13/nastroyka-biznes-pravil либо внести изменения в страницу редактирования на уровне конфигурации https://academy.terrasoft.ru/documents/technic-sdk/7-13/primer-primeneniya-pravila-filtration

Алла, огромное спасибо!

Получилось реализовать, рабочий вариант: 

	// Набор правил для колонки [ObjectRule] модели представления.
			"ObjectRule": {
				// Правило фильтрации колонки [ObjectRule] по значению колонки [ObjectType].
				"FiltrationObjectRuleByObjectType": {
					// Тип правила FILTRATION.
					"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
					// Будет выполняться обратная фильтрация.
					"autocomplete": true,
					// Будет выполняться очистка значения при изменении значения колонки [ObjectType].
					"autoClean": true,
					// Путь к колонке для фильтрации в справочной схеме [ObjectRule],
					// на которую ссылается колонка [ObjectRule] модели представления
					// страницы редактирования.
					"baseAttributePatch": "ObjectType",
					// Тип операции сравнения в фильтре.
					"comparisonType": Terrasoft.ComparisonType.EQUAL,
					// В качестве значения при сравнении выступает колонка (атрибут)
					// модели представления.
					"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
					// Имя колонки модели представления страницы редактирования,
					// по значению которой будет выполняться фильтрация.
					"attribute": "ObjectType"
				}
			}

 

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