09.12.2013, 14:54 | #1 |
Участник
|
Вопрос по EntityCollection
В продолжении предыдущей темы
хотелось бы у вас коллеги проконсультироваться вот по какому вопросу: в своем коде : Код: Entity phonecall = service.Retrieve("phonecall", entity.Id, new ColumnSet(true)); if (phonecall.Attributes.Contains("regardingobjectid")) { EntityReference regarding = (EntityReference)phonecall.Attributes["regardingobjectid"]; if (regarding.LogicalName == "lead") { Entity lead = service.Retrieve("lead", regarding.Id, new ColumnSet(true)); EntityReference companyname = (EntityReference)lead.Attributes["new_companyname"]; Entity account = service.Retrieve("account", companyname.Id, new ColumnSet(true)); string name = account.Attributes["name"].ToString(); phonecall.Attributes.Add("new_nameofaccount", name); service.Update(phonecall); return; } if (regarding.LogicalName == "account") { Entity account = service.Retrieve("account", regarding.Id, new ColumnSet(true)); string name = account.Attributes["name"].ToString(); phonecall.Attributes.Add("new_nameofaccount", name); service.Update(phonecall); return; } if (regarding.LogicalName == "campaignactivity") { if (entity.Attributes.Contains("to")) { foreach (Entity acc in ((EntityCollection)entity.Attributes["to"]).Entities) { string name = service.Retrieve("account", acc.Id, new ColumnSet(true)).ToString(); phonecall.Attributes.Add("new_nameofaccount", name); service.Update(phonecall); } return; } } Все таки каким способом необходимо получить значение сущности из этого поля? За ранее известно что там (Всегда!!!) будет одна сущность. За ранее спасибо!!! |
|
09.12.2013, 15:32 | #2 |
Участник
|
to это массив ActivityParty
Попробуйте преобразовать к нему. Небольшой пример заполнения поля to http://mubashersharif.blogspot.ru/20...-crm-2011.html Последний раз редактировалось g.Naukovych; 09.12.2013 в 15:34. |
|
09.12.2013, 20:17 | #3 |
Участник
|
а кроме как через ActivityParty - не возможно другим способом получить сущность из поля?
из примера понятно как это поле заполнить, а вот как его разобрать и получить искомую сущность? Вот тут то и самая интересная задача. |
|
09.12.2013, 20:39 | #4 |
Чайный пьяница
|
Можете через фетч достать. Буквально вчера упражнялся с сервисными активностями и получением значения из поля Customers:
Код: string fetchXml = string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'> <entity name='account'> <attribute name='accountid' /> <attribute name='address1_latitude' /> <attribute name='address1_longitude' /> <link-entity name='activityparty' from='partyid' to='accountid'> <filter type='and'> <condition attribute='activityid' operator='eq' value='{0}' /> </filter> </link-entity> </entity> </fetch>", serviceAppointmentId); Entity account = localContext.OrganizationService.RetrieveMultiple(new FetchExpression(fetchXml)).Entities.FirstOrDefault();
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
09.12.2013, 21:52 | #5 |
Участник
|
Я правильно понимаю, что для моего случая Фетч - будет немного иной?
Entity result = service.RetrieveMultiple(new FetchExpression(fetchXml)).Entities.FirstOrDefault(); пробую вот таким образом получать сущность, и все равно пусто |
|
09.12.2013, 21:59 | #6 |
Чайный пьяница
|
А вы код свой покажите. Я ж не экстрасенс
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
09.12.2013, 22:05 | #7 |
Участник
|
я только только его пишу добавлю проверки заполнености полей
а сам код вот: X++: using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Sdk.Client; namespace Microsoft.Crm.Sdk.Samples { public class updatePhonecall : IPlugin { public void Execute(IServiceProvider serviceProvider) { //Extract the tracing service for use in debugging sandboxed plug-ins. ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); // Obtain the execution context from the service provider. IPluginExecutionContext context = (IPluginExecutionContext) serviceProvider.GetService(typeof(IPluginExecutionContext)); // The InputParameters collection contains all the data passed in the message request. if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) { // Obtain the target entity from the input parameters. Entity entity = (Entity)context.InputParameters["Target"]; // Verify that the target entity represents an account. // If not, this plug-in was not registered correctly. if (entity.LogicalName != "phonecall") { return; } // Obtain the organization service reference. IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); if (context.Depth == 1) { Entity phonecall = service.Retrieve("phonecall", entity.Id, new ColumnSet(true)); if (phonecall.Attributes.Contains("regardingobjectid")) { EntityReference regarding = (EntityReference)phonecall.Attributes["regardingobjectid"]; if (regarding.LogicalName == "lead") { Entity lead = service.Retrieve("lead", regarding.Id, new ColumnSet(true)); EntityReference companyname = (EntityReference)lead.Attributes["new_companyname"]; Entity account = service.Retrieve("account", companyname.Id, new ColumnSet(true)); string name = account.Attributes["name"].ToString(); phonecall.Attributes.Add("new_nameofaccount", name); service.Update(phonecall); return; } if (regarding.LogicalName == "account") { Entity account = service.Retrieve("account", regarding.Id, new ColumnSet(true)); string name = account.Attributes["name"].ToString(); phonecall.Attributes.Add("new_nameofaccount", name); service.Update(phonecall); return; } if (regarding.LogicalName == "campaignactivity") { string fetchXml = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'> <entity name='account'> <attribute name='name' /> <attribute name='new_footnote' /> <attribute name='new_typeofownership' /> <attribute name='address1_city' /> <attribute name='new_inn' /> <attribute name='ownerid' /> <attribute name='emailaddress1' /> <attribute name='telephone1' /> <attribute name='address1_stateorprovince' /> <attribute name='accountid' /> <order attribute='name' descending='false' /> <filter type='and'> <condition attribute='statuscode' operator='eq' value='1' /> </filter> <link-entity name='activityparty' from='activityid' to='activityid' alias='aa'> </link-entity> </entity> </fetch>"; Entity result = service.RetrieveMultiple(new FetchExpression(fetchXml)).Entities.FirstOrDefault(); Entity account = service.Retrieve("account", result.Id, new ColumnSet(true)); string name = account.Attributes["name"].ToString(); phonecall.Attributes.Add("new_nameofaccount", name); service.Update(phonecall); } } } } } } } Понимаю что нужны проверки и исключения ... в последствии добавлю, чтоб плагин отрабатывал без ошибок с первого раза. P.S. я его подключаю на два сообщения: Create и Update. на pre событие Последний раз редактировалось Space-06; 09.12.2013 в 22:07. |
|
09.12.2013, 23:56 | #8 |
Чайный пьяница
|
1. Не понимаю зачем вы вызываете Update. Если использовать Pre-Execution плагин и значение укладывать в нужное поле, то апдейт будет происходить.
2. Хотите получить значение из to, то пожалуйста, посмотрите следующий код: Код: EntityCollection tocollection = activity.GetAttributeValue<EntityCollection>("to"); Entity to = collection[0]; EntityReference torecord = to.GetAttributeValue<EntityReference>("partyid");
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
10.12.2013, 00:37 | #9 |
Участник
|
Последний Код как нельзя лучше подошел
Спасибо огромное за подсказку |
|