Плагин CRM: как обновить адреса связанных контактов при обновлении адреса аккаунта - PullRequest
0 голосов
/ 30 мая 2018

Я использую Microsoft Dynamics CRM 2016 локальную версию.

У меня есть "account" entity, который связал "contacts". Когда обновляется текущий "account" entity's "address", я хочу, чтобы все связанные адреса контактов былиобновиться с этим адресом.

Я хочу сделать это в плагине, который запускается на сущности "account" при обновлении адреса.Когда вы это сделаете, ВСЕ связанные контакты обновят свой адрес по этому адресу.

Я немного искал это, но там нет ничего, что указывало бы на то, что АДРЕС обновляется.Примеры, как правило, показывают, например, обновляемый номер телефона.Что делает адрес более сложным, так это то, что адреса хранятся в объекте адреса, поэтому я думаю, что мне нужно получить addressId primary key некоторого вида и поместить его в каждый из associated contacts address FK field., я не знаю, как и как это сделать 'Не найти подобных примеров.

Есть ли у кого-нибудь фрагмент кода, который войдет в плагин?

[NB Я планирую поместить его в public void Execute(IServiceProvider serviceProvider) метод в коде плагина.]

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Благодаря превосходному ответу Henk Van Boeijen выше, я публикую следующий код (который является кодом Henk, опубликованным в моем плагине).

Вот код для плагина, который будет обновлять все адреса для всех контактов, подключенных к организации, при обновлении адреса организации.

Обратите внимание, что в этом примереСубъект организации был назван Учетная запись.

Это для того, чтобы помочь любому в будущем, кому необходимо это сделать.

public class UpdateContactAddresses : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        // Create a tracing instance to log progress of this plugin.
        ITracingService tracing = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

        try
        {
            // Obtain the execution context from the service provider.
            IPluginExecutionContext pluginExecutionContext = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

            // Obtain the organization service reference.
            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = factory.CreateOrganizationService(null);

            if (pluginExecutionContext.InputParameters.Contains("Target") && pluginExecutionContext.InputParameters["Target"] is Entity)
            {
                // Obtain the target entity from the input parameters.
                Entity account = (pluginExecutionContext.InputParameters["Target"] as Entity);

                // Verify that the target entity represents an account. If not, this plug-in was not registered correctly.
                if (account.LogicalName != "account")
                {
                    tracing.Trace("This entity is not an Account entity. It is likely that this plug-in was not registered correctly (was an incorrect \"Primary Entity\" selected? It should be an Account entity).");
                    return;
                }

                var query = new QueryExpression("contact");
                query.Criteria.AddCondition("accountid", ConditionOperator.Equal, pluginExecutionContext.PrimaryEntityId);

                var result = service.RetrieveMultiple(query);
                tracing.Trace("The QueryExpression found " + result.TotalRecordCount.ToString() + " associated contacts.");

                foreach (Entity contact in result.Entities)
                {
                    tracing.Trace("Updating contact " + contact.ToString() + " address...");
                    contact["address1_line1"] = account.GetAttributeValue<string>("address1_line1");
                    contact["address1_line2"] = account.GetAttributeValue<string>("address1_line2");
                    contact["address1_line3"] = account.GetAttributeValue<string>("address1_line3");
                    contact["address1_city"] = account.GetAttributeValue<string>("address1_city");
                    contact["address1_county"] = account.GetAttributeValue<string>("address1_county");
                    contact["address1_postalcode"] = account.GetAttributeValue<string>("address1_postalcode");
                    contact["address1_country"] = account.GetAttributeValue<string>("address1_country");
                    service.Update(contact);
                    tracing.Trace("Contact " + contact.ToString() + " address updated.");
                }
            }

            tracing.Trace("Completed execution of plugin " + this.GetType().Name + ".");
        }
        catch (FaultException<OrganizationServiceFault> ex)
        {
            throw new InvalidPluginExecutionException("An error occurred in plugin " + this.GetType().Name + ".", ex);
        }
        catch (Exception ex)
        {
            tracing.Trace("An error occurred executing plugin " + this.GetType().Name + ".");
            tracing.Trace("\t\tError: " + ex.Message);
            throw ex;
        }

    }

}
0 голосов
/ 30 мая 2018

Вам не нужен идентификатор адреса контакта при его обновлении.Два типа адресов уже включены в контактную сущность.Они обычно используются для почтовых и визитных адресов.Имена полей адреса имеют префикс address1_ и address2_.Итак, просто установите следующие поля в контактной сущности следующим образом:

contact["address1_line1"] = "John Doe";

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

public class AccountPlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        var factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        var orgService = factory.CreateOrganizationService(null);
        var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
        Entity account = context.PostEntityImages.First().Value;

        var query = new QueryExpression("contact");
        query.Criteria.AddCondition("accountid", ConditionOperator.Equal, context.PrimaryEntityId);

        var result = orgService.RetrieveMultiple(query);

        foreach (Entity contact in result.Entities)
        {
            contact["address1_line1"] = account.GetAttributeValue<string>("address1_line2");
            orgService.Update(contact);
        }
    }
}

Зарегистрируйте его в сообщении пост-обновления в учетной записи сущности и добавьтепост сущности изображения на шаг.

...