Вопрос

Задание-сценарий в БП: фильтрация

Добрый день!



Существует задача - задать вопрос пользователю, который является начальником у контакта, который запускает БП. Организационная структура большая, поэтому базовые способы не подходят.



Все начальники входят в функциональную роль "Начальники".



Реализацию вижу следующим способом:

1) Считать группу ответственных

2) Найти контакт, который входит в эту группу и в группу "начальники"

3) Если этот контакт не совпадает с ответственным, запустившим БП, то передать его в параметр БП

4) Если контакт совпадает, то взять ParentRoleID и повторить поиск по новой группу+группа начальников, а затем уже передать найденный контакт в параметр БП

5) Если вышестоящей группы нет - тогда уже передать что есть (контакт, совпадающий с ответственным, запустившим БП)



Навыки владения C# скудны, поэтому прошу помощь в понимании следующих нюансов:

1) Как считать нужные данные

2) Как найти контакт, который входит в обе группы

3) Как передать найденное значение в параметр БП для его дальнейшего использования



Буду признателен за помощь.



 

Нравится

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

Большую часть этой логики, а то и всю, можно попробовать сделать чисто на уровне элементов процесса: чтения с условиями фильтрации, условных потоков. В фильтры можно подставлять значения из параметров процесса и из параметров других элементов.

Это можно было бы сделать, будь у меня пользователь только в одной роли. Как найти 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 контакта, который является начальником в заданной группе

Поправка, лучше использовать таблицу SysUserInRole

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