Уважаемые форумчане.
Вопрос по версии 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 комментария

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

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

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

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

Здравствуйте, возникла задача программно с серверной части добавить отчет на д. Файлы и ссылки.
Для этого нужно обратиться в 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 комментариев

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

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

Мотков Илья,

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

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

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

Добрый день!

Как в 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+SD 3.40.143.0
Спасибо.

Нравится

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

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

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

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

Коллеги, просьба помочь разобраться с деталями. Версия 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 детали на основе объекта Заказ

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

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

Добрый день!
В 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"},

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

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

Спасибо

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

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

В разделе есть два преднастроенных фильтра: Дистрибьютор и 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. При такой фильтрации используется логический оператор "И". Если у Вас более ранняя версия, то для выбора множественного условия нужно использовать менеджер фильтрации (слева внизу) + там существует возможность выбора разных условий (И, ИЛИ, =, <> и т. д.).

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