Добрый день! 

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

 

Изображение удалено.

 

Мне удалось сделать фильтр при изменении значении поле Вид процесса проекта фильтровать значение поле Тип проект в мобильном приложении.

Изображение удалено.

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

Таблица Project содержет в себе поля

PsProcessType - вид процесса проекта и

ProjectSubType - тип проекта.

Соответственно данные этих полей берется из двух объектов справочников: 

PsProjectProcessType - Вид процесса проекта,

PsProjectSubType  - Тип проекта.

Объект PsProjectSubType содержит в себе связывающий двух столбец PsProjectProcessType.

Нравится

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

Добрый день,

 

Если связь между PsProjectProcessType и PsProjectSubType это связь один ко многим, то можно использовать MutualFiltration. Простой пример: фильтровать город по стране и наоборот. В таком случае код будет такой:

Terrasoft.sdk.Model.addBusinessRule('Contact', {
	ruleType: Terrasoft.RuleTypes.MutualFiltration,
	triggeredByColumns: ['Country'],
	filteredColumn: 'City',
	filteringPropertyName: 'Country'
});

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

 

Прямое: при выставлении поля-родителя фильтруемому полю выставляется фильтр (если поле-родитель заполнено)

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

 

triggeredByColumns – имя колонки-родителя (один-ко-многим) в модели карточки

filteredColumn – имя фильтруемой колонки (один-ко-многим)  в модели карточки

filteringPropertyName – имя колонки-родителя в модели фильтруемого поля

Спасибо Oleg Drobina,

Реализовал фильтр следующим образом.

Terrasoft.sdk.Model.addBusinessRule('Project', {
    ruleType: Terrasoft.RuleTypes.MutualFiltration,
    triggeredByColumns: ["PsProcessType", "ProjectSubType"],
    connections: [
        {
            parent: "PsProcessType",
            child: "ProjectSubType",
            connectedBy: "PsProjectProcessType"
        }
    ]
});

Но есть одна проблема. При очистке значении поле Тип проекта  значение поле Вид процесса проекта  остается все еще выбранным. Нужно чтобы значение этого поле тоже сбрасывался. Или как можно сделать так, чтобы поле Вид процесса проекта выбрался автоматический, при выборе Типа проекта

Oleg Drobina, 

можете ответить на данный вопрос?

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

Пробывал разные варианты и filterMethod и lookupListConfig с указанием нужного поля, но для редактируемого реестра не заводится, каким еще способом можно отфильтровать записи справочного поля в детали с редактируемым реестром при создании или же изменении записи на детали?

Нравится

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

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

Опишите подробнее, что именно не получается. Приведите пример Вашего кода.

Проблема решена при помощи переопредления метода:

getGridRowViewModelConfig: function(config) {

                var result = this.callParent(arguments);

                if (result && result.rowConfig && result.rowConfig.Contact) {

                    result.rowConfig.Contact.lookupListConfig = {

                        "filters": [

                            function() {

                                var vendor = this.get("Vendor");

                                var filterGroup = Ext.create("Terrasoft.FilterGroup");

                                if (vendor && vendor.value) {

                                    filterGroup.add("Account",

                                        Terrasoft.createColumnFilterWithParameter(

                                            Terrasoft.ComparisonType.EQUAL, "[AccountInVendor:Account:Account].Vendor", vendor.value));

                                } else {

                                    filterGroup.add("Empty", Terrasoft.createColumnIsNullFilter("Id"));

                                }

                                

                

                                return filterGroup;

                            }

                        ]

                    };

                }

                return result;

            },

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

Добрый день!

Столкнулся с такой проблемой.

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

attributes: {
			"Contact": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"lookupListConfig": {
					"filters": [
						function() {
							var apt = this.get("VcApartment");
							var filterGroup = Ext.create("Terrasoft.FilterGroup");
							filterGroup.add("IsActive",
								Terrasoft.createColumnFilterWithParameter(
									Terrasoft.ComparisonType.EQUAL,
									"[ContactAddress:Contact].VcApt",
									apt.value));
							return filterGroup;
						}
					]
				}
			}
		},

Фильтр отрабатывает нормально. Но если создать новое обращение из карточки Контакта, то  система зависает и в консоли появляется следующая ошибка: Uncaught TypeError: Cannot read property 'value' of undefined. 

Изображение удалено.

 Понятно что ошибка вылазит из за того что поле Квартира не заполнено. Но вот как обойти эту ошибку не могу понять. 

Нравится

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

Добрый день!

Можно так:

attributes: {
	"Contact": {
		"dataValueType": Terrasoft.DataValueType.LOOKUP,
		"lookupListConfig": {
			"filters": [
				function() {
					var apt = this.get("VcApartment");
					var aptValue = apt && apt.value ? apt.value : "";
					var filterGroup = Ext.create("Terrasoft.FilterGroup");
					filterGroup.add("IsActive",
						Terrasoft.createColumnFilterWithParameter(
							Terrasoft.ComparisonType.EQUAL,
							"[ContactAddress:Contact].VcApt",
							aptValue ));
					return filterGroup;
				}
			]
		}
	}
}

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

Если нужно отображать все контакты, то

attributes: {
	"Contact": {
		"dataValueType": Terrasoft.DataValueType.LOOKUP,
		"lookupListConfig": {
			"filters": [
				function() {
					var apt = this.get("VcApartment");
					var filterGroup = Ext.create("Terrasoft.FilterGroup");
					if (apt) {
						filterGroup.add("IsActive",
						Terrasoft.createColumnFilterWithParameter(
							Terrasoft.ComparisonType.EQUAL,
							"[ContactAddress:Contact].VcApt",
							apt.value));
					}
					return filterGroup;
				}
			]
		}
	}
}

 

Добрый день!

Можно так:

attributes: {
	"Contact": {
		"dataValueType": Terrasoft.DataValueType.LOOKUP,
		"lookupListConfig": {
			"filters": [
				function() {
					var apt = this.get("VcApartment");
					var aptValue = apt && apt.value ? apt.value : "";
					var filterGroup = Ext.create("Terrasoft.FilterGroup");
					filterGroup.add("IsActive",
						Terrasoft.createColumnFilterWithParameter(
							Terrasoft.ComparisonType.EQUAL,
							"[ContactAddress:Contact].VcApt",
							aptValue ));
					return filterGroup;
				}
			]
		}
	}
}

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

Если нужно отображать все контакты, то

attributes: {
	"Contact": {
		"dataValueType": Terrasoft.DataValueType.LOOKUP,
		"lookupListConfig": {
			"filters": [
				function() {
					var apt = this.get("VcApartment");
					var filterGroup = Ext.create("Terrasoft.FilterGroup");
					if (apt) {
						filterGroup.add("IsActive",
						Terrasoft.createColumnFilterWithParameter(
							Terrasoft.ComparisonType.EQUAL,
							"[ContactAddress:Contact].VcApt",
							apt.value));
					}
					return filterGroup;
				}
			]
		}
	}
}

 

Сидоров Александр В.,

Спасибо, все получилось! 

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

Здравствуйте! Столкнулся с такой проблемой, есть деталь она прикреплена к Активности, в активности и в данной детали есть поля ссылающиеся на контакт, необходимо при добавлении записи в детали передавать в поле контакт контакт из активности. Пробовал через обработку событий перед сохранением записи на детали  не помогло:

Terrasoft.sdk.Model.setModelEventHandler("WaRecordClientToEventInVisit", 
	Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.Before].insert,
	function(config) {
		debugger;
		var record = config.scope.eventConfig.records[0];
		window.console.log(record);
		var contact = record.data.Activity.data.Contact;
		record.data.Contact = contact;
		window.console.log(record);
		Ext.callback(config.success, config.scope);
});

нужно передавать либо фильтровать контакты. Подскажите как можно реализовать данный кейс?

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

Нравится

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

Такое можно реализовать на уровне серверной логики — во встроенном или отдельном БП на событии сохранения записи детали. Он сработает в момент сохранения, если онлайн-ражим, или в момент синхронизации с основной базой.

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

Здравствуйте. Как реализовать в форме отчета, поле выбора несколько значений из справочника и корректно передать/обработать выбранные Id в сам отчет?

При поиске наткнулся на примеры с Ответственным, но там выбор только 1 записи.

Нравится

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

Можно сделать как в стандартных отчётах в разделе, которые вызываются из режима итогов, например, «Data entry compliance» в разделе контрагентов. Для построения отчёта в реестре фильтруют или помечают галочками нужные записи, переключаются в итоги, выбирают этот отчёт, а потом строят по выделенным, по отфильтрованным или по всем:

Схема этого отчёта AccountDataCompletenessReport, привязка таких отчётов к разделам задаётся в таблице SysModuleAnalyticsReport. Для выбора вариантов формирования используется страница BaseReportParameterInModulePageFilter.

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

это должен быть фильтр по lookup, а не самим записям в реестре.

Можно добавить отчёт именно в тот раздел, записи из которого нужно Вам фильтровать.

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

суть в том что такого раздела не существует это справочник. Ладно давайте конкретнее. У меня есть раздел Складские документы где ведется учет прихода/ухода Продуктов по складам(справочник) и мне нужно что бы в каком-то  отчете раздела Складские документы было окно выбора несколько складов на каких будет проверяться количество конкретного продукта. Это без проблем можно реализовать в тройке (TS 3) через MultiSelectWindow.

Можно и склады завести разделом. Либо смотреть аналогичные карточки свойств отчётов, где могут быть такие поля множественного выбора. В стандартных отчётах Sales встречаются только обычные справочные.

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

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

BPM 7.5.
Есть объекты "UsrDepartment" и "UsrKnowledgeLevel", связанные отношением "многие-ко-многим", т.е. с одним департаментом может быть связаны одно или несколько левелов, а один и тот-же левел может принадлежать многим департаментам. Создал для этой цели состаной справочник.

Составной справочник

Есть форма, на ней поля "Department" и "KnowledgeLevel". Нужно реализовать, чтобы при изменении значения департамента изменялся список доступных для выбора поле в "KnowledgeLevel". Как это реализовать? Лучше клиентским JavaScript, хотя можно и C#, только плиз опишите подробно, куда его тогда вставить.

Фильтрация левела от департмента

И еще вопрос, в данный момент подчинённый объект "KnowledgeLevel" НЕ содержит колонку-ссылка на родительский объект. Необходима ли она? И если да, как сделать так, чтобы она автоматически заполнялась UId выбранного департамента при добавлении записи "KnowledgeLevel" в окне составного справочника?

Спасибо!

Нравится

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

Думаю, что вам необходимо реализовать на js подобную конструкцию:

attributes: {
	"UsrKnowledgeLevel": {
		lookupListConfig: {
			filter: function() {
				var department = this.get("UsrDepartment");
				var leftExpression = "[UsrKnowledgeLevelInUsrDepartment:UsrKnowledgeLevel].UsrDepartment";
				var filter = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
						leftExpression, department);
				return filter;
			}
		}
	}
}

*var leftExpression = "[UsrKnowledgeLevelInUsrDepartment:UsrKnowledgeLevel].UsrDepartment";

Подразумевается, что есть объект для связи "многие-ко-многим" - UsrKnowledgeLevelInUsrDepartment, у которого есть поля UsrKnowledgeLevel и UsrDepartment

Добрый день! Комментарий предоставлен по пунктам.

Настройка логики полей карточки (бизнес-правила)

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

Подготовка
Для работы с бизнес правилами нужно добавить в страницу зависимость от модуля бизнес правил:

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

rules: {
    "Contact": {
        FiltrationContactByAccount: {
            //Указываем тип правила
            ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
           //Указываем будет ли обратное автозаполнение
            autocomplete: true,
            //Указываем мета-путь относительно базового обьекта('Contact') 
            //по которому будем фильтровать
            baseAttributePatch: "Account",
            //Указываем тип фильтрации
            comparisonType: Terrasoft.ComparisonType.EQUAL,
            //Указываем тип значения для фильтрации
            type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
            //Указываем атрибут модели для сравнения (если тип значения - атрибут)
            attribute: "Account",
            //Указываем мета-путь значения в выбранном атрибуте (если нужно)
            attributePath: "",
            //Если тип значения не атрибут, указываем значение 
            //(константа | имя системной настройки | имя системного значения)
            value: ""
        }
    },
    "City": {
        FiltrationCityByCounty: {
            ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
            autocomplete: true,
            baseAttributePatch: "Country",
            comparisonType: Terrasoft.ComparisonType.EQUAL,
            type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
            attribute: "Country",
            attributePath: "",
            value: ""
        },
        FiltrationCityByRegion: {
            ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
            autocomplete: true,
            baseAttributePatch: "Region",
            comparisonType: Terrasoft.ComparisonType.EQUAL,
            type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
            attribute: "Region",
            attributePath: "",
            value: ""
        }
    }
}

Описание зависимостей между колонками, нужно указывать в описание колонок в объекте attributes в свойстве колонки dependencies
Наложении произвольной фильтрации, сортировка и добавление дополнительных колонок в запрос при отображении выпадающего списка нужно указывать явно в описание колонок в объекте attributes в свойстве колонке lookupListConfig.

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

attributes: {
    "Probability": {
        dependencies: [
            {
                columns: ["Owner"],
                methodName: "getProbability"
            }
        ],
        lookupListConfig: {
            columns: ["Value"],
            orders: [
                {
                    columnPath: "Value",
                    direction: Terrasoft.OrderDirection.DESC
                }
            ],
            filter: function() {
                return Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.GREATER,
                    "Value", 40);
            }
        }
    }
}

Спасибо, заработало! Правда Вы немного ошиблись в createColumnFilterWithParameter, нужно 3м параметром не "department", а "department.value", и после этого работает! Правда, если в поле KnowledgeLevel выбрал левел для Department1, и мы меняем департмент на Department2, то поле не очищается от прежнего значения, уже, возможно, некорректного для Department2.
Вот мой полный код:

attributes: 
{
    "UsrKnowledgeLevel":
    {
        lookupListConfig:
            {
                filter: function () {
                    var department = this.get("UsrDepartmentUsr");
                    var leftExpression = "[UsrDepartmentByLevel:UsrKnowledgeLevel].UsrDepartment";
                    var filter = Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.EQUAL,
						leftExpression,
						department.value
					);
                    return filter;
                }
            }
    }
Показать все комментарии

Добрый день!
BPM 7.1
у меня возникла проблема написать, вроде на первый взгляд не сложная, простой фильтр котрорый должен срабатывать при открытии Lookup.

type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'UsrPlanningPrice',
columnPath: 'UsrPlanningPrice',   //справочник, таблица [UsrCropInPlanning]
dataValueType: Terrasoft.DataValueType.LOOKUP,
visible: true,
filter: function() {
        var purchaseDate = this.get('UsrDate');
        if (!Ext.isEmpty(purchaseDate)) {

                var subSelect = Ext.create('Terrasoft.EntitySchemaQuery', {
                        rootSchemaName: 'UsrPlanning',
                        rowCount: 1
                });

                subSelect.addColumn('Id');
               
                subSelect.filters.add("TypeFilter",
                        subSelect.createColumnFilterWithParameter(
                        Terrasoft.ComparisonType.EQUAL,
                        'UsrType',
                        '1CC0703B-FA0D-4711-A1E4-14DEFA3C19EA')); //const
                               
                subSelect.filters.add("DateFilter",
                        subSelect.createColumnFilterWithParameter(
                        Terrasoft.ComparisonType.LESS_OR_EQUAL,
                        'UsrDate',
                        purchaseDate));

                return Terrasoft.createCompareFilter(
                        Terrasoft.ComparisonType.EQUAL,
                        'UsrPlanning',
                        subSelect);
        }
}

в результате хочу:

SELECT TOP 15 [UsrCropInPlanning].[Id] [Id]
        ,[UsrCropInPlanning].[UsrName] [UsrName]
FROM [dbo].[UsrCropInPlanning] [UsrCropInPlanning]
WHERE [UsrCropInPlanning].[UsrPlanningId] = (SELECT
        TOP 1 [Id]
        FROM [dbo].[UsrPlanning]
        WHERE UsrTypeId = @P1 AND [UsrPlanning].[UsrDate] = @P2)

то есть мне нужно отобрать в таблице поля справочника UsrPlanningPrice только те записи которые относяться к одному "планированию" выбраному по указаной дате.

прошу помочь, либо сказать как такое можно реализовать?
спасибо.

Нравится

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

Добрый день!

Воспользуйтесь бизнес-правилом с типом "Фильтрация". Ниже пример из документации.

{
    type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
    name: 'Contact',
    columnPath: 'Contact',
    dataValueType: Terrasoft.DataValueType.ENUM,
    visible: true,
    rules: [{
        //Указываем тип правила
        ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
        //Указываем будет ли обратное автозаполнение
        autocomplete: true, 
        //Указываем мета-путь относительно базового обьекта('Contact')
        //по которому будем фильтровать
        baseAttributePatch: 'Account',
        //Указываем тип фильтрации
        comparisonType: Terrasoft.ComparisonType.EQUAL,
        //Указываем тип значения для фильтрации
        type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
        //Указываем атрибут модели для сравнения (если тип значения - атрибут) 
        attribute: 'Account',
        //Указываем мета-путь значения в выбранном атрибуте (если нужно)
        attributePath: '',
        //Если тип значения не атрибут, указываем значение 
        //(константа | имя системной настройки | имя системного значения)
        value: ''
    }]
}

Дмитрий, спасибо за предоставленный пример.

у моего случая есть одна особенность, записей в таблице может не быть за указаное число и нужно брать первый что был до указаной даты, для этого я и написал условия "TOP 1" и "<=":

SELECT TOP 1 
	[Id]
FROM [dbo].[UsrPlanning]
WHERE UsrTypeId = @P1
	AND [UsrPlanning].[UsrDate] <= @P2

Владимир, здравствуйте.

Попробую уточнить возможна ли такая реализация и сообщу Вам результат завтра в этой теме в течении дня.

Дмитрий, сообщите пожалуйста что удалось выяснить по данному вопросу.

С уважением,
Владимир Саварин
Айти-Сфера

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

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