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

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

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

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

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

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

Спасибо!

Нравится

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

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

[javascript]
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;
}
}
}
}
[/javascript]

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

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

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

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

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

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

Пример
Название бизнес-правила может быть произвольным, но оно должно содержать в себе информацию о его предназначении.
Например, бизнес-правило по фильтрации поля Контакт по полю Контрагент может быть названо FiltrationContactByAccount.
[javascript]
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: ""
}
}
}

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

Пример описания зависимостей между колонками, наложения произвольной фильтрации и сортировки:
[javascript]
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);
}
}
}
}

[/javascript]

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

[javascript]
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;
}
}
}

[/javascript]

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

По примеру "Создание составного справочника" из 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
[sql]
select * from SysSchemaInSolution where ID = '5ca90b6a-93e7-4448-befe-ab5166ec2cfe'
[/sql]

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

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

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

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

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

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

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

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

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

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

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