|
|
#21 |
|
Участник
|
Господа, вопрос еще актуален - помогите плз - RetrieveMultiple не срабатывает на попытку вернуть список записей. Какой Message срабатывает при отображении View, Отчетов и т.д.?
|
|
|
|
|
#22 |
|
Moderator
|
Ну, отчеты - это вообще отдельная тема. При их запуске отрабатывает только SQL Server. Так что если хотите, чтобы в них работала Ваша система безопасности, то придется править запросы всех необходимых отчетов! Ну, или создавать свои фильтрованные вьюхи...
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. ![]() MS Certified Dirty Magic Professional
|
|
|
|
|
#23 |
|
Чайный пьяница
|
Execute
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
|
| За это сообщение автора поблагодарили: Bakai Madybaev (1). | |
|
|
#24 |
|
Участник
|
Цитата:
Ну, отчеты - это вообще отдельная тема. При их запуске отрабатывает только SQL Server. Так что если хотите, чтобы в них работала Ваша система безопасности, то придется править запросы всех необходимых отчетов!
![]() Цитата:
Ну, или создавать свои фильтрованные вьюхи...
|
|
|
|
|
#25 |
|
Moderator
|
Меня не покидает ощущение, что вы искусственно создали себе работу. Про представления я необдуманно написал, если честно... Дело в том, что теперь есть конструктор отчетов доступный пользователям! И работает он именно с системными представлениями, так что подобные ухищрения уже не помогут. Напомните для чего вы занялись подобными ухищрениями?
p.s. Насколько я понимаю табличные представления заполняются Fetch запросом в методе Execute. Думаю a33ik меня поправит, если я не прав.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. ![]() MS Certified Dirty Magic Professional
|
|
|
|
|
#26 |
|
Чайный пьяница
|
Цитата:
Сообщение от Артем Enot Грунин
p.s. Насколько я понимаю табличные представления заполняются Fetch запросом в методе Execute. Думаю a33ik меня поправит, если я не прав.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
|
|
#27 |
|
Участник
|
Цитата:
Напомните для чего вы занялись подобными ухищрениями?
Цитата:
Хочу определить доступ к записи по определенному атрибуту сущности.
Думаю сделать так: Создать Определенную роль "Роль1". Написать Плагин на Pre Retrieve message, в котором буду по значению атрибута и наличию у пользователя "Роли1" возвращать/не возвращать данные. Поле "тип отношения" определяет, является ли Бизнес-партнер Действующим клиентом или Потенциальным клиентом. Действующие клиенты должны быть доступны для чтения ТОЛЬКО ограниченному списку подразделений. |
|
|
|
|
#28 |
|
Moderator
|
А чем вас Интересы не устраивают? Другой объект, другие права доступа... Так и надо было делать... По мере работы интересы преобразуются в Бизнес-партнеров с сохранением истории и пр. По мне так все просто...
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. ![]() MS Certified Dirty Magic Professional
|
|
|
|
|
#29 |
|
Участник
|
Цитата:
А чем вас Интересы не устраивают? Другой объект, другие права доступа... Так и надо было делать... По мере работы интересы преобразуются в Бизнес-партнеров с сохранением истории и пр. По мне так все просто...
С потенциальным клиентом ведется работа по возможным сделкам, предложениям и т.д. Значит нам нужен Бизнес-партнер (Контакт пока отпадает) - но Бизнес-партнер хранит записи о действующих клиентах, к которым доступ на чтение очень строгий. - а к потенциальным клиентам, с которыми уже начали работу по продажам, нужен более широкий доступ. |
|
|
|
|
#30 |
|
Moderator
|
Я думаю, что вам с заказчиком надо пересмотреть процессы. CRM как концепция - это в том числе единая клиентская база. Исходя из этого утверждения, доступ к этой информации должны иметь все сотрудники допущенные в систему, иначе не избежать дублирования! Потенциальные возможности бывают, в том числе, и с уже существующими клиентами. Суть CRM в том и заключается, чтобы менеджер который выходит на заказчика был в курсе тех операций, которые с ним выполнялись в прошлом. Мне совершенно не ясно, как вы добьетесь этого, не позволяя сотрудникам просматривать список Организаций, Контактов и Интересов.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. ![]() MS Certified Dirty Magic Professional
|
|
|
|
| За это сообщение автора поблагодарили: Bakai Madybaev (1). | |
|
|
#31 |
|
Moderator
|
Типовая ситуация: Подразделение А продало клиенту 1 отличные гайки. Прошло время и подразделение Б выходит на того же клиента и снова начинает продавать ему гайки, так как не знает, что клиент их уже приобрел. Эту ситуацию разрулили: отдел Б связался с А, договорился больше так не делать, после чего сообщил C, что клиент нуждается в болтах. Теперь появился отдел C и зная про А и ссылаясь на Б впарил клиенту болты неподходящего диаметра. Клиент слой как собака, звонит в Б, ругается, а те и сделать ничего не могут - просто не знают кто что продавал! Проходит еще время и ничего об этом не знающий менеджер из А звонит клиенту и говорит: "Я помню, что вам очень понравили наши гайки, не хотите ли еще тонну?" Вопрос: как далеко пойдет менеджер из А, если клиент уже кторый месяц рассверливает гайки, чтобы они подходили к болтам?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. ![]() MS Certified Dirty Magic Professional
|
|
|
|
|
#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 |
|
|
|
|
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|