Добрый день!
Существует задача - задать вопрос пользователю, который является начальником у контакта, который запускает БП. Организационная структура большая, поэтому базовые способы не подходят.
Все начальники входят в функциональную роль "Начальники".
Реализацию вижу следующим способом:
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 контакта, который является начальником в заданной группе