02.02.2009, 07:05 | #21 |
Участник
|
Господа, вопрос еще актуален - помогите плз - RetrieveMultiple не срабатывает на попытку вернуть список записей. Какой Message срабатывает при отображении View, Отчетов и т.д.?
|
|
02.02.2009, 09:41 | #22 |
Moderator
|
Ну, отчеты - это вообще отдельная тема. При их запуске отрабатывает только SQL Server. Так что если хотите, чтобы в них работала Ваша система безопасности, то придется править запросы всех необходимых отчетов! Ну, или создавать свои фильтрованные вьюхи...
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
02.02.2009, 10:37 | #23 |
Чайный пьяница
|
Execute
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: Bakai Madybaev (1). |
02.02.2009, 12:11 | #24 |
Участник
|
Цитата:
Ну, отчеты - это вообще отдельная тема. При их запуске отрабатывает только SQL Server. Так что если хотите, чтобы в них работала Ваша система безопасности, то придется править запросы всех необходимых отчетов!
Цитата:
Ну, или создавать свои фильтрованные вьюхи...
|
|
02.02.2009, 13:01 | #25 |
Moderator
|
Меня не покидает ощущение, что вы искусственно создали себе работу. Про представления я необдуманно написал, если честно... Дело в том, что теперь есть конструктор отчетов доступный пользователям! И работает он именно с системными представлениями, так что подобные ухищрения уже не помогут. Напомните для чего вы занялись подобными ухищрениями?
p.s. Насколько я понимаю табличные представления заполняются Fetch запросом в методе Execute. Думаю a33ik меня поправит, если я не прав.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
02.02.2009, 13:26 | #26 |
Чайный пьяница
|
Цитата:
Сообщение от Артем Enot Грунин
p.s. Насколько я понимаю табличные представления заполняются Fetch запросом в методе Execute. Думаю a33ik меня поправит, если я не прав.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
02.02.2009, 13:48 | #27 |
Участник
|
Цитата:
Напомните для чего вы занялись подобными ухищрениями?
Цитата:
Хочу определить доступ к записи по определенному атрибуту сущности.
Думаю сделать так: Создать Определенную роль "Роль1". Написать Плагин на Pre Retrieve message, в котором буду по значению атрибута и наличию у пользователя "Роли1" возвращать/не возвращать данные. Поле "тип отношения" определяет, является ли Бизнес-партнер Действующим клиентом или Потенциальным клиентом. Действующие клиенты должны быть доступны для чтения ТОЛЬКО ограниченному списку подразделений. |
|
02.02.2009, 16:31 | #28 |
Moderator
|
А чем вас Интересы не устраивают? Другой объект, другие права доступа... Так и надо было делать... По мере работы интересы преобразуются в Бизнес-партнеров с сохранением истории и пр. По мне так все просто...
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
02.02.2009, 16:46 | #29 |
Участник
|
Цитата:
А чем вас Интересы не устраивают? Другой объект, другие права доступа... Так и надо было делать... По мере работы интересы преобразуются в Бизнес-партнеров с сохранением истории и пр. По мне так все просто...
С потенциальным клиентом ведется работа по возможным сделкам, предложениям и т.д. Значит нам нужен Бизнес-партнер (Контакт пока отпадает) - но Бизнес-партнер хранит записи о действующих клиентах, к которым доступ на чтение очень строгий. - а к потенциальным клиентам, с которыми уже начали работу по продажам, нужен более широкий доступ. |
|
02.02.2009, 18:18 | #30 |
Moderator
|
Я думаю, что вам с заказчиком надо пересмотреть процессы. CRM как концепция - это в том числе единая клиентская база. Исходя из этого утверждения, доступ к этой информации должны иметь все сотрудники допущенные в систему, иначе не избежать дублирования! Потенциальные возможности бывают, в том числе, и с уже существующими клиентами. Суть CRM в том и заключается, чтобы менеджер который выходит на заказчика был в курсе тех операций, которые с ним выполнялись в прошлом. Мне совершенно не ясно, как вы добьетесь этого, не позволяя сотрудникам просматривать список Организаций, Контактов и Интересов.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
|
За это сообщение автора поблагодарили: Bakai Madybaev (1). |
02.02.2009, 18:33 | #31 |
Moderator
|
Типовая ситуация: Подразделение А продало клиенту 1 отличные гайки. Прошло время и подразделение Б выходит на того же клиента и снова начинает продавать ему гайки, так как не знает, что клиент их уже приобрел. Эту ситуацию разрулили: отдел Б связался с А, договорился больше так не делать, после чего сообщил C, что клиент нуждается в болтах. Теперь появился отдел C и зная про А и ссылаясь на Б впарил клиенту болты неподходящего диаметра. Клиент слой как собака, звонит в Б, ругается, а те и сделать ничего не могут - просто не знают кто что продавал! Проходит еще время и ничего об этом не знающий менеджер из А звонит клиенту и говорит: "Я помню, что вам очень понравили наши гайки, не хотите ли еще тонну?" Вопрос: как далеко пойдет менеджер из А, если клиент уже кторый месяц рассверливает гайки, чтобы они подходили к болтам?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
04.02.2009, 12:34 | #32 |
Участник
|
Артем, спасибо за совет.
А реализовал след. образом: X++: XmlDocument configDoc; public AccountRetrieveMultipleHandler(string unsecureConfig, string secureConfig) { configDoc = new XmlDocument(); configDoc.LoadXml(unsecureConfig); } #region IPlugin Members public void Execute(IPluginExecutionContext context) { if (context.Depth > 1) return; XmlDocument inDoc = new XmlDocument(); inDoc.LoadXml((string)context.InputParameters.Properties["FetchXml"]); string enityName = inDoc.SelectSingleNode("fetch/entity/@name").InnerText; if (enityName == "account") { ICrmService serv = context.CreateCrmService(true); // Create a QueryExpression. QueryExpression qe = new QueryExpression(); qe.EntityName = "role"; qe.ColumnSet = new AllColumns(); // Set up the join between the role entity // and the intersect table systemuserroles. LinkEntity le = new LinkEntity(); le.LinkFromEntityName = "role"; le.LinkFromAttributeName = "roleid"; le.LinkToEntityName = "systemuserroles"; le.LinkToAttributeName = "roleid"; // Set up the join between the intersect table // systemuserroles and the systemuser entity. LinkEntity le2 = new LinkEntity(); le2.LinkFromEntityName = "systemuserroles"; le2.LinkFromAttributeName = "systemuserid"; le2.LinkToEntityName = "systemuser"; le2.LinkToAttributeName = "systemuserid"; // The condition is to find the user ID. //Microsoft.Crm.Sdk.Query.c ConditionExpression ce = new ConditionExpression(); ce.AttributeName = "systemuserid"; ce.Operator = ConditionOperator.Equal; ce.Values = new object[] { context.UserId }; FilterExpression fe = new FilterExpression(); fe.AddCondition(ce); le2.LinkCriteria = fe; le.LinkEntities.Add(le2); qe.LinkEntities.Add(le); // Execute the query. BusinessEntityCollection bec = serv.RetrieveMultiple(qe); string rolename = configDoc.SelectSingleNode("PluginConfig/Entity/Filter/condition/@securityrole").InnerText;//"Системный администратор"; bool roleFound = false; if (bec.BusinessEntities.Count > 0) { for (int i = 0; i < bec.BusinessEntities.Count; i++) { if (rolename == ((role)bec.BusinessEntities[i]).name) roleFound = true; } } if (!roleFound) { XmlElement conditionElem; XmlAttribute conditionAttr; conditionElem = inDoc.CreateElement("condition"); conditionAttr = inDoc.CreateAttribute("attribute"); conditionAttr.InnerText = configDoc.SelectSingleNode("PluginConfig/Entity/Filter/condition/@attribute").InnerText;//"customertypecode"; conditionElem.Attributes.Append(conditionAttr); conditionAttr = inDoc.CreateAttribute("operator"); conditionAttr.InnerText = configDoc.SelectSingleNode("PluginConfig/Entity/Filter/condition/@operator").InnerText;//"ne"; conditionElem.Attributes.Append(conditionAttr); conditionAttr = inDoc.CreateAttribute("value"); conditionAttr.InnerText = configDoc.SelectSingleNode("PluginConfig/Entity/Filter/condition/@value").InnerText;//"3"; conditionElem.Attributes.Append(conditionAttr); inDoc.SelectSingleNode("fetch/entity/filter").AppendChild(conditionElem); context.InputParameters.Properties["FetchXml"] = inDoc.OuterXml; } } } #endregion |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|