Общий вопрос: как мне получить доступ к переменным сущности, которых нет в моей коллекции (не обновлялись) в подключаемом модуле для D365 CRM?
Я долго боролся с этим, и теперь я обращаюсь к вам, боги форума, за помощью в понимании того, что здесь происходит.
У меня есть настройки объекта "Заказ на работу" в D365 CRM (v9.0). По сути, всякий раз, когда обновляется одно из трех полей, мне нужно каждый раз выполнять одну и ту же логику. По какой-то причине плагин будет работать ТОЛЬКО при обновлении всех трех полей за одну операцию. Если я просто обновлю один, я получу ошибку «ключ отсутствует в словаре», означающий, что моей переменной нет в текущей коллекции.
Я попытался изменить мою проверку "содержит", чтобы она содержала XYZ || содержит ABC || содержит 123, но это сразу же не удается. Затем я попытался вложить каждое из этих условий друг в друга, но, конечно же, самые нижние гнезда не затрагиваются. Затем я попытался разложить и просто попробовать каждую из проверок «содержит» по отдельности, а затем выполнить логику во всех трех блоках if. Все это до сих пор меня не подводило.
Что-то мне здесь не хватает? В целях тестирования я настроил его на запуск по всем атрибутам (а не только по трем, которые я хочу проверить), но даже это для меня не работает. Я также поговорил с коллегой, у которого гораздо больше опыта, чем у меня, в области разработки CRM, и вы можете увидеть некоторые артефакты в вызовах функции "FieldValue" (хотя я исключил FieldValue функция из этого фрагмента кода).
Я новичок в разработке CRM, но работаю в MSCRM с 4.0.
Любые советы приветствуются.
Общий вопрос: как мне получить доступ к переменным объекта, которых нет в моей коллекции (не обновлялись) в плагине для D365 CRM?
Код ниже, в котором удалены ссылки на имена моих клиентов:
using System;
using System.Linq;
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.Data.SqlClient;
using System.Threading.Tasks;
namespace ClientNTE
{
public class NTEExceedance : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = factory.CreateOrganizationService(context.UserId);
//Extract the tracing service for use in debugging sandboxed plug-ins.
ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
Money subtotal = null;
Money nte = null;
Decimal nte_percent = 0;
Decimal subtotalDecimal = 0;
Decimal nteDecimal = 0;
Decimal amountDiffDecimal = 0;
Decimal percentDifference = 0;
try
{
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
Entity entity = (Entity)context.InputParameters["Target"];
if (entity.LogicalName == "msdyn_workorder")
{
//code fires onChange of NTE Amount (same logic will apply to NTE % and Est Subtotal Amount)
if (entity.Attributes.Contains("CLIENT_nteamount") == true)
{
//trying to use the FieldValue function to grab these fields into collection, commented out for now
//String NewValue = FieldValue(service, new Guid(entity["msdyn_workorderid"].ToString()));
//String NewSubTotal = FieldValue(service, new Guid(entity["msdyn_workorderid"].ToString()), entity["msdyn_estimatesubtotalamount"].ToString());
//String NewNTE = FieldValue(service, new Guid(entity["msdyn_workorderid"].ToString()), entity["CLIENT_nteamount"].ToString());
//String Newpercent = FieldValue(service, new Guid(entity["msdyn_workorderid"].ToString()), entity["CLIENT_ntepercent"].ToString());
subtotal = (Money)entity.Attributes["msdyn_estimatesubtotalamount"];
nte = (Money)entity.Attributes["CLIENT_nteamount"];
nte_percent = (Decimal)entity.Attributes["CLIENT_ntepercent"];
subtotalDecimal = subtotal.Value;
nteDecimal = nte.Value;
amountDiffDecimal = (subtotalDecimal - nteDecimal);
percentDifference = ((amountDiffDecimal / nteDecimal) * 100);
// decimal percentDifference = 100;
//decimal nte_percent = 50;
if (percentDifference > nte_percent)
{
//know this snippet works
entity["CLIENT_nteexceeded"] = true;
}
if (percentDifference <= nte_percent)
{
//know this snippet works
entity["CLIENT_nteexceeded"] = false;
}
}
if (entity.Attributes.Contains("CLIENT_ntepercent") == true)
{
subtotal = (Money)entity.Attributes["msdyn_estimatesubtotalamount"];
nte = (Money)entity.Attributes["CLIENT_nteamount"];
nte_percent = (Decimal)entity.Attributes["CLIENT_ntepercent"];
subtotalDecimal = subtotal.Value;
nteDecimal = nte.Value;
amountDiffDecimal = (subtotalDecimal - nteDecimal);
percentDifference = ((amountDiffDecimal / nteDecimal) * 100);
// decimal percentDifference = 100;
//decimal nte_percent = 50;
if (percentDifference > nte_percent)
{
//know this snippet works
entity["CLIENT_nteexceeded"] = true;
}
if (percentDifference <= nte_percent)
{
//know this snippet works
entity["CLIENT_nteexceeded"] = false;
}
}
if (entity.Attributes.Contains("msdyn_estimatesubtotalamount") == true)
{
subtotal = (Money)entity.Attributes["msdyn_estimatesubtotalamount"];
nte = (Money)entity.Attributes["CLIENT_nteamount"];
nte_percent = (Decimal)entity.Attributes["CLIENT_ntepercent"];
subtotalDecimal = subtotal.Value;
nteDecimal = nte.Value;
amountDiffDecimal = (subtotalDecimal - nteDecimal);
percentDifference = ((amountDiffDecimal / nteDecimal) * 100);
// decimal percentDifference = 100;
//decimal nte_percent = 50;
if (percentDifference > nte_percent)
{
//know this snippet works
entity["CLIENT_nteexceeded"] = true;
}
if (percentDifference <= nte_percent)
{
//know this snippet works
entity["CLIENT_nteexceeded"] = false;
}
/*
Money m = (Money)entity.Attributes["new_evalmoneyvalue"];
decimal actualAmount = m.Value;
entity["new_evaldecimal"] = actualAmount;
entity["new_evalmoneyvalue"] = new Money((decimal)actualAmount * 2);
*/
}
}
}
}
catch (FaultException<OrganizationServiceFault> e)
{
tracingService.Trace("CLIENTPlugin - Update NTEExceededNonCalc: {0}", e.ToString());
throw e;
}
}
}
}