AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.09.2013, 16:42   #1  
Eugene.Ostroukhov is offline
Eugene.Ostroukhov
Участник
 
149 / 11 (1) +
Регистрация: 22.02.2013
CRM2011: InitializeFrom lead -> contact
Всем привет.

Пытаемся конвертировать lead в contact , через InitializeFromRequest.

InitializeFromRequest req = new InitializeFromRequest();
req.EntityMoniker = new EntityReference();
req.EntityMoniker.Id = leadId;
req.EntityMoniker.LogicalName = "lead";
req.TargetEntityName = "contact";
req.TargetFieldType = TargetFieldType.All;

InitializeFromResponse rps = (InitializeFromResponse)_organizationService.Execute(req);

Entity contact = (Entity)rps.Entity;
guidNewContact = _organizationService.Create(contact);

У интереса (lead) есть 2 завершенных действия (точнее - campaignresponse), ответсвенный за которые - отключенный пользователь (idisabled = true).
При вызове Create в данном коде - выводится invalid user id
При включеннии пользователя (все роли отбирают при выключении пользователя) - user has no roles.
При добавлении какой либо роли (взял почти пустую) - идет перечень привилегий (первая, которая встретилась - чтение действий prvReadActivity),

в 4рке вроде бы работало и так, только действия оставались за интересом (вроде бы, уже точно не помню), т.к. было написано не мало кода по перепривязке действий при слиянии\квалификации и т.д. (в т.ч. с открытием отключенных пользователей и временным добавлением к ним прав) к target entity.

Вобщем, как побороть в 5рке такую штуку ?
Старый 24.09.2013, 09:20   #2  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Чтобы преобразовать интерес в контакт нужно вызвать QualifyLeadRequest. InitializeFromRequest лишь инициализирует дочернюю запись в контексте родительской записи - заполняет некоторые свойства. С действиями, при этом, ничего происходить не должно.

Честно говоря из вашего вопроса непонятно в чем, собственно проблема. Вы хотите выполнить код под выключенным пользователем у которого нет прав? Боюсь что это не работало ни в одной из версий CRM. Если вы что-то назначаете пользователю, у него должны быть не пустые роли, а роли, которые предусматривают как минимум чтение записей нужного типа.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 24.09.2013, 10:16   #3  
Eugene.Ostroukhov is offline
Eugene.Ostroukhov
Участник
 
149 / 11 (1) +
Регистрация: 22.02.2013
нет, запрос выполняется из-под системного администратора.
выключенный пользователь - owner прикрепленного действия к интересу.
Старый 24.09.2013, 10:30   #4  
Eugene.Ostroukhov is offline
Eugene.Ostroukhov
Участник
 
149 / 11 (1) +
Регистрация: 22.02.2013
QualifyLeadRequest request = new QualifyLeadRequest();
request.CreateContact = true;
request.CreateAccount = false;
request.CreateOpportunity = false;

request.LeadId = new EntityReference("lead", leadId);

request.Status = new OptionSetValue(3);

QualifyLeadResponse resp = (QualifyLeadResponse)_organizationService.Execute(request);

SecLib::RetrievePrivilegeForUser failed - no roles are assigned to user. Returned hr = -2147209463, User: ae6fa61a-ebb8-e011-8180-001a6433b300
Старый 24.09.2013, 10:33   #5  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Когда кто-то либо назначает запись, проверка прав выполняется для обоих пользователей:
  1. Тот кто назначает должен иметь доступ на чтение, запись и назначение для записи которую он переназначает (и всех дочерних, которые будут участвовать в каскадном назначении, например, действия)
  2. Тот КОМУ назначают, должен иметь право на чтение ВСЕХ записей, которые ему назначают, как минимум на уровне пользователя.
В конце концов убедитесь что вы можете проделать операцию через интерфейс, а потом реализуйте ее в коде!
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 24.09.2013, 10:51   #6  
Eugene.Ostroukhov is offline
Eugene.Ostroukhov
Участник
 
149 / 11 (1) +
Регистрация: 22.02.2013
т.е. действия теперь каскандно перепривязываются в обоих запросах автоматически?
я не особо понимаю, зачем проверять права пользователя на _действие_, привязанное к интересу.
действие же останется за интересом ....

через стандартный интерфейс не могу кнопочка изменена на кастомный функционал.
Старый 24.09.2013, 12:41   #7  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Действия перевешиваются только при переназначении записи, если так настроены связи между объектами (по умолчанию - да). НО некоторые системные операции могут осуществлять дополнительные проверки. Например, при смене валюты возможной сделки, система проверяет, есть связанные с ней предложения, заказы и счета. Если пользователь, который меняет валюту не имеет доступа на чтение записей одного из этих типов, попытка сменить валюту отвалится с ошибкой доступа.

Что происходит в вашем случае не понятно. Возможно, есть какая-то дополнительная логика на создание контакта?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 24.09.2013, 12:44   #8  
Eugene.Ostroukhov is offline
Eugene.Ostroukhov
Участник
 
149 / 11 (1) +
Регистрация: 22.02.2013
Цитата:
Сообщение от Артем Enot Грунин Посмотреть сообщение
Возможно, есть какая-то дополнительная логика на создание контакта?
мммммм. про плагины я и забыл.
проверю трейсом, спасибо!
Старый 24.09.2013, 15:18   #9  
Eugene.Ostroukhov is offline
Eugene.Ostroukhov
Участник
 
149 / 11 (1) +
Регистрация: 22.02.2013
полностью отключил все плагины, на интересы и ФЛ. т.е. кастомный код тут не причем.
ошибки повторяются - либо не нравится что пользователь выключен, либо не нравится что у него нет ни одной роли, либо если есть роль (полупустая) - нехватка привилегий.
Старый 24.09.2013, 17:22   #10  
Eugene.Ostroukhov is offline
Eugene.Ostroukhov
Участник
 
149 / 11 (1) +
Регистрация: 22.02.2013
удалил все плагины. та же ошибка , в т.ч. встроенной кнопкой квалификации.
Старый 24.09.2013, 18:02   #11  
Eugene.Ostroukhov is offline
Eugene.Ostroukhov
Участник
 
149 / 11 (1) +
Регистрация: 22.02.2013
так, с нуля опишу проблему, а то не уточнил момент:

1. есть интерес, связанный с откликом от кампании через кастомное поле (1:N)
2. у этого интереса есть закрытый отклик от кампании.
3. ответственный за отклик от кампании - выключенный пользователь/без ролей.
4. выполняем QualifyLeadRequest с таргетом - физлицо.
получаем ошибки "нет ролей"/"не хватает привилегий" на ответственного за отклик от кампании пользователя.

из трейса:

at CrmException..ctor(String message, Exception innerException, Int32 errorCode, Boolean isFlowControlException) ilOffset = 0x0
at CrmException..ctor(String message, Exception innerException, Int32 errorCode) ilOffset = 0x0
at RuntimeMethodHandle._InvokeConstructor(IRuntimeMethodInfo method, Object[] args, SignatureStruct& signature, RuntimeType declaringType) ilOffset = 0xFFFFFFFF
at RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) ilOffset = 0xD8
at RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) ilOffset = 0x1E7
at VersionedPluginProxyStepBase.WrapExceptionToThrow(CrmException exception) ilOffset = 0x89
at VersionedPluginProxyStepBase.Execute(PipelineExecutionContext context) ilOffset = 0x65
at Pipeline.Execute(PipelineExecutionContext context) ilOffset = 0x65
at MessageProcessor.Execute(PipelineExecutionContext context) ilOffset = 0x1C5
at InternalMessageDispatcher.Execute(PipelineExecutionContext context) ilOffset = 0xE4
at ExternalMessageDispatcher.ExecuteInternal(IInProcessOrganizationServiceFactory serviceFactory, IPlatformMessageDispatcherFactory dispatcherFactory, String messageName, String requestName, Int32 primaryObjectTypeCode, Int32 secondaryObjectTypeCode, ParameterCollection fields, CorrelationToken correlationToken, CallerOriginToken originToken, UserAuth userAuth, Guid callerId, Guid transactionContextId, Int32 invocationSource, Nullable`1 requestId, Version endpointVersion) ilOffset = 0x156
at OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, UserAuth userAuth, Guid targetUserId, Boolean traceRequest, OrganizationContext context, Boolean returnResponse) ilOffset = 0x145
at OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType) ilOffset = 0x34
at OrganizationSdkServiceInternal.Execute(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType) ilOffset = 0x24
at InprocessServiceProxy.ExecuteCore(OrganizationRequest request) ilOffset = 0x34
at PlatformCommand.XrmExecuteInternal() ilOffset = 0xF6
at QualifyLeadCommand.Execute() ilOffset = 0x6
at LeadRecordPageHandler.Qualify(Object sender, DataEventArgs e) ilOffset = 0x180
at DataEventProcessor.Raise(FormEventId eventId, FormState state, String objectId, Entity entity) ilOffset = 0x44
at AppForm.RaiseDataEvent(FormEventId eventId) ilOffset = 0x5E
at EndUserForm.Initialize(Entity entity) ilOffset = 0x1F
at CustomizableForm.Execute(Entity entity, FormDescriptor fd) ilOffset = 0x62
at LeadRecordPageHandler.ConfigureFormHandler() ilOffset = 0x66
at RecordPageHandler.ConfigureFormWrapper() ilOffset = 0xC
at GenericEventProcessor.RaiseEvent(String eventName) ilOffset = 0x2D
at PageManager.OnPreRender(EventArgs e) ilOffset = 0x53
at Control.PreRenderRecursiveInternal() ilOffset = 0x54
at Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) ilOffset = 0x69E
at Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) ilOffset = 0x3C
at Page.ProcessRequest() ilOffset = 0x14
at Page.ProcessRequest(HttpContext context) ilOffset = 0x31
at finamtest_userdefined_edit_aspx.ProcessRequest(HttpContext context) ilOffset = 0x8 c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\82ce50f4\e77f4ed8\App_Web_z0zmcp2g.1.cs
at CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() ilOffset = 0x11D
at HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) ilOffset = 0x15
at ApplicationStepManager.ResumeSteps(Exception error) ilOffset = 0x10E
at HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) ilOffset = 0x5C
at HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) ilOffset = 0xFC
at ISAPIRuntime.ProcessRequest(IntPtr ecb, Int32 iWRType) ilOffset = 0x45
>Crm Exception: Message: SecLib::RetrievePrivilegeForUser failed - no roles are assigned to user. Returned hr = -2147209463, User: 1b858e94-1e71-e011-9c74-005056ba670c, ErrorCode: -2147209463, InnerException: Microsoft.Crm.CrmSecurityException: SecLib::RetrievePrivilegeForUser failed - no roles are assigned to user. Returned hr = -2147209463, User: 1b858e94-1e71-e011-9c74-005056ba670c
at Microsoft.Crm.BusinessEntities.SecurityLibrary.RetrievePrivilegeForUser(IUser user, Guid privilege, ExecutionContext context)
at Microsoft.Crm.BusinessEntities.SecurityLibrary.TryCheckPrivilege(Guid user, Guid privilege, ExecutionContext context)
at Microsoft.Crm.BusinessEntities.SecurityLibrary.TryCheckPrivilege(SecurityPrincipal principal, Guid privilege, ExecutionContext context)
at Microsoft.Crm.BusinessEntities.SecurityExtension.PreCreateHandlerEntityPrivilegeCheck(Object sender, SecurityTraits traits, SecurityAttributes attributes, ExtensionEventArgs e)
at Microsoft.Crm.BusinessEntities.SecurityExtension.PreCreateHandler(ExtensionEventArgs e, Object sender)
at Microsoft.Crm.BusinessEntities.BusinessProcessObject.PreCreateEventHandler.Invoke(Object sender, ExtensionEventArgs e)
at Microsoft.Crm.BusinessEntities.BusinessProcessObject.Create(IBusinessEntity entity, ExecutionContext context)
at Microsoft.Crm.ObjectModel.ContactService.Create(IBusinessEntity entity, ExecutionContext context)
at Microsoft.Crm.ObjectModel.InitializeAndCreateUtility.InitializeAndCreate(BusinessEntityMoniker srcMoniker, BusinessEntity targetInput, ExecutionContext context)
at Microsoft.Crm.ObjectModel.LeadService.QualifyLead(BusinessEntityMoniker leadId, Boolean createAccount, Boolean createContact, Boolean createOpportunity, BusinessEntityMoniker opportunityCurrencyId, BusinessEntityMoniker opportunityCustomerId, BusinessEntityMoniker sourceCampaignId, Int32 statusCode, ExecutionContext context)

зачем СРМу этот SecurityCheck на связанную запись, по кастомному полю вообще (а не системное campaignresponse.customer) при создании физлица ?
Старый 24.09.2013, 18:04   #12  
spectr is offline
spectr
Участник
Аватар для spectr
MCBMSS
Лучший по профессии 2014
 
287 / 70 (3) ++++
Регистрация: 19.10.2011
Адрес: Киев
попробуйте поменять тип связи на ссылочное и попробовать еще раз
Старый 24.09.2013, 18:11   #13  
Eugene.Ostroukhov is offline
Eugene.Ostroukhov
Участник
 
149 / 11 (1) +
Регистрация: 22.02.2013
пробовал уже в двух вариантов "ссылочных" - обычном и с ограничением на удаление.
одно и то же.
Старый 24.09.2013, 18:16   #14  
-O_o- is offline
-O_o-
Еда - топливо, Одежда - н
Аватар для -O_o-
Лучший по профессии 2015
Лучший по профессии 2014
 
727 / 80 (4) ++++
Регистрация: 11.05.2012
Адрес: Киев
Цитата:
Сообщение от Eugene.Ostroukhov Посмотреть сообщение
так, с нуля опишу проблему, а то не уточнил момент:

1. есть интерес, связанный с откликом от кампании через кастомное поле (1:N)
2. у этого интереса есть закрытый отклик от кампании.
3. ответственный за отклик от кампании - выключенный пользователь/без ролей.
4. выполняем QualifyLeadRequest с таргетом - физлицо.
получаем ошибки "нет ролей"/"не хватает привилегий" на ответственного за отклик от кампании пользователя.


зачем СРМу этот SecurityCheck на связанную запись, по кастомному полю вообще (а не системное campaignresponse.customer) при создании физлица ?
А можно для далеких? Что сделать то нужно? Какой должен быть результат?
Просто я только что попробовал в онлайне все повторить.
1. Создал компанию
2. Создал отклик
3. Назначил юзера с минимум прав. для этого отклика
4. Создал лукап в интересе на отклик. (указал эту запись отклика там)
5. Квалифицировал (все ок)
6. Удалил пользователя, который был ответственным за отклик.
7. Еще раз квалифицировал. Все равно ок.

Последний раз редактировалось -O_o-; 24.09.2013 в 18:33.
Старый 24.09.2013, 18:32   #15  
Eugene.Ostroukhov is offline
Eugene.Ostroukhov
Участник
 
149 / 11 (1) +
Регистрация: 22.02.2013
так, чего то я трейс не тот дал.
завтра на свежую голову еще раз попробую )
Старый 25.09.2013, 16:05   #16  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Евгений, включите пользователя и дайте ему роль администратора. Вы НЕ СМОЖЕТЕ назначить записи пользователю, у которого недостаточно прав никаким образом!!! Не понимаю что вам не ясно?!?!
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 14.10.2013, 14:05   #17  
Ronin2007 is offline
Ronin2007
Участник
 
87 / 12 (1) ++
Регистрация: 14.03.2012
Цитата:
Сообщение от Eugene.Ostroukhov Посмотреть сообщение
так, с нуля опишу проблему, а то не уточнил момент:

1. есть интерес, связанный с откликом от кампании через кастомное поле (1:N)
2. ...
Скажите пожалуйста, каким образом вы связали эти две сущности? Каким образом присваивается значение кастомному полю?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Gareth Tucker: Using a Dialog for Lead Conversion in CRM 2011 Blog bot Dynamics CRM: Blogs 0 03.04.2012 10:11
crminthefield: Microsoft Dynamics CRM 2011 Custom Contact Entry Website using Early-Bound entity Classes. Blog bot Dynamics CRM: Blogs 0 04.06.2011 08:16
Leon's CRM Musings: How to Find the Total Number of Records in an Account, Contact or Lead view Blog bot Dynamics CRM: Blogs 0 01.07.2010 10:05
a33ik: Plugin for copying notes and attachements from lead to contact whis is converted from lead for Microsoft Dynamics CRM 4.0 Blog bot Dynamics CRM: Blogs 0 10.07.2009 17:05
Ronald Lemmen: Convert lead to contact, account and/or opportunity programmatically Blog bot Dynamics CRM: Blogs 0 04.09.2008 00:05

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:23.