Вопрос

Помогите правильно составить фильтр

Всем доброго времени суток. Версия 7.12.

Помогите правильно составить фильтр. Не уверен, что вообще можно однозначно составить фильтр.

Итак, есть объект раздела, ObjectModule. На его странице есть деталь, её объект ObjectDetail.

У ObjectDetail есть колонки: Id, ObjectModuleId (используется для связи с объектом раздела), Parameter, Value (параметр и значение, оба - строки).

Нужно в запросе отобрать все записи объекта раздела  ObjectModule, в которых на детали ObjectDetail есть Parameter типа "A" со значением "Value" равным 1. То есть указан параметр соответствующего типа и имеет соответствующее значение.

Возможна ли вообще реализация такого фильтра - по детали?

Нравится

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

Вы хотите в разделе отобразить эти данные через расширенный фильтр? Или реализацию кодом?

Интересует именно код в запросе EntitySchemaQuery.

Я примерно понимаю, что нужна группа фильтров - один по значению Parameter и второй - по значению Value.

Но вот фильтроваться должно по данным на детали, а в результатах - записи объекта раздела.

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

на клиенте запрос.

Смородинов Денис,

Как выглядит текст для данного запроса на SQL?

Судя из Вашего описания, Вам подойдет такая реализация ссылка

Пример приведен с фильтрацией по одному условию, а Вам нужно добавить ещё один фильтр в subFilters.

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

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

Ищутся записи Account по заданному значению колонки SearchNumber  детали AccountCommunication в разделе Account? Если да, то наверно подойдёт, спасибо.

Смородинов Денис,

Ну если я вас правильно понял, то вы хотите где-то отобразить грубо говоря записи раздела, но только те которые содержат определенные значения на своей детали, получается вы фильтруете справочное поле(наверное), то тогда ваша задача решается примерно так:

За код не ручаюсь, не проверял, в блокноте накидал

 

"MyLookup": {
                    "dataValueType": this.Terrasoft.DataValueType.LOOKUP,
                    "lookupListConfig": {
                        "filters": [
                            function() {
                                var filterGroup = Ext.create("Terrasoft.FilterGroup");
 
								filterGroup.logicalOperation = Terrasoft.LogicalOperatorType.OR;
                                this.additionalFilter(function(collectionsId) {
									 for (var itemsFilters = 0; itemsFilters < collectionsId.length; itemsFilters++) {
										var nameFilter = "RandomName";
										var lefExprs = (nameFilter + itemsFilters);
										var rih = (lefExprs + "additional");
										var innerFilterGroup = Ext.create("Terrasoft.FilterGroup");
										innerFilterGroup.logicalOperation = Terrasoft.LogicalOperatorType.OR;
 
										innerFilterGroup.add(lefExprs, Terrasoft.createColumnFilterWithParameter(
											Terrasoft.ComparisonType.EQUAL,
											"Id", collectionsId[itemsFilters]));
										filterGroup.add(rih, innerFilterGroup);
									}
                                }, this);
 
                                return filterGroup;
                            }
                        ]
                    }
 
 
 
 
 
 
					additionalFilter: function(callback, scope) {
						   var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
								rootSchemaName: "ObjectDetail"
							});
							esq.addColumn("ObjectModuleId");
							esq.addColumn("Parameter");
							esq.addColumn("Value");
							esq.filters.add(esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Parameter",
								"A"));
							esq.filters.add(esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Value",
								"1"));
 
							esq.getEntityCollection(function(response) {
								var collectionId = [];
								var resultCollection = response.collection.getItems();
								for (var i = 0; i < resultCollection.length; i++) {
									collectionId.push(resultCollection[i].get("ObjectModuleId"));
								});
								Ext.callback(callback, scope, [collectionId]);
 
							}, this);
						}

 

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

получается вы фильтруете справочное поле(наверное), то тогда ваша задача решается примерно так:

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

Смородинов Денис,

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

Смородинов Денис пишет:

не до конца понял немного, что именно фильтруется в том примере..Ищутся записи Account по заданному значению колонки SearchNumber  детали AccountCommunication в разделе Account?

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

Коллеги, всё равно не получается..

Тут ещё и связь для детали своеобразно установлена, и фильтр тоже...

Итак, объект ObjectModule. В нём есть колонка-строка Request.

Объект ObjectDetail. В нём есть другая колонка-строка RequestDetail, деталь привязана по этим колонкам-строкам (Request == RequestDetail, не через справочные колонки). Ну и колонки Parameter, Value.

Далее конструкция:

var subFilters = Terrasoft.createFilterGroup();	
subFilters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Parameter", "A"));
//subFilters.addItem(Terrasoft.createColumnInFilterWithParameters("Value", ["1","2"]));
filters.add(Terrasoft.createExistsFilter("[ObjectDetail:RequestDetail].Request", subFilters));

Вылезает ошибка: элемент коллекции с именем "ObjectDetail:RequestDetail].Request" не найден.

Кажется, разобрался.

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