В разделе Создать сущность установите значение свойства из внешнего источника, чтобы оно сохранялось - PullRequest
0 голосов
/ 03 сентября 2018

Используя Dynamics 365, я делаю много прыжков, чтобы получить то, что мне нужно.

В основном для создания контакта у меня есть плагин, который десериализует объект Entity в XML и затем отправляет этот XML в webhook. Webhook делает некоторые вещи с другой системой и возвращает идентификатор. Этот идентификатор затем возвращается плагину.

Я установил атрибут, который я хочу установить в плагине, таким образом:

 var response = webClient.UploadString(serviceUrl, serializedStr);
                            postMessageImage["po_ContactCRPID"] = response.ToString();

Никаких ошибок не происходит, контакт создается, но в поле, которое меня интересует, не отображается значение в CRM.

Я не могу использовать обычную функцию webhook в D365 при пост-создании, потому что публикуемый JSON не позволяет вам сериализовать обратно к объекту, чтобы затем иметь возможность красиво извлекать значения и затем вставлять их в другие системы в серверной части. поэтому я стараюсь использовать как можно больше строго типизированных классов.

Есть идеи, как этого добиться? В конвейере после операции я хочу иметь возможность установить свойство для объекта контакта (который имеет настраиваемые поля) на основе значения, возвращаемого некоторым веб-сервисом, чтобы CRM мог создать контакт с установленным мною значением.

Это код моего плагина:

 if (context.PostEntityImages.Contains("CreateContactImage") && context.PostEntityImages["CreateContactImage"] is Entity)
                {
                    tracingService.Trace("AccountSync: CreateContactImage.");

                    Entity postMessageImage = (Entity)context.PostEntityImages["CreateContactImage"];
 using (var client = new WebClient())
                    {
                        var webClient = new WebClient();
                        webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";

                        var code = "CodeFromPlugin";
                        var serviceUrl = this.CRPSyncServiceUrl + "?code=" + code;

                        var entitySeri = new EntitySerializer();
                        var serializedStr = entitySeri.SerializeObject(postMessageImage);
try
                        {
                            // upload the data using Post mehtod
                             //var response = webClient.UploadData(serviceUrl, entityBytes);
                            var response = webClient.UploadString(serviceUrl, serializedStr);
                            postMessageImage["po_ContactCRPID"] = response.ToString();
                            postMessageImage.Attributes["po_ContactCRPID"] = response.ToString();
                            tracingService.Trace("Set postMessageImage po_ContactCRPID to: {0}", response.ToString());
                        }
                        catch (Exception ex)
                        {
                            tracingService.Trace("WebEX Error: {0}", ex.ToString());
                            throw;
                        }
                    }

                }

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

image не является target операции create.

image просто дает вам только для чтения снимок значений записи до или после определенного события.

target проходит через конвейер событий. target представляет редактируемый объект, который сохраняется в базе данных.

Например; если вы рассматриваете CreateRequest, у него есть свойство target. Этот запрос в основном происходит, когда пользователь сохраняет запись.

Entity contact = new Entity("contact");
contact["firstname"] = "James";

CreateRequest cr = new CreateRequest
{
    Target = contact
};

Вы можете получить доступ к этому target в вашем плагине следующим образом:

Entity target = (Entity)context.InputParameters["Target"];
target.GetAttributeValue<string>("firstname"); //James

Вы можете установить значения на target следующим образом:

target["lastname"] = "Wood";

«Дерево» будет передаваться по конвейеру событий в базу данных, , если ваш плагин зарегистрирован для синхронного и пред-события. В противном случае (например, пост-событие, асинхронное), когда вы устанавливаете target, это слишком поздно - данные уже сохранены в базе данных.

Если вы можете выполнить эти условия, переключитесь на target. В противном случае вам нужно будет выдать отдельную UpdateRequest.

Entity update = new Entity("contact");
update.Id = target.Id;
update["lastname"] = "Wood";

Service.Update(update);
0 голосов
/ 04 сентября 2018

В плагине асинхронного пост-создания у вас будет объект EntityId в только что созданном контакте.

Получите идентификатор из ответа webhook, затем создайте новый объект Contact, установите атрибут и service.Update сохранит его.

Entity contact = new Entity(“contact”);
contact.Id = target.Id;
contact[“webhook_Idfield”] = ID;
service.Update(contact);
...