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

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

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;
                }
            }
    }
Показать все комментарии