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

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

По примеру "Создание составного справочника" из http://www.terrasoft.ru/bpmonlinesdk/ настроил в версии 5.4.0.1170. Возникает ошибка при попытке добавить значение в дочернем справочнике Город:

Date: 23.05.2013 22:44:14
Date (UTC): 24.05.2013 5:44:14

Exception Message: Элемент с идентификатором "00000000-0000-0000-0000-000000000000" не найден
Exception Type: Terrasoft.Common.ItemNotFoundException
Exception Source: Terrasoft.Core

Exception Stack Trace:
at Terrasoft.Core.Manager`2.GetInstanceByUId(Guid uid)
at Terrasoft.WebApp.LookupGridPageEventsProcess`1.ScriptPageLoadExecute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
at Terrasoft.WebApp.LookupGridPageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.WebApp.LookupGridPageEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
at Terrasoft.WebApp.LookupGridPageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.WebApp.LookupGridPageEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message)
at Terrasoft.UI.WebControls.PageSchemaUserControl.ThrowEvent(String message)
at Terrasoft.UI.WebControls.Controls.PageContainer.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

SessionID: y00vk5nswr3wwoittxhu2y3m
Request URL: /1/ViewPage.aspx?Id=33cc4a3a-babb-464d-82a0-1b904d198d31&schemaUId=00000000-0000-0000-0000-000000000000&tempUserContextUId=c4396589-c110-4622-acd0-e1342a908fab&CustomWindowId=00000000-0000-0000-0000-000000000000
Request Path: /1/ViewPage.aspx
Request UrlReferrer: http://10.29.120.44/1/ViewPage.aspx?Id=3faff38f-6439-4670-b841-941b64c186d2
Request Type: GET
User Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31
User Host Address: 192.168.1.59
User: Supervisor
Is Authenticated: True
Authentication Type: Forms
Is Secure Connection: False

Application Version: 5.4.0.1170
Application Path: C:\inetpub\BPMonline\Terrasoft.WebApp\
Application Virtual Path: /1
Application Trust Level: Full
Machine Name: BPMDEV-APP-01
Is Local: False

Process ID: 2072
Process Name: w3wp.exe
Process Account Name: MMK\bpmiis
Thread Account Name: MMK\bpmiis
OS Version: Microsoft Windows NT 6.2.9200.0
Net Framework Version: 4.0.30319.18010
DBExecutor Type: MSSqlExecutor

Нравится

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

Добрый день!

Скорее всего проблема в том, что не передается либо передается некорректно ID родительской записи.
Проверьте, пожалуйста, выполнены ли действия по пункту 4.6
Чтобы точно сказать в чем причина, нужно смотреть схемы.

сами настройки в процессе:
// Идентификатор схемы страницы реестра основного справочника (UId схемы CountryGridPage).
ParentGridPageSchemaId = new Guid("f438b638-679f-4dc6-86fc-74de280e6362");
// Идентификатор схемы объекта Country.
ParentEntitySchemaId = new Guid("09fce1f8-515c-4296-95cd-8cd93f79a6cf");

// Идентификатор схемы страницы реестра подчиненного справочника (UId схемы CityGridPage).
DetailGridPageSchemaId = new Guid("303d39c2-a415-436c-b17d-41c2f11aa7d8");
// Идентификатор схемы объекта City.
DetailEntitySchemaId = new Guid("5ca90b6a-93e7-4448-befe-ab5166ec2cfe");
// Идентификатор колонки Country объекта City.
DetailAssociationColumnUId = new Guid("8fb75ea2-14b8-4bb1-8420-f3a650b11962");

// Идентификатор первичной колонки City (идентификатор колонки Id).
DetailSelectionColumnUId = new Guid("ae0e45ca-c495-4fe7-a39d-3ab7278e1617");

так определил uid страницы реестра:
http://screencast.com/t/NThFDihDC

так страны:
http://screencast.com/t/IerxPBvG

так выглядит при открытии составного:
http://screencast.com/t/uVQzQddhhNd

Антон, как заполнили DetailEntitySchemaId?
Определить, корректно ли указали идентификатор можно запросом к таблице SysSchemaInSolution

select * from SysSchemaInSolution where ID = '5ca90b6a-93e7-4448-befe-ab5166ec2cfe'

"Бондарь Наталия" написал:

Антон, как заполнили DetailEntitySchemaId?

Определить, корректно ли указали идентификатор можно запросом к таблице SysSchemaInSolution

SELECT * FROM SysSchemaInSolution WHERE ID = '5ca90b6a-93e7-4448-befe-ab5166ec2cfe'

DetailEntitySchemaId = это город = посмотрел метаданные по объекту Город.
http://screencast.com/t/jH5um1jq

в таблице, если смотреть по колонке SysSchemaId, выходит город.
http://screencast.com/t/7gzsfB7vd

в общем добавление в дочернем так и не работает.

Добрый день.
Однозначно, у Вас не задана схема страницы справочника.

"Антон Сидоров" написал:сами настройки в процессе:...

На каком событии у Вас вышеприведенная подписка? Т.е. когда Вы задаете параметры для страниц?

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