Dynamics 365 - плагин не обновляет значения - PullRequest
0 голосов
/ 11 сентября 2018

Я преследовал это со вчерашнего дня, и ничего не имеет смысла.Я рассмотрел различные варианты того, как может выглядеть код - изменил функцию типа Decimal на String и возвратил String вместо десятичного числа, использовал десятичное число, жестко кодировал значение в операторе if (не используя переменную),и использование самой переменной, но, кажется, ничего не работает.Если я просто устанавливаю значение поля в начале блока try и не выполняю никакой логики, поля обновляются.Проходя по коду через «Профили плагинов» / «Отладка» в инструменте регистрации плагинов, я вижу, что строки кода для установки значений находятся в нажатом состоянии, и никакие исключения не создаются, но, опять же, значения не обновляются.Я даже пытался добавить service.Update (entity);но это тоже не сработало (и когда я устанавливал значения полей без какой-либо логики, мне не требовался вызов service.Update для сохранения значений).

Поле, в которое я пытаюсь записать вCRM имеет десятичный тип с точностью до 2.Конечно, десятичные типы в C # имеют точность 8 или 10, поэтому я даже пытался обрезать десятичное число, преобразовывать десятичное число в строку и т. Д., Но ничего не работает.

Любые идеи, которые помогут мне понятьчто здесь происходит?

Я опубликовал простейшую версию моего кода прямо здесь - до того, как я перешел и изменил функцию типа Десятичный на строку и т. д.

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using System.Net;
using System.Net.Mail;




namespace ClientNTE
{
    public class UpdateVals : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {

            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));


            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {

                Entity entity = (Entity)context.InputParameters["Target"];

                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
                ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));


                try
                {
                    //Get current record's GUID, which will always be in the attributes collection
                    Guid MainEntityID = new Guid(entity["msdyn_workorderid"].ToString());

                    //Get related entity record's GUID from generic field value grabber function against the main entity

                    Guid RefEntityID = GetGUIDFieldValueFrmID(service, "msdyn_workorder", "msdyn_workorderid", MainEntityID, "msdyn_agreement");

                    //if it has a value, continue

                    if (RefEntityID != Guid.Empty)
                    {
                        Decimal RefEntityFieldValue = GetDecFieldValueFrmID(service, "msdyn_agreement", "msdyn_agreementid", RefEntityID, "client_ntepercent");

                        //if it has a value, continue

                        if (RefEntityFieldValue > -99999999)
                        {
                            entity["client_ntepercent"] = RefEntityFieldValue;
                        }
                    }

                }
                catch (Exception ex)
                {
                    //write errors to the CRM Plugin Trace Log
                    tracingService.Trace("clientNTE - Agreement To Work Order - ", ex.ToString());
                    //Throw error through UI
                    throw new InvalidPluginExecutionException("Error, Please See Plugin Log");
                }
            }
        }

        public Guid GetGUIDFieldValueFrmID(IOrganizationService svc, String EntityNm, String EntityIDField, Guid EntityIDValue, String ReturnFieldNm)
        {
            Guid retval = Guid.Empty;

            try
            {
                OrganizationServiceContext orgContext = new OrganizationServiceContext(svc);

                var ReturnRecords = from a in orgContext.CreateQuery(EntityNm)
                                    where (Guid)a[EntityIDField] == EntityIDValue
                                    select new
                                    {
                                        FieldVal = a[ReturnFieldNm]
                                    };

                if (ReturnRecords != null)
                {
                    foreach (var EvalRec in ReturnRecords)
                    {
                        retval = ((Microsoft.Xrm.Sdk.EntityReference)EvalRec.FieldVal).Id;
                    }
                }
                else
                {
                    retval = Guid.Empty;
                }


            }
            catch (Exception ex)
            {
                retval = Guid.Empty;
                //Throw error through UI
                throw new InvalidPluginExecutionException(ex.ToString());
            }

            return retval;
        }

        public Decimal GetDecFieldValueFrmID(IOrganizationService svc, String EntityNm, String EntityIDField, Guid EntityIDValue, String ReturnFieldNm)
        {
            Decimal retval = -99999999;

            try
            {
                OrganizationServiceContext orgContext = new OrganizationServiceContext(svc);

                var ReturnRecords = from a in orgContext.CreateQuery(EntityNm)
                                    where (Guid)a[EntityIDField] == EntityIDValue
                                    select new
                                    {
                                        FieldVal = a[ReturnFieldNm]
                                    };

                if (ReturnRecords != null)
                {
                    foreach (var EvalRec in ReturnRecords)
                    {
                        retval = Convert.ToDecimal(EvalRec.FieldVal);
                    }
                }
                else
                {
                    retval = -99999999;
                }


            }
            catch (Exception ex)
            {
                retval = -99999999;
                //Throw error through UI
                throw new InvalidPluginExecutionException(ex.ToString());
            }

            return retval;
        }

        //public static Boolean UpdateParentRecord(IOrganizationService svc, Guid ParentRecordID, String FieldValue)
        //{

        //    Boolean retval = false;

        //    try
        //    {
        //        Entity parent_entityrec = new Entity("parent_entity");

        //        parent_entityrec["fieldtoupdate"] = FieldValue;

        //        svc.Update(parent_entityrec);

        //        retval = true;

        //    }

        //    catch (Exception ex)
        //    {
        //        retval = false;
        //    }

        //    return retval;

        //}
    }
}

Теперь вы можете увидеть мой текущий код, где я делаю кучу сумасшедших вещей - во-первых, используя функцию типа String, чтобы вернуть десятичное значение.Во-вторых, вызывая функцию для фактического задания значения, просто чтобы доказать, что с существующей функцией что-то не так (и для упрощения форматирования вниз по строке).Неважно, что я делаю, я не могу заставить эту чертову штуку работать!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using System.Net;
using System.Net.Mail;



namespace CLIENTNTE
{
    public class AgreementToWorkOrder : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {

            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));


            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {

                Entity entity = (Entity)context.InputParameters["Target"];

                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
                ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));


                try
                {
                    //string Num = 12.500000.ToString();
                    //entity["CLIENT_testdecimal"] = Num;
                    //entity["CLIENT_ntepercent"] = Num;

                    //Get current record's GUID, which will always be in the attributes collection
                    Guid MainEntityID = new Guid(entity["msdyn_workorderid"].ToString());

                    //Get related entity record's GUID from generic field value grabber function against the main entity

                    Guid RefEntityID = GetGUIDFieldValueFrmID(service, "msdyn_workorder", "msdyn_workorderid", MainEntityID, "msdyn_agreement");

                    //if it has a value, continue

                    if (RefEntityID != Guid.Empty)
                    {
                        String RefEntityFieldValue = GetDecFieldValueFrmID(service, "msdyn_agreement", "msdyn_agreementid", RefEntityID, "CLIENT_ntepercent");

                        decimal decVal = Convert.ToDecimal(RefEntityFieldValue);
                        //if it has a value, continue
                        if (decVal > -99999999)
                        {
                            // entity["CLIENT_ntepercent"] = RefEntityFieldValue;
                            // entity["CLIENT_ntepercent"] = "12.5";// RefEntityFieldValue;
                            //entity["CLIENT_testdecimal"] = "13.5";// RefEntityFieldValue;
                            setDecimal(RefEntityFieldValue, serviceProvider);
                            //service.Update(entity);
                        } 
                    }

                } 
                catch (Exception ex)
                {
                    //write errors to the CRM Plugin Trace Log
                    tracingService.Trace("CLIENTNTE - Agreement To Work Order - ", ex.ToString());
                    //Throw error through UI
                    throw new InvalidPluginExecutionException("Error, Please See Plugin Log");
                }
            }
        }

        public void setDecimal(String RefEntityFieldValue, IServiceProvider serviceProvider)
        {

            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            //IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            //IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
            //ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            Entity entity = (Entity)context.InputParameters["Target"];
            //Guid MainEntityID = new Guid(entity["msdyn_workorderid"].ToString());
            //Guid RefEntityID = GetGUIDFieldValueFrmID(service, "msdyn_workorder", "msdyn_workorderid", MainEntityID, "msdyn_agreement");

            //String RefEntityFieldValue = GetDecFieldValueFrmID(service, "msdyn_agreement", "msdyn_agreementid", RefEntityID, "CLIENT_ntepercent"); */

            // entity["CLIENT_testdecimal"] = RefEntityFieldValue;
            entity["CLIENT_testdecimal"] = 12;
            entity["CLIENT_ntepercent"] = RefEntityFieldValue;


        }

        public Guid GetGUIDFieldValueFrmID(IOrganizationService svc, String EntityNm, String EntityIDField, Guid EntityIDValue, String ReturnFieldNm)
        {
            Guid retval = Guid.Empty;

            try
            {
                OrganizationServiceContext orgContext = new OrganizationServiceContext(svc);

                var ReturnRecords = from a in orgContext.CreateQuery(EntityNm)
                                    where (Guid)a[EntityIDField] == EntityIDValue
                                    select new
                                    {
                                        FieldVal = a[ReturnFieldNm]
                                    };

                if (ReturnRecords != null)
                {
                    foreach (var EvalRec in ReturnRecords)
                    {
                        retval = ((Microsoft.Xrm.Sdk.EntityReference)EvalRec.FieldVal).Id;
                    }
                }
                else
                {
                    retval = Guid.Empty;
                }


            }
            catch (Exception ex)
            {
                retval = Guid.Empty;

                throw new InvalidPluginExecutionException(ex.ToString());
            }

            return retval;
        }

        public String GetDecFieldValueFrmID(IOrganizationService svc, String EntityNm, String EntityIDField, Guid EntityIDValue, String ReturnFieldNm)
        {
            Decimal retval = -99999999;
            String stringVal = "";

            try
            {
                OrganizationServiceContext orgContext = new OrganizationServiceContext(svc);

                var ReturnRecords = from a in orgContext.CreateQuery(EntityNm)
                                    where (Guid)a[EntityIDField] == EntityIDValue
                                    select new
                                    {
                                        FieldVal = a[ReturnFieldNm]
                                    };

                if (ReturnRecords != null)
                {
                    foreach (var EvalRec in ReturnRecords)
                    {
                        retval = Convert.ToDecimal(EvalRec.FieldVal);
                        // stringVal = retval.ToString().TrimEnd('0', '.');
                        stringVal = retval.ToString();
                    }
                }
                else
                {
                    retval = -99999999;
                }


            }
            catch (Exception ex)
            {
                retval = -99999999;
                throw new InvalidPluginExecutionException(ex.ToString());
            }

            return stringVal;
        }
    }
}

Любой вклад приветствуется.

1 Ответ

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

Мой ответ основан на следующих предположениях о вашем коде:

  1. Сценарий использования заключается в том, что при создании записи msdyn_workorder со значением в поле msdyn_agreement значение client_ntepercent для работыв соглашении должно быть установлено значение client_ntepercent.
  2. Плагин зарегистрирован на этапе подготовки к работе для сообщения Create в объекте msdyn_workorder.

Предлагаемое исправление требует следующих изменений:

  1. Код должен получить значение msdyn_agreement от целевого объекта вместо выполнения запроса на получение, так как рабочий заказ не имеетеще не были сохранены в базе данных.

Причиной вашей проблемы может быть то, что вы запрашиваете запись рабочего задания, чтобы получить значение соглашения из подключаемого модуля перед операцией.Заказ на работу еще не будет сохранен в базе данных.

Обновленный код:

public class UpdateVals : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {

        IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity && 
            context.PreEntityImages != null && context.PreEntityImages.Contains("PreImage"))
        {
            Entity target = (Entity)context.InputParameters["Target"];

            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            try
            {
                //Get current record's GUID, which will always be in the attributes collection
                Guid MainEntityID = target.GetAttributeValue<Guid>("msdyn_workorderid");

                EntityReference RefEntityID = null;
                if (target.Attributes.Contains("msdyn_agreement"))
                {
                    RefEntityID = target.GetAttributeValue<EntityReference>("msdyn_agreement");
                }

                //if it has a value, continue
                if (RefEntityID != null)
                {
                    Decimal RefEntityFieldValue = GetDecFieldValueFrmID(service, "msdyn_agreement", "msdyn_agreementid", RefEntityID.Id, "client_ntepercent");

                    //if it has a value, continue
                    if (RefEntityFieldValue > -99999999)
                    {
                        target["client_ntepercent"] = RefEntityFieldValue;
                    }
                }

            }
            catch (Exception ex)
            {
                //write errors to the CRM Plugin Trace Log
                tracingService.Trace("clientNTE - Agreement To Work Order - ", ex.ToString());
                //Throw error through UI
                throw new InvalidPluginExecutionException("Error, Please See Plugin Log");
            }
        }
    }

    public Decimal GetDecFieldValueFrmID(IOrganizationService svc, String EntityNm, String EntityIDField, Guid EntityIDValue, String ReturnFieldNm)
    {
        Decimal retval = -99999999;

        try
        {
            OrganizationServiceContext orgContext = new OrganizationServiceContext(svc);

            var ReturnRecords = from a in orgContext.CreateQuery(EntityNm)
                                where (Guid)a[EntityIDField] == EntityIDValue
                                select new
                                {
                                    FieldVal = a[ReturnFieldNm]
                                };

            if (ReturnRecords != null)
            {
                foreach (var EvalRec in ReturnRecords)
                {
                    retval = Convert.ToDecimal(EvalRec.FieldVal);
                }
            }
            else
            {
                retval = -99999999;
            }
        }
        catch (Exception ex)
        {
            retval = -99999999;
            //Throw error through UI
            throw new InvalidPluginExecutionException(ex.ToString());
        }

        return retval;
    }
}
...