16.04.2010, 10:24 | #1 |
Участник
|
Различные значения полей в одной записи для разных пользователей
Столкнулся с такой задачей: есть какая-то запись сущности new_web, относительно которой периодически выполняется бизнес-процесс, которому передаются значения полей из этой записи. Так вот, возникла необходимость сделать так, чтобы скажем у одного пользователя в поле "фильтр" было одно значение, а у другого - другое и бизнес-процесс уже выполнялся для каждого пользователя со своим значением. Ну что-то в этом роде. Не подскажете, какие пути решения можно найти для решения такой задачи?
|
|
16.04.2010, 10:35 | #2 |
Чайный пьяница
|
Цитата:
Сообщение от Tarasov E
Столкнулся с такой задачей: есть какая-то запись сущности new_web, относительно которой периодически выполняется бизнес-процесс, которому передаются значения полей из этой записи. Так вот, возникла необходимость сделать так, чтобы скажем у одного пользователя в поле "фильтр" было одно значение, а у другого - другое и бизнес-процесс уже выполнялся для каждого пользователя со своим значением. Ну что-то в этом роде. Не подскажете, какие пути решения можно найти для решения такой задачи?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
16.04.2010, 10:55 | #3 |
Участник
|
Загрузил скрин формы, для более точного объяснения.
Так вот: допустим есть 2 неких пользователя в системе. 1 пользователь хочет установить фильтр(выделенное поле на скрине) по слову ЗАО, а второй по слову ФИНАНСЫ. Бизнес процесс использует значение этого поля в своем алгоритме, и если находит это слово в определенном контенте, то уведомляет об этом пользователя(с уведомлениями я разобрался). Мне нужно, чтобы для этой записи у 1 пользователя выполнялся бизнес процесс относительно его данных, тоесть ЗАО, а у второго относительно слова ФИНАНСЫ. Я понимаю, что можно просто наплодить записи с различными данными, но может то, что я описал выше как то реализуемо? |
|
16.04.2010, 11:48 | #4 |
Чайный пьяница
|
Цитата:
Сообщение от Tarasov E
Загрузил скрин формы, для более точного объяснения.
Так вот: допустим есть 2 неких пользователя в системе. 1 пользователь хочет установить фильтр(выделенное поле на скрине) по слову ЗАО, а второй по слову ФИНАНСЫ. Бизнес процесс использует значение этого поля в своем алгоритме, и если находит это слово в определенном контенте, то уведомляет об этом пользователя(с уведомлениями я разобрался). Мне нужно, чтобы для этой записи у 1 пользователя выполнялся бизнес процесс относительно его данных, тоесть ЗАО, а у второго относительно слова ФИНАНСЫ. Я понимаю, что можно просто наплодить записи с различными данными, но может то, что я описал выше как то реализуемо?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
16.04.2010, 17:23 | #5 |
Moderator
|
Можно использовать JS, который будет запрашивать имя+роли текущего пользователя и на основании этих данных будет подставлять значение. Но, вы правы, любые значения по умолчанию чреваты неверным заполнением данных и замусориванием базы. Я бы сказал, что их следует использовать, если значение по умолчанию верно в 90%.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
20.04.2010, 08:26 | #6 |
Участник
|
Цитата:
Сообщение от Артем Enot Грунин
Можно использовать JS, который будет запрашивать имя+роли текущего пользователя и на основании этих данных будет подставлять значение. Но, вы правы, любые значения по умолчанию чреваты неверным заполнением данных и замусориванием базы. Я бы сказал, что их следует использовать, если значение по умолчанию верно в 90%.
|
|
20.04.2010, 08:48 | #7 |
Moderator
|
Извините, я не внимательно читал. Ну вариант еще сделать развязочный объект "Фильтры пользователей", который будет содержать слова фильтра и ссылку на пользователя. N:N сделать предлагаю. Пусть, тогда ваш алгоритм ищет в контексте все слова из этого объекта и уведомляет нужного пользователя.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
|
За это сообщение автора поблагодарили: Tarasov E (1). |
20.04.2010, 09:27 | #8 |
Участник
|
Цитата:
Сообщение от Артем Enot Грунин
Извините, я не внимательно читал. Ну вариант еще сделать развязочный объект "Фильтры пользователей", который будет содержать слова фильтра и ссылку на пользователя. N:N сделать предлагаю. Пусть, тогда ваш алгоритм ищет в контексте все слова из этого объекта и уведомляет нужного пользователя.
То есть если я правильно понял: 1. Нужно создать новую сущность "фильтры пользователей". 2. Создать лукап поле, связанное с этой сущностью как N:N 3. Брать значение поискового фильтра из полей связанной через лукап сущности "фильтры пользователей". 4. Отправлять уведомления выбранному в лукапе пользователю. Если я правильно понял, то вот какие вопросы возникли: Опять таки в один момент времени бизнес процесс(а он периодически повторяется) будет брать настройки поискового фильтра у одного пользователя. После смены пользователя в лукапе, может возникнуть(и скорее всего так и произойдет) то, что ранее запущенный бизнес процесс, обратившись к значению поля лукап, выдернет уже чужие данные оттуда и рассылку делать уже другому. То есть саму задачу, когда у каждого пользователя должны быть свои данные в форме(кроме варианта наплодить записей), это не решит? Извините, если я вас не так понял Последний раз редактировалось Tarasov E; 20.04.2010 в 09:45. |
|
20.04.2010, 10:43 | #9 |
Moderator
|
Я недостаточно точно выразился: код все равно придется исправить. Если сейчас ваш шаг БП берет данные поля "фильтр" из объекта new_web и уведомляет владельца new_web, то мной предлагается следующая модификация.
1. Убираем из new_web поле фильтр и, желательно даже владелец (владеть объектом должна организация). 2. Создаем связанный с new_web как N:1 объект new_userfilter. Этим объектом будут владеть пользователи. У него будет атрибут "фильтр". 3. Вы создаете ваш new_web с настройками веб ресурса, после чего создаете связанные с ним new_userfilter с нужными значениями фильтра для каждого пользователя (можно и несколько для одного человека!). 4. Запускаете ваш циклический бизнес процесс. В нем ваш код запрашивает из базы все объекты "new_userfilter" связанные с конкретным экземпляром new_web для которого запущен процесс. Далее в цикле (условно) из этого объекта вычитывается id пользователя (владельца new_userfilter) и заданный им фильтр. После этого вызывается тот код который уже есть: тот который отсканирует что нужно, но уведомит владельца new_userfilter, а не new_web, как это было ранее. Надеюсь на этот раз я выразился яснее.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
|
За это сообщение автора поблагодарили: Tarasov E (1). |
20.04.2010, 12:16 | #10 |
Moderator
|
То о чем мы говорим - это стандартный рефакториг стандартной же ошибки проектирования. Часто при разработке системы полагается что связь будет 1:1, например, один заказ : один исполнитель. Потом появляются большие заказы где исполнителей должно быть n и тогда приходится делать развязки. В принципе задача достаточно тривиальная, хотя и несколько геморройная. Другого выхода пока не вижу.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
26.04.2010, 10:11 | #11 |
Участник
|
Спасибо! В общем пока был дан зеленый свет для реализации подобного метода. Итак.
1. Я создал сущность new_userfiltr и поместил на нее атрибуты "Фильтр по словам" и "Связанный субъект" (см.аттач). Кстати поле связанный субъект почему-то не отображает имя выбранного субъекта в связанной сущности new_web, возможно потому что это имя так же является связанным полем с сущностью интересы? Как это можно решить? 2. Цитата:
Запускаете ваш циклический бизнес процесс. В нем ваш код запрашивает из базы все объекты "new_userfilter" связанные с конкретным экземпляром new_web для которого запущен процесс.
Код: //Получаем идентификатор записи, породившей запуск бизнес-процесса Guid _entityid = workflowContext.PrimaryEntityId; string _entitytype = workflowContext.PrimaryEntityName; Цитата:
Далее в цикле (условно) из этого объекта вычитывается id пользователя (владельца new_userfilter) и заданный им фильтр.
Цитата:
После этого вызывается тот код который уже есть: тот который отсканирует что нужно, но уведомит владельца new_userfilter, а не new_web, как это было ранее.
Код: //Получиние ссылки на запись //I need organization name for Url Creation organization org = (organization)service.Retrieve(EntityName.organization.ToString(), workflowContext.OrganizationId, new ColumnSet(new string[] { "name" })); string orgname = org.name; url = string.Format("{0}{1}/CRMReports/viewer/drillopen.aspx?ID={2}&LogicalName={3}", new object[] { //I retrieve url of crm server with MSCRMServices part and clear it ((string)(Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\MSCRM").GetValue("ServerUrl"))).Replace("MSCRMServices", ""), orgname, _entityid, _entitytype}); return ActivityExecutionStatus.Closed; } |
|
26.04.2010, 10:58 | #12 |
Moderator
|
1. В лукапе отражается значение основного атрибута связываемой сущности. Если его нет на форме new_web и оно не заполняется, то, очевидно и в лукапе будет пусто. Можно сделать скрипт который будет вычитывать нужную информацию из базы и отражать в этом поле. А вообще похоже нужен более глубокий рефакториг.
2. БП по прежнему должен запускаться для new_web! Далее вы совершенно правильно получаете его id из контекста. Далее я бы использовал RetrieveMultiple сущности new_userfilter и задал бы ConditionExpresion на поиск new_userfilter, где поле "Связанный субъект" = полученному из контекста ID 3. По поводу уведомлений тоже понятно: в предыдущем шаге вы уже получили спектр new_userfilter которых нужно уведомлять. Ваш код мне ничего не сообщил относительно того, как вы делаете уведомления.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|