Деталь
фильтр
фильтрация на детали
Технические вопросы
7.x

Уважаемые форумчане.
Вопрос по версии 7.6
Не получается сделать фильтрацию на детали.
Создал деталь активностей связанных контрагентов Activity на странице контрагента. Она похожа на деталь
Ативности в контрагенте, только она должна выдавать перечень активностей не текущего контрагента,
а активности контрагентов, которые связаны с текущим контрагентом. Связи контрагентов хранятся во
вьюхе VwAccountRelationship. В ней есть колонки AccountId и RelatedAccountId.
Сделал запрос

 SELECT * FROM Activity
INNER JOIN VwAccountRelationship ON Activity.AccountId = VwAccountRelationship.RelatedAccountId
WHERE VwAccountRelationship.AccountId = 'a40cfdfb-cd46-4c63-9448-44110861c12c'

a40cfdfb-cd46-4c63-9448-44110861c12c - Id текущего контрагента.
Этот запрос выдает верный результат. Там всего одна запись.
Но сделать с помощью фильтра на js не получается.
Пробовал следующий код, но он выдает кучу ненужных записей.
"Activity": {
                "schemaName": "SuSchema1Detail",
                "entitySchemaName": "Activity",
                "filter": {
                        "detailColumn": "Account",
                        "masterColumn": "Id"           
                },
                filterMethod: "activityFilter"
        }
methods: {
                        activityFilter: function() {
                                var currentAccount = this.get("Id");
                                var filterGroup = Ext.create("Terrasoft.FilterGroup");
                                filterGroup.add("CurrentAccountRelatedAccounts", Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
                                        "=[VwAccountRelationship:RelatedAccount:Account].Account", currentAccount));
                                return filterGroup;
                        }                              
                }

Заранее благодарен.

Нравится

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

В основном фильтре раздела "Контакты" можно создавать условия фильтрации,
учитывая значения полей которые находятся в карточке "Контрагент" , например поле "Отрасль".
К сожалению, здесь(см. рисунок) присутсвуют только три поля из карточки "Контрагент"(группу контрагентов в счет не берем): Виды деятельности, Контрагент, Отрасли.
A как сюда, в этот основной фильтр раздела "Контакты", можно еще добавлять поля которые находятся в карточке "Контрагент" ?

С уважением,
Дмитрий

Нравится

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

Здравствуйте!

Для того чтобы добавить новую фильтрацию в группу [Контрагент], необходимо запустить приложение Администратор Terrasoft (TSAdmin.exe), после чего найти сервис sq_Contact и открыть его двойным кликом для редактирования.

Затем создать необходимый фильтр, аналогичный фильтру [Отрасли]

Показать все комментарии
группа ответственных
ответственный
фильтр
Фильтры
Разработка

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

Заранее спасибо

Нравится

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

Здравствуйте!

Уточните, пожалуйста, версию продукта, который Вы используете.

Этот же вопрос обсуждается здесь.

Показать все комментарии
7.5
отчет
серриализация
фильтр
Технические вопросы
7.x

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

В лоб не получилось

ReportService reportService = new ReportService();
EntitySchema schemaDocument = UserConnection.EntitySchemaManager.GetInstanceByName("Document");

Dictionarystring, object> filterParameters = new Dictionarystring, object>();
EntitySchemaQuery esqDocument = new EntitySchemaQuery(schemaDocument);
var f =esqDocument.CreateFilterWithParameters(FilterComparisonType.Equal, "Id", DocumentId);
filterParameters.Add("Filters",f);
var reportParameters = Json.Serialize(filterParameters);

 

Нравится

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

Здравствуйте, Александр.

Решение данного кейса подробно описано в этом комментарии.

Мотков Илья,

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

Елена Александровна, посмотрите здесь.

Показать все комментарии
период
фильтр
Технические вопросы
7.x

Добрый день!

Как в bpm (7.6) создать свои периоды для фильтров?
Например "С начала текущего года по сегодняшнюю дату",
"С начала прошлого года по такую же дату в прошлом году",
"Последние 12 месяцев" и т.п.?

https://community.terrasoft.ua/system/files/period_0.png

Нравится

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

Здравствуйте, Владимир!
Привожу примеры с полем с типом "Дата"

  1. С начала текущего года и по сегодняшнюю дату
  2. С начала прошлого года по такую же дату в прошлом году
  3. Последние 12 месяцев

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

Спасибо! Действительно, всё легче, чем казалось.

Хотя, у меня такая конструкция работает хорошо:

Date<Previous Days365
Date=Previous Year

А такая плохо:

Date≤Previous Days365
Date=Previous Year
Показать все комментарии
Terrasoft XRM
XRM+SD
сохранить
сохранить фильтры
фильтр
3.x

Невозможно сохранить настройки фильтров, не активна кнопка "сохранить" (а так же кнопка "сохранить и применить")
кнопка
По каким причинам она может быть не активна?
terrasoft XRM+SD 3.40.143.0
Спасибо.

Нравится

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

Добрый день! Скорее всего вы пытаетесь сохранить настройки фильтров в статической группе, а не в динамической

Настройки фильтров сохраняются в динамических группах

Показать все комментарии
Деталь
фильтр
Технические вопросы
7.x

Коллеги, просьба помочь разобраться с деталями. Версия 7.6.

Ситуация: мы делим Заказы по типам (КП, Образцы, Коммерческий заказ) по причине удобного продуктового каталога.
Задача: хотим в карточке клиента вывести 3 детали и на каждую поставить фильтр по типу заказа. Разместил 3 детали через мастер раздела, он сгенерировал такой код:

        "Order": {
                "schemaName": "OrderDetailV2",
                "entitySchemaName": "Order",
                "filter": {
                        "detailColumn": "Account",
                        "masterColumn": "Id"
                },
                "filterMethod": "OrderFilter",
                "captionName": "OrderDetailCaption" // в локализируемых строках прописано "КП"
        },
        "Order1": {
                "schemaName": "OrderDetailV2",
                "entitySchemaName": "Order",
                "filter": {
                        "detailColumn": "Account",
                        "masterColumn": "Id"
                },
                "filterMethod": "Order1Filter",
                "captionName": "Образцы"
        },
        "Order2": {
                "schemaName": "OrderDetailV2",
                "entitySchemaName": "Order",
                "filter": {
                        "detailColumn": "Account",
                        "masterColumn": "Id"
                },
                "filterMethod": "Order2Filter",
                "captionName": "Заказы"
        }

Вручную прописал фильтрацию на деталях:

                        OrderFilter: function() {
                                var filterGroup = new this.Terrasoft.createFilterGroup();
                                filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
                                filterGroup.add("OrderTypeFilter", this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "UsrOrderType", "358479b6-bf4b-46ed-93ee-5a8c558a0593") // КП
                                );
                                filterGroup.add("ByAccountFilter", this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "Account", this.get("Id"))
                                );
                                return filterGroup;
                        },
                        Order1Filter: function() {
                                var filterGroup = new this.Terrasoft.createFilterGroup();
                                filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
                                filterGroup.add("OrderTypeFilter", this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "UsrOrderType", "21d5f440-ff74-4a89-8233-127facc90be4") // Образцы
                                );
                                filterGroup.add("ByAccountFilter", this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "Account", this.get("Id"))
                                );
                                return filterGroup;
                        },
                        Order2Filter: function() {
                                var filterGroup = new this.Terrasoft.createFilterGroup();
                                filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
                                filterGroup.add("OrderTypeFilter", this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "UsrOrderType", "d8e59907-2b35-4429-bd14-2f5847dbf787") // Заказ
                                );
                                filterGroup.add("ByAccountFilter", this.Terrasoft.createColumnFilterWithParameter(
                                        this.Terrasoft.ComparisonType.EQUAL, "Account", this.get("Id"))
                                );
                                return filterGroup;
                        }

Однако нужного результата мы не получили:
1. Не изменились заголовки деталей (так и остались «Заказы»)
2. При нажатии на детали 1 и 2 разворачивается деталь 3, а нажимаемая остаётся без изменений
3. При переключении между вкладками карточки клиента произвольно меняются фильтры между деталями

Соответственно, вопросы:
1. Как изменить заголовок детали? Варианты "captionName": "OrderDetailCaption" (OrderDetailCaption – локализируемая строка) и "captionName": "Образцы" не срабатывают
2. Как сделать разворачивание / сворачивание деталей независимым друг от друга? Т.е. чтобы при разворачивании, к примеру, детали №2 разворачивалась она и только она, а детали №1 и №3 не менялись
3. Как зафиксировать условия фильтрации? Проблема в том, что при переключении вкладок карточка контрагента (Основная информация, Документы, История и т.п.) произвольно выставляются фильтры в деталях – то Образцы, то Заказ, то КП по одной и той же детали (хотя по ней жёстко прописан фильтр в коде)

Нравится

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

Чтобы не было описанной путаницы, я бы предложил сделать три разных клиентских модуля, в которых родителем указан OrderDetailV2, и прицепил бы их в качестве трех деталей. Код карточки у вас уже есть, останется только название schemaName новые прописать

Александр, честно говоря, не совсем понял, как это сделать. Но Ваша подсказка натолкнула на идею, которая сработала - просто создал 3 детали на основе объекта Заказ через мастер деталей, и разместил их на странице контрагента, далее прописал фильтры на каждую из них - и всё заработало! Спасибо

"Антон Кравченко" написал:просто создал 3 детали на основе объекта Заказ

Ну я это и предложил :)
Только вручную создать, хотя и с помощью мастера тоже можно

Показать все комментарии
раздел
фильтр
чекбокс
Технические вопросы
7.x

Добрый день!
В ITIL в разделе Обращения есть фильтр-галочка "Показать закрытые".
По умолчанию закрытые обращения не отображаются, при нажатии на фильтр-галочку начинают показываться.

сам фильтр( его отображение) добавляется в схеме CaseSection

Хотелось бы создать по аналогии фильтр-галочку в этом же разделе - "показать разрешенные".
Унаследована схема CaseSection
Прописаны по аналогии атрибуты и расположение фильтра в разделе
attributes: {
"IsDesideActive": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
value: false
},
"StatusDesideFilterContainerDisplay": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
value: true
}
},

diff: /**SCHEMA_DIFF*/[
//FiltersContainer
{
"operation": "insert",
"parentName": "IsActiveFiltersContainer",
"propertyName": "items",
"name": "IsDesideActive",
"values": {
"caption": {
bindTo: "Resources.Strings.CheckBoxDesideFilterCaption"
},
"bindTo": "IsDesideActive",
"controlConfig": {
"className": "Terrasoft.CheckBoxEdit",
"checkedchanged": {
"bindTo": "onCheckboxChecked"
},
"checked": {
"bindTo": "IsDesideActive"
}
}
}
}
]/**SCHEMA_DIFF*/

При этом новый фильтр-галочка не вмещается и накладывается на фильтр фиксированный по ответственному

Скажите, пожалуйста, как правильно расположить фильтр в разделе?
Унаследовала схему CheckBoxFixedFilterStyle - полагаю, что в нее нужно внести какие-то изменения,
чтобы разместить фильтр правильно - но вот какие?

Нравится

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

я бы попробовал внутри "values" описания новых "галочек" добавить параметр "layout", а вот в нем подобрать значения определяющие положение контрола
"values": {
...
"layout": {"column": 14, "row": 0, "colSpan": 2},
...
}

не помогает, я так понимаю, что нужно именно подвинуть как-то расположение уже существующих фиксированных фильтров

"Татаровская Дарья" написал:нужно именно подвинуть как-то расположение уже существующих фиксированных фильтров

я вот пока как их сдвинуть не нашел :)
Тоже попробовал в эту панель добавить элементы, пока не особо получилось, подождем может что кудесники из поддержки подскажут

В первую очередь необходимо увеличить размер контейнера, в который Вы добавляете свой элемент:
{
"operation": "merge",
"name": "IsActiveFiltersContainer",
"values": {
"styles": {"width":"360px"},
"layout": {"column": 0, "row": 0, "colSpan": 24}
}
}
Далее необходимо, чтобы уже находящийся в контейнере первый чекбокс не заполнял все доступное пространство:
{
"operation": "merge",
"name": "IsActive",
"values": {
"layout": {"column": 0, "row": 0, "colSpan": 12},
"styles": {"width":"50%"}
}
}
Для корректного отображения у себя в определении элемента, добавьте следующие свойства:
"values": {
"caption": {
bindTo: "Resources.Strings.CheckBoxDesideFilterCaption"
},
"layout": {"column": 12, "row": 0, "colSpan": 12},
"styles": {"width":"50"},

"Александр Зубков" написал:Далее необходимо, чтобы уже находящийся в контейнере первый чекбокс не заполнял все доступное пространство

Вот теперь понятно почему у меня контрол не виден новый был. Спасибо)

Спасибо

Показать все комментарии
преднастроенные фильтры
фильтр
Технические вопросы
7.x

Доброго времени суток, сообщество! Столкнулся со следующей проблемой и надеюсь на вашу помощь.

В разделе есть два преднастроенных фильтра: Дистрибьютор и ShipTo . Нужно чтобы после выбора значения в фильтре "Дистрибьютор" обновлялся параметр "filter" для фильтра "ShipTo".

Подробнее: В фильтре "ShipTo" пользователь должен иметь возможность выбрать запись только из тех, которые есть у Дистрибьютора, выбранного в фильтре "Дистрибьютор", на детали ShipTo.

Как реализовать фильтр в общем понятно. Но проблема в том, что фильтр инициализируется лишь раз, а мне надо чтобы при выборе одного фильтра проходила "переинициализация" другого.

Надеюсь понятно объяснил, это было не легко :smile:

Прилагаю код моих преднастроенных фильтров:

initFixedFiltersConfig: function(recursion) {
                    var self = this;
                    var fixedFilterConfig = {
                        entitySchema: this.entitySchema,
                        filters: [
                            {
                                name: "SxDistributor",
                                caption: this.get("Resources.Strings.SxDistributorFilterCaption"),
                                addSxDistributorCaption: this.get("Resources.Strings.SxAddDistributorFilterCaption"),
                                referenceSchemaName: "Account",
                                entityColumn: {
                                    isLookup: true
                                },
                                notNeedCurrentUser: true,
                                dataValueType: this.Terrasoft.DataValueType.LOOKUP,
                                filter: function(){
                                    // Получаем список контрагентов у которых есть тип "Дистрибьютор"
                                    if(self.get('AccountId').length > 0) {
                                        //  Фильтруем контрагентов по полученному списку
                                        return Terrasoft.createColumnInFilterWithParameters(
                                            "Id", self.get('AccountId'));
                                    }else{
                                        return false;
                                    }
                                },
                                getFilter: function (filterInfo) {
                                    if(filterInfo.value) {
                                        /*  Генерируем фильтр для ShipTo   */
                                        var ShipToId = [];  //  Список ShipTo выбранного Контрагента
                                        var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
                                            rootSchemaName: 'SxShipTo'
                                        });
                                        esq.addColumn('Id');
                                        esq.filters.add('SxAccount',
                                            esq.createColumnFilterWithParameter(
                                                Terrasoft.ComparisonType.EQUAL, 'SxAccount', filterInfo.value[0]));
                                        esq.getEntityCollection(function (response) {
                                            if (response.success) {
                                                ShipToId = [];
                                                response.collection.each(function (item) {
                                                    ShipToId.push(item.values.Id);
                                                });
                                                self.set('ShipToId', ShipToId);

                                                // TODO Надо обновить filter для фильтра ShipTo
                                            }
                                        }, this);

                                        /*  Фильтруем раздел по полю Контрагент    */
                                        var filter;
                                        filterInfo.value && (filter = Terrasoft.createColumnInFilterWithParameters(
                                            "SxAccount", filterInfo.value));
                                        return filter;
                                    }
                                }
                            },

                            {
                                name: "SxShipTo",
                                caption: this.get("Resources.Strings.SxShipToFilterCaption"),
                                addSxShipToCaption: this.get("Resources.Strings.SxAddShipToCaption"),
                                referenceSchemaName: "SxShipTo",
                                entityColumn: {
                                    isLookup: true
                                },
                                notNeedCurrentUser: true,
                                dataValueType: this.Terrasoft.DataValueType.LOOKUP,
                                filter: function(){
                                    //  Получаем список записей ShipTo выбранного Контрагента
                                    if(self.get('ShipToId').length > 0) {
                                        return Terrasoft.createColumnInFilterWithParameters(
                                            "Id", self.get('ShipToId'));
                                    }else{
                                        //  Если ShipTo пустой ставим невыполнимый фильтр. Список пуст.
                                        return Terrasoft.createColumnIsNullFilter("Id");
                                    }
                                },
                                getFilter: function (filterInfo) {
                                    //  Фильтруем раздел по полю ShipTo
                                    var filter;
                                    filterInfo.value && (filter = Terrasoft.createColumnInFilterWithParameters(
                                        "SxShipTo", filterInfo.value));
                                    return filter;
                                }
                            }
                        ]
                    };
                    this.set("FixedFilterConfig", fixedFilterConfig);
                }

Нравится

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

Вячеслав, добрый день!

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

Как вариант, можно вызвать повторную инициализацию всех фильтров, добавив вызов метода self.initFilters() примерно в том месте, где у Вас расположен комментарий

// TODO Надо обновить filter для фильтра ShipTo

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

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

1) Изменить метод getFilter первого фильтра примерно так:

getFilter: function (filterInfo) {
	if (!self.get("ChildFiltersInitializing")) {
		if(filterInfo.value) {
			/*  Генерируем фильтр для ShipTo   */
			var ShipToId = [];  //  Список ShipTo выбранного Контрагента
			var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
				rootSchemaName: 'SxShipTo'
			});
			esq.addColumn('Id');
			esq.filters.add('SxAccount',
			esq.createColumnFilterWithParameter(
				Terrasoft.ComparisonType.EQUAL, 'SxAccount', filterInfo.value[0]));
			esq.getEntityCollection(function (response) {
				if (response.success) {
					ShipToId = [];
					response.collection.each(function (item) {
						ShipToId.push(item.values.Id);
					});
					self.set('ShipToId', ShipToId);
 
					// TODO Надо обновить filter для фильтра ShipTo
 
					self.set("ChildFiltersInitializing", true);
					self.initFilters();
				}
			}, this);
		} else {
			if ((self.get("ChildFiltersInitializing") !== undefined) && self.get("ShipToId")) {
				self.set("ShipToId", null);
				self.set("ChildFiltersInitializing", true);
				self.initFilters();
			}
		}
	}
 
	/*  Фильтруем раздел по полю Контрагент    */
	var filter;
	filterInfo.value && (filter = Terrasoft.createColumnInFilterWithParameters(
		"SxAccount", filterInfo.value));
	return filter;
}

2) добавить переопределение метода onFilterUpdate для инициализации флага:

onFilterUpdate: function() {
	this.callParent(arguments);
	if (this.get("ChildFiltersInitializing")) {
		this.set("ChildFiltersInitializing", false);
	}
}

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

Показать все комментарии
фильтр
Технические вопросы
Разработка

Добрый день!

Прошу помочь с таким вопросом -

как получить возможность фильтровать данные по нескольким полям (критериям)?
Например по контрагентам + по средствам связи + и.т.д.

Спасибо.

Нравится

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

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

Здравствуйте.
Такая возможность была добавлена только в версии 3.5.2 в сборках, которые были выпущены после 14.03.2014. При такой фильтрации используется логический оператор "И". Если у Вас более ранняя версия, то для выбора множественного условия нужно использовать менеджер фильтрации (слева внизу) + там существует возможность выбора разных условий (И, ИЛИ, =, <> и т. д.).

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