Подскажите, как в расширенном фильтре в условиях добавить сравнение двух полей?

Как пример вывести все записи где Создал != Ответственный

 

 

Нравится

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

На сколько я понял вопрос, то такой функции пока нет в creatio. 

“Oh, my sweet summer child...."
Вот тут. 1 же пункт. Но судя по всему реализации фичи будем ждать к 2030 году. lowcodenocode все дела)

Варфоломеев Данила,

Спасибо. Подозревал, что так и есть. Хотя зимы мы видели, да ещё какие :)

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

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

Например позволит просто определить находится ли отметка времени в прошлом или будущем.

 

P.S.
Так же, в этом меню незаслуженно обделены Минуты, их часто не хватает для быстрых процессов.

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

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

 

На команду разработчиков уже зарегистрирована задача по реализации такой функциональности.

Разработчики рассмотрят ее в одной из будущих версий.

 

Спасибо, что делаете наш продукт лучше!

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

Имеется расширенный фильтр. Мне необходимо отобразить его лишь на чтение.

Как скрыть кнопку удаления строки и добавления нового условия?

"Действия" скрываются путем передачи в модуль конфига с параметром actionsVisible: false.

В модуле FilterEditModule не нашел подобного функционала для добавления или удаления условий. 

Нашел в классе Terrasoft.controls.FilterEdit.Filter метод, возвращающий как раз таки права на удаление, выделение и т.д.

/**
	 * @inheritdoc Terrasoft.FilterEdit.Item#getAllowedManageOperations
	 * @protected
	 * @override
	 */
	getAllowedManageOperations: function() {
		var filterManager = this.filterManager;
		if (!filterManager) {
			return {
				canViewEnabled: true,
				canEditEnabled: true,
				canEditLeftExpression: true,
				canEditRightExpression: true,
				canEditComparisonType: true,
				canRemove: true,
				canSelect: true
			};
		}
		var filterManageOperations = filterManager.getAllowedFilterManageOperations(this.instance);
		var isEnableComparisonType = this._isEnableComparisonType();
		if (isEnableComparisonType !== undefined) {
			filterManageOperations.canEditComparisonType = isEnableComparisonType;
		}
		return filterManageOperations;
	},

Как я могу переопределить этот метод, если мне нужно расширить логику лишь для одного модуля, а не во всю систему.

 

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

Нравится

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

У кейса есть 2 способа решения:

1) Расширить класс  BaseFilterProvider.

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

 

Пример расширенного модуля (комментарии для понимания разницы)

define("BpFilterReadonlyProvider", [],
	function() {
		/**
		 * @class Terrasoft.data.filters.FilterReadonlyProvider
		 * Readonly filters provider.
		 */
		Ext.define("Terrasoft.data.filters.FilterReadonlyProvider", {
				extend: "Terrasoft.BaseFilterProvider",
			alternateClassName: "Terrasoft.FilterReadonlyProvider",
 
			rootSchemaName: "",
 
			canDisplayId: false,
 
			sandbox: null,
 
			// Управление операциями внутри фильтра (для каждого фильтра по отдельности).
			getAllowedFilterManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Возможность изменения левой части выражения.
					canEditLeftExpression: false,
					// Возможность изменения правой части выражения.
					canEditRightExpression: false,
					// Возможность изменения условия сравнения.
					canEditComparisonType: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбрать отдельный фильтр.
					canSelect: false
				};
			},
 
			// Управление группами фильтров.
			getAllowedFilterGroupManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Видимость типа группы ("И" / "ИЛИ").
					canViewGroupType: true,
					// Возможность редактирования типа группы.
					canEditGroupType: false,
					// Видимость кнопки "Добавить условие".
					canAddFilters: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбора группы фильтра.
					canSelect: false
				};
			}
 
		});
		return Terrasoft.FilterReadonlyProvider;
	}
);

 

Передача конфига модулю

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
        // Объект
	    rootSchemaName: "SxCandidate",
        // Колонка со значением фильтра
		filters: this.$RequirementFilterValue,
        // Видимость кнопки "Действия"
		actionsVisible: false,
        // Имя класса-провайдера (не забудьте подключить в зависимостях свой модуль с этим классом)
		filterProviderClassName: "Terrasoft.FilterReadonlyProvider"
   };
}

 

2) Второй вариант более быст и удобен. Подойдет, если такой кейс единичный в системе.

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

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
	    rootSchemaName: "SxCandidate",
		filters: this.$RequirementFilterValue,
		actionsVisible: false,
        entitySchemaFilterProviderConfig: {
		    canDisplayId: true,
		    shouldHideLookupActions: true,
			isColumnSettingsHidden: true,
			getAllowedFilterManageOperations: function() {
			    return {
				    canViewEnabled: true,
					canEditEnabled: false,
					canEditLeftExpression: false,
					canEditRightExpression: false,
					canEditComparisonType: false,
					canRemove: false,
					canSelect: false
				};
			},
			getAllowedFilterGroupManageOperations: function() {
				return {
					canViewEnabled: true,
					canEditEnabled: false,
					canViewGroupType: true,
					canEditGroupType: false,
					canAddFilters: false,
					canRemove: false,
					canSelect: false
				};
			}
		}
   };
}

 

В обоих случаях результат будет идентичен.

Можно наложить фильтр в раздел и пользователь его вообще не увидит в расширенных фильтрах.

https://community.terrasoft.ru/questions/interesuet-kak-sozdat-filtr-v-…

https://community.terrasoft.ru/questions/vidimost-sotrudnikov-v-kontakt…

https://community.terrasoft.ru/questions/bystryy-filtr-po-celochislenno…

Полозюков Евгений Петрович,

задача в другом. Допустим, менеджер заполняет фильтрацию внутри карточки (аналогично фильтрам в карточке раздела "Модели машинного обучения"). Затем, этот фильтр мне нужно отобразить  оператору только для чтения уже в совершенно другом месте.

 

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

Подкопаев Михаил Олегович,

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

У кейса есть 2 способа решения:

1) Расширить класс  BaseFilterProvider.

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

 

Пример расширенного модуля (комментарии для понимания разницы)

define("BpFilterReadonlyProvider", [],
	function() {
		/**
		 * @class Terrasoft.data.filters.FilterReadonlyProvider
		 * Readonly filters provider.
		 */
		Ext.define("Terrasoft.data.filters.FilterReadonlyProvider", {
				extend: "Terrasoft.BaseFilterProvider",
			alternateClassName: "Terrasoft.FilterReadonlyProvider",
 
			rootSchemaName: "",
 
			canDisplayId: false,
 
			sandbox: null,
 
			// Управление операциями внутри фильтра (для каждого фильтра по отдельности).
			getAllowedFilterManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Возможность изменения левой части выражения.
					canEditLeftExpression: false,
					// Возможность изменения правой части выражения.
					canEditRightExpression: false,
					// Возможность изменения условия сравнения.
					canEditComparisonType: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбрать отдельный фильтр.
					canSelect: false
				};
			},
 
			// Управление группами фильтров.
			getAllowedFilterGroupManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Видимость типа группы ("И" / "ИЛИ").
					canViewGroupType: true,
					// Возможность редактирования типа группы.
					canEditGroupType: false,
					// Видимость кнопки "Добавить условие".
					canAddFilters: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбора группы фильтра.
					canSelect: false
				};
			}
 
		});
		return Terrasoft.FilterReadonlyProvider;
	}
);

 

Передача конфига модулю

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
        // Объект
	    rootSchemaName: "SxCandidate",
        // Колонка со значением фильтра
		filters: this.$RequirementFilterValue,
        // Видимость кнопки "Действия"
		actionsVisible: false,
        // Имя класса-провайдера (не забудьте подключить в зависимостях свой модуль с этим классом)
		filterProviderClassName: "Terrasoft.FilterReadonlyProvider"
   };
}

 

2) Второй вариант более быст и удобен. Подойдет, если такой кейс единичный в системе.

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

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
	    rootSchemaName: "SxCandidate",
		filters: this.$RequirementFilterValue,
		actionsVisible: false,
        entitySchemaFilterProviderConfig: {
		    canDisplayId: true,
		    shouldHideLookupActions: true,
			isColumnSettingsHidden: true,
			getAllowedFilterManageOperations: function() {
			    return {
				    canViewEnabled: true,
					canEditEnabled: false,
					canEditLeftExpression: false,
					canEditRightExpression: false,
					canEditComparisonType: false,
					canRemove: false,
					canSelect: false
				};
			},
			getAllowedFilterGroupManageOperations: function() {
				return {
					canViewEnabled: true,
					canEditEnabled: false,
					canViewGroupType: true,
					canEditGroupType: false,
					canAddFilters: false,
					canRemove: false,
					canSelect: false
				};
			}
		}
   };
}

 

В обоих случаях результат будет идентичен.

У вас настройка фильтра хранится в поле? Может, можно закрыть оператору доступ к данному полю на уровне прав доступа?

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

настройка фильтра да, хранится в поле. Пример использования есть в разделе "Модели машинного обучения" в карточке записи.

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

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

Есть справочник "Стадия", по нему нужно сделать быстрый фильтр по типу как в расширенном фильтре(т.е с множественным выбором). Как это можно реализовать?

 

Нравится

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

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

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

 

Идея в быстром фильтре добавить возможность множественного выбора значений уже зарегистрирована.

Зверев Александр,
Да, добавил по типу как с ответственным, но если так делать все работает криво(не подстраивается под нужный справочник). Нужен именно множественный выбор с галками и тд.

Атамогланов Гусейн пишет:
все работает криво(не подстраивается под нужный справочник)

Нужно смотреть, как именно доработали в OpportunitySectionV2, что в результате не так отрабатывает для функций из FixedFilterViewV2 и FixedFilterViewModelV2.

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

Добрый день, помогите пожалуйста, при попытке добавить новые столбцы в расширенный

фильтр из детали, указывается лишь кол-во и дата

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

Нравится

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

Доброе утро.

Все верно, так и должно быть.

В колонке выбираете количество, после этого в самой области фильтра 'количество' можно сменить на 'существует' или 'не существует' и в области подфильтра уже работать с табличкой детали и настраивать нужные фильтры.

Более подробно о том, как построить exist-фильтр можно почитать на Академии по ссылке (подтема 'Установка агрегирующего фильтра').

Доброе утро.

Все верно, так и должно быть.

В колонке выбираете количество, после этого в самой области фильтра 'количество' можно сменить на 'существует' или 'не существует' и в области подфильтра уже работать с табличкой детали и настраивать нужные фильтры.

Более подробно о том, как построить exist-фильтр можно почитать на Академии по ссылке (подтема 'Установка агрегирующего фильтра').

Алла Савельева,

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

Касымов Сакен,

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

Нашел другой способ, создал вьюшку в БД и объект, поставил галочку в "Представление в БД"в этой вьюшке есть есть значения с "NULL" (это не проблема?)

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

Касымов Сакен,

А какой график нужно получить в итоге?

Возможно, неправильно сделали представление.

Посмотрите в SQL Management Studio, какие данные возвращает Ваше представление.

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

Превратить Null в пустую или какую угодно строку можно функцией IsNull со вторым параметром.

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

Зверев Александр пишет:
Также при создании пользовательских представлений для корректной их работы необходимо наследование от схемы BaseEntity, где есть стандартные колонки

Не согласна с этим утверждением.

Все зависит от того для реализации какой функциональности создается то или другое представление. 

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

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

Неоднократно задавал тут вопрос: возможно ли применить функционал расширенного фильтра к объекту "справочник".

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

на самом деле мне удалось этого добиться, правда не совсем стандартным способом...

  1. Создал раздел внутренними механизмами BPM
  2. Дропнул тейбл раздела в БД
  3. Создал представление (с inner join из 2 таблиц) с таким же названием в БД из п.2.
  4. Внес изменения в объект в БПМ - создал columns точь-в-точь как в представлении + установил признак "представление БД" (!)
  5. Закастомил страницу реестра.

Правда теперь не понимаю может ли эти изменения как-то негативно повлиять на работу приложения в целом?

Нравится

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

Использовать схемы на основе view вполне допустимо, парой сообщений ниже Алла Савельева как раз предлагает такое для решения вопроса с графиком.

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

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

По поводу негативного влияния, всё зависит от кода view. Если он содержит ошибки или при наложении каких-то фильтров получится очень тяжёлый запрос на выборку, то база может «задуматься».

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

ключевое слово - расширенный фильтр.

К справочнику его не применить.

Соответственно создал раздел, (руками его создавать - неблагодарное дело). А уже потом ахалай-махалай с Vw...

Случайно обнаружил: подобное действие с разделом привело к ошибке (см. принт-скрин).

  УРЛ https://[url_app]/0/ServiceModel/EntityDataService.svc/ для меня крайне важен...

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

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

Добрый вечер!
Вопрос такой, нужно в разделе "Контрагенты" сформировать список клиентов, у которых в "фактическом" адресе указан город Москва (с чем я разобрался) и присутствует также "юридический" адрес. Не могу понять, как включить в выборку условие с "юридическим" адресом?


 

Нравится

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

Вот пример Как я его понял исходя из условий Задачи

Михаил, не уверен, что получится именно то, что хочет автор. У Вас найдёт где есть или тот, или тот тип адреса.

Лучше так:

 

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

Добрый день, коллеги, поделитесь решением вопроса:

  1. Создал справочник 
  2. Создал модуль унаследованный от "Конфигурационный раздел базового справочника ( UIv2 )"
  3. Удалил унаследованный грид, и определил грид "зебра".
  4. Добавил фильтр по датам, по аналогии как в активностях

Вопрос: подскажите, метод добавления расширенного фильтра, по аналогии как и в разделах?

Нравится

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

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

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

Добрый день, коллеги. 

Имеется стандартный справочник с кастомной страницей реестра. 

Вопрос: возможно ли в переопределенной странице реестра отображения справочника подключить расширенный фильтр?
Подскажите метод реализации.
 

Нравится

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

А можете перефразировать, что именно вы хотите? Не могу понять, что вы хотите сделать

Наверное лучше я опишу все свои действия, что бы лучше понять мою цель:
1. Создал вьюху на SQL
2. Создал объект в БПМ с именем точь-в-точь как и в п.1
3. Накидал столбцов в объекте из п.2 точь-в-точь как и в п.1
4. В свойствах объекта из п.2 ("ВСЕ") поставил птЫчку "Представление в базе данных"
5. Получил справочник в BPM с наполнением данных из вьюхи п.1. Страница отображения справочника - базовая, а значит с возможностью редактировать поля и с отображением всех кнопок типа "Добавить"
6. Решил сделать "по-феншую" - создал свою страницу с параметром "Родительский объект" = "Конфигурационный раздел базового справочника (UIv2)"
7. Удалил кнопку "Добавить"
8. Определил цвет отображения кнопки "Закрыть" - "Terrasoft.controls.ButtonEnums.style.BLUE"
9. Удалил унаследованный DataGrid
10. Определил свой DataGrid
    {
        "operation": "insert",
        "name": "DataGrid",
        "parentName": "DataGridContainer",
        "propertyName": "items",
        "values": {
            "itemType": Terrasoft.ViewItemType.GRID,
            "listedZebra": true,
            "activeRow": {"bindTo": "ActiveRow"},
            "collection": {"bindTo": "GridData"},
            "isEmpty": {"bindTo": "IsGridEmpty"},
            "isLoading": {"bindTo": "IsGridLoading"},
            "primaryColumnName": "Id",
            "sortColumn": {"bindTo": "sortColumn"},
            "sortColumnDirection": {"bindTo": "GridSortDirection"},
            "sortColumnIndex": {"bindTo": "SortColumnIndex"},
            "needLoadData": {"bindTo": "needLoadData"}
        }
    }

Суть вопроса: данная страница имеет Фильтр с одной возможностью "Добавить условие". 
Интересует возможность добавления "Перейти в расширенный режим" или отображение фильтра по датам, как это реализовано в разделе "Активности".

Пытался в п.6. "Родительский объект" = "Базовая схема раздела (NUI)" - получаю необходимый результат, но сама страница некорректно себя ведет при отображении данных. Видимо там много чему нужен "remove", 
однако недостаточно информации чему именно...

Терещенко Алексей,

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

			init: function() {
				this.callParent(arguments);
				this.initFixedFiltersConfig();
			},
			initFixedFiltersConfig: function() {
				var fixedFilterConfig = {
					entitySchema: this.entitySchema,
					filters: [
						{
							name: "PeriodFilter",
							caption: this.get("Resources.Strings.PeriodFilterCaption"),
							dataValueType: this.Terrasoft.DataValueType.DATE,
							startDate: {
								columnName: "UsrDate", //Поле по которому хотите сделать фильтр дат
								defValue: this.Terrasoft.startOfWeek(new Date())
							},
							dueDate: {
								columnName: "UsrDate", //Поле по которому хотите сделать фильтр дат
								defValue: this.Terrasoft.endOfWeek(new Date())
							}
						}
					]
				};
				this.set("FixedFilterConfig", fixedFilterConfig);
			},

 

Литвинко Павел,

Подскажите в какую часть кода необходимо добавить данный код? в 

methods?

Литвинко Павел,

Отлично!!! Спасибо большое! Получилось!

И все таки - возможность добавления "Перейти в расширенный режим" - актуально. Может знает кто как это реализовать?

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

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