Работает над плагином перед операцией для обновления поля «Modified By» в MSCRM - Нужна помощь в исправлении кода - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь обновить поле «Modified By» на основе текстового поля «Prepared By», в котором содержится имя пользователя. Я создал предоперационный плагин, чтобы сделать это, и считаю, что я близок к завершению. Однако поле «Изменено» все еще не обновляется успешно. Я относительно новичок в кодировании и CRM и могу использовать некоторую помощь для изменения кода и выяснения, как я могу заставить это работать.

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Linq;

namespace TimClassLibrary1.Plugins
{
    public class CreateUpdateContact : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            var tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            var factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            var service = factory.CreateOrganizationService(context.UserId);
            tracingService.Trace("Start plugin");

            tracingService.Trace("Validate Target");
            if (!context.InputParameters.Contains("Target") || !(context.InputParameters["Target"] is Entity))
                return;

            tracingService.Trace("Retrieve Target");
            var target = (Entity)context.InputParameters["Target"];

            String message = context.MessageName.ToLower();

            SetCreatedByAndModifiedBy(tracingService, service, target, message);
        }

        private void SetCreatedByAndModifiedBy(ITracingService tracingService, IOrganizationService service, Entity target, string message)
        {
            tracingService.Trace("Start SetPriceList");
            tracingService.Trace("Validate Message is Create or Update");
            if (!message.Equals("create", StringComparison.OrdinalIgnoreCase) && !message.Equals("update", StringComparison.OrdinalIgnoreCase))
                return;

            tracingService.Trace("Retrieve Attributes");
            var createdByReference = target.GetAttributeValue<EntityReference>("new_createdby");
            var modifiedByReference = target.GetAttributeValue<EntityReference>("new_modifiedby");

            tracingService.Trace("Retrieve And Set User for Created By");
            RetrieveAndSetUser(tracingService, service, target, createdByReference, "createdby");

            tracingService.Trace("Retrieve And Set User for Modified By");
            RetrieveAndSetUser(tracingService, service, target, modifiedByReference, "modifiedby");
        }

        private void RetrieveAndSetUser(ITracingService tracingService, IOrganizationService service, Entity target, EntityReference reference, string targetAttribute)
        {
            tracingService.Trace("Validating Reference");
            if (reference == null)
                return;

            tracingService.Trace("Retrieving and Validating User");
            var user = RetrieveUserByName(service, reference.Name, new ColumnSet(false));
            if (user == null)
                return;

            tracingService.Trace("Setting Target Attribute");
            target[targetAttribute] = user.ToEntityReference();
        }

        private Entity RetrieveUserByName(IOrganizationService service, string name, ColumnSet columns)
        {
            var query = new QueryExpression
            {
                EntityName = "systemuser",
                ColumnSet = columns,
                Criteria = new FilterExpression
                {
                    FilterOperator = LogicalOperator.And,
                    Conditions =
                    {
                        new ConditionExpression
                        {
                            AttributeName = "fullname",
                            Operator = ConditionOperator.Equal,
                            Values = { name }
                        }
                    }
                }
            };

            var retrieveResponse = service.RetrieveMultiple(query);
            if (retrieveResponse.Entities.Count == 1)
            {
                return retrieveResponse.Entities.FirstOrDefault();
            }
            else
            {
                return null;
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Я не вижу ничего явно неправильного в вашем обновлении, однако вы делаете сложный и ненужный шаг с помощью метода RetrieveUserByName (). У вас уже есть объекты EntityReference из ваших полей new_createdby и new_modifiedby, вы можете просто назначить их цели:

if (message.Equals("create", StringComparison.OrdinalIgnoreCase))
{
    target["createdby"] = target["new_createdby];
}
else if (message.Equals("update", StringComparison.OrdinalIgnoreCase))
{
    target["modifiedby"] = target["new_modifiedby];
}

Если new_createdby и new_modifiedby не являются ссылками на сущности, то это объясняет, почему ваш существующий код не работает, если они есть, тогда используйте мой подход.

0 голосов
/ 09 июля 2019

Если вы используете метод Retreiveusernyname, используйте код ниже

target[“modifiedby”] = new EntityRefrence(user.logicalname,user.id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...