Добрый день!
Существует задача - задать вопрос пользователю, который является начальником у контакта, который запускает БП. Организационная структура большая, поэтому базовые способы не подходят.
Все начальники входят в функциональную роль "Начальники".
Реализацию вижу следующим способом:
1) Считать группу ответственных
2) Найти контакт, который входит в эту группу и в группу "начальники"
3) Если этот контакт не совпадает с ответственным, запустившим БП, то передать его в параметр БП
4) Если контакт совпадает, то взять ParentRoleID и повторить поиск по новой группу+группа начальников, а затем уже передать найденный контакт в параметр БП
5) Если вышестоящей группы нет - тогда уже передать что есть (контакт, совпадающий с ответственным, запустившим БП)
Навыки владения C# скудны, поэтому прошу помощь в понимании следующих нюансов:
1) Как считать нужные данные
2) Как найти контакт, который входит в обе группы
3) Как передать найденное значение в параметр БП для его дальнейшего использования
Буду признателен за помощь.
Нравится
Большую часть этой логики, а то и всю, можно попробовать сделать чисто на уровне элементов процесса: чтения с условиями фильтрации, условных потоков. В фильтры можно подставлять значения из параметров процесса и из параметров других элементов.
Это можно было бы сделать, будь у меня пользователь только в одной роли. Как найти ID пользователя, если он в организационной роли и функциональной?
Зверев Александр,
Любые мои варианты сделать фильтрацию провалились. Как сделать фильтр, если человек может быть в двух группах и мне нужно найти его? Было бы "или" - вопросов нет. Если предлагаете какой-то вариант - тогда предлагайте до конца.
Поэтому возвращаемся к исходной задаче и к элементу [Задание-сценарий]. Просто документации с хорошо расписанными примерами просто нету, вот и прошу помощи
Зверев Александр,
Мне надо найти пользователя, который входит сразу и в группу ответственных и в группу функциональную. Это никак не "или". Я не говорю что там нет "или", я говорю что в моей задаче надо "и". И вроде как в описании задачи это написано.
Было бы "или" - вопросов нет.
Это никак не "или". Я не говорю что там нет "или", я говорю что в моей задаче надо "и".
Вы всё же определитесь, что Вам надо. Напишите SQL-запрос, которым бы хотели фильтровать записи, а потом уже думайте, как перевести на язык фильтров в дизайнере или на язык EntitySchemaQuery или Select в C#-скриптах.
Написал sql запрос, который находит нужный мне ID контакта (начальник отдела). Может по нему будет проще понять что же я хочу получить в итоге. Сами ID для поиска заранее определяются в БП:
A7E3D18A-0F2D-444D-BE2B-CD625DC3C097 - организационная роль
3DAFC997-65E9-47E4-9434-F036077D66F4 - функциональная роль
SELECT [ContactId]
FROM [URFUbase].[dbo].[SysAdminUnit] where [id] in (SELECT distinct r1.[SysAdminUnitId]
FROM [URFUbase].[dbo].[SysAdminUnitInRole] r1
join [URFUbase].[dbo].[SysAdminUnitInRole] r2 on r2.SysAdminUnitRoleId = '3DAFC997-65E9-47E4-9434-F036077D66F4' and r1.[SysAdminUnitId]=r2.[SysAdminUnitId]
where r1.SysAdminUnitRoleId = 'A7E3D18A-0F2D-444D-BE2B-CD625DC3C097')
Такой запрос, наверное, будет делать при помощи класса Select. Там синтаксис почти полностью повторяет SQL.
И этот запрос, мне кажется, было бы логичнее вывернуть наизнанку, сделав выборку из SysAdminUnitInRole r1 корневой, а получение Id контакта — колонкой подзапроса или ещё одним join-ом.
К сожалению у меня не получается реализовать задуманное. Даже близко не могу приблизиться к реализуемому. Выходит что-то такое:
UserConnection userConnection = Get<UserConnection>("UserConnection");
var group = Get<Guid>("ProcessSchemaParameter1");
var subSelect = new Select(userConnection).Column("r1", "SysAdminUnitId")
.From("SysAdminUnitInRole").As("r1").Join("SysAdminUnitInRole").As("r2")
.On("r2","SysAdminUnitInRole").IsEqual("3DAFC997-65E9-47E4-9434-F036077D66F4")
.And("r1","SysAdminUnitId").IsEqual("r2","SysAdminUnitId").Where("r1","SysAdminUnitRoleId").IsEqual(group);
var Select = new Select(userConnection).Column("ContactId").From("SysAdminUnit").Where("Id").IsEqual(subSelect);
Set("ProcessSchemaParameter2", Select);
return true;Очень нужна помощь в понимании того как делать правильно
var userConnection = Get<UserConnection>("UserConnection");
var group = Get<string>("ProcessSchemaParameter1");
string selectID = ((Select)new Select(userConnection)
.Column("t1", "SysAdminUnitId")
.From("SysAdminUnitInRole").As("t1")
.Join(JoinType.Inner, "SysAdminUnitInRole").As("t2")
.On("t2", "SysAdminUnitRoleId").IsEqual(Column.Parameter(new Guid("3DAFC997-65E9-47E4-9434-F036077D66F4")))
.And("t1","SysAdminUnitId").IsEqual("t2","SysAdminUnitId")
.Where("t1", "SysAdminUnitRoleId").IsEqual(Column.Const(group))).ExecuteScalar<string>();
var contact = ((Select)new Select(userConnection)
.Column("ContactId")
.From("SysAdminUnit")
.Where("Id").IsEqual(Column.Const(selectID))).ExecuteScalar<string>();
Guid contactId = new Guid (contact);
Set("ProcessSchemaParameter2", contactId);
return true;Это нечто решает мою задачу, а именно ищет ID контакта, который является начальником в заданной группе
