Разработка
20
Июл
0

InitializeFrom

В CRM есть такая функциональность как маппинг – это когда Вы создаете какую-либо запись из связанного (1:N) Представления родительской записи. При этом из родительской записи в дочернюю копируются значения определенных полей (заданных в настройках связи).

Одним из побочных эффектов этого функционала является возможность создавать клоны записей. Для этого достаточно настроить связь объекта на самого себя, задать маппинг всех нужных полей и создать запись через связанное представление. При этом в JS функция копирования записи реализовывалась с помощью не поддерживаемого функционала.

Но SDK предоставляет возможность воспользоваться данным функционалом и поддерживаемым способом – для этого необходимо воспользоваться методом InitializeFromRequest.

using System;
using System.Collections.Generic;

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Crm.Sdk.Messages;

using System.ServiceModel;
using System.ServiceModel.Description;
using System.Runtime.Serialization;

namespace InitializeFromRequestTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // Подключаемся к CRM
            ClientCredentials credentials = new ClientCredentials();
            credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2012");
            Uri uri = new Uri("http://crm2015/superfirma/XRMServices/2011/Organization.svc");
            OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null);
            proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            IOrganizationService service = (IOrganizationService)proxy;

            // Создаем запрос
            InitializeFromRequest initialize = new InitializeFromRequest();
            initialize.TargetEntityName = "contact"; // Создаваемый объект
            initialize.EntityMoniker = new EntityReference("account", new Guid("33A38732-26F4-E411-80B7-000C291AFB9D")); // Родительская запись из которой создаем дочернюю запись
            initialize.TargetFieldType = TargetFieldType.All; // Поля инициализируемые с родительской записи
            
            InitializeFromResponse initialized = (InitializeFromResponse) service.Execute(initialize);

            if (initialized.Entity != null)
            {
                // Получаем объект из запроса
                Entity entity = initialized.Entity;

                // Задаем необходимые поля
                entity.Attributes.Add("firstname", "John");
                entity.Attributes.Add("lastname", "Smith");

                // Создаем запись
                service.Create(entity);
            }
        }
    }
}

InitializeFromRequest не создает запись, но возвращает целевой объект с маппингом всех настроенных полей. Данный объект Вы можете изменить/дополнить своими полями (или нет) и создать из него запись в CRM.


Комментарии (0)

*

code