【问题标题】:Working on pre-operation plug-in to update "Modified By" field in MSCRM -- Need help fixing code使用预操作插件更新 MSCRM 中的“修改者”字段 -- 需要帮助修复代码
【发布时间】:2019-07-09 00:48:18
【问题描述】:

我正在尝试根据名为“准备者”的文本字段更新“修改者”字段,该字段包含用户名。我已经创建了一个预操作插件来执行此操作,并且相信我即将完成。但是,“修改者”字段仍未成功更新。我对编码和 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;
            }
        }
    }
}

【问题讨论】:

    标签: plugins dynamics-crm crm microsoft-dynamics


    【解决方案1】:

    如果你确实使用了 Retreiveusernyname 方法,那么你必须使用下面的代码

    target[“modifiedby”] = new EntityRefrence(user.logicalname,user.id);
    

    【讨论】:

    • 他似乎已经正确设置了实体引用。
    • 他正在返回实体第一条记录并直接将其转换为 entityref 而不是 entityref 的 crate 对象并传递 guid 和逻辑名称
    • 逻辑上没有区别。
    【解决方案2】:

    我没有看到您的更新有任何明显错误,但是您正在使用 RetrieveUserByName() 方法采取复杂且不必要的步骤。您已经拥有来自 new_createdby 和 new_modifiedby 字段的 EntityReference 对象,您可以简单地将它们分配给目标:

    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 不是实体引用,那么这就解释了为什么您现有的代码不起作用,如果是,那么使用我的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多