Я преследовал это со вчерашнего дня, и ничего не имеет смысла.Я рассмотрел различные варианты того, как может выглядеть код - изменил функцию типа 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;
}
}
}
Любой вклад приветствуется.