将值设置为字段
本文关键字:字段 设置 | 更新日期: 2023-09-27 18:17:45
我创建了一个插件,计算与另一个实体相关的实体的记录数量,如果有多个记录,我检索最后一个记录。如果该记录是非活动的,并且特定字段的值>0,那么我将该字段的值添加到新创建的值中…但是不能让它工作…
任何帮助都太好了!
编辑:该插件注册到" new_ligncontract ",其中包含属性"new_unitesutilisees"answers"new_unitesrestantes"
编辑2:
好了,解决了!我所需要的只是简单地为查找字段获取一个EntityReference并重新排列我的代码…
谢谢你的帮助!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System.Web;
using System.Collections;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Messages;
namespace ClassLibrary1
{
public class StatusContrat : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
// Instanciation des services
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = factory.CreateOrganizationService(null);
Entity statusEntité = (Entity)context.InputParameters["Target"];
// Récupération des lignes de contrat liées au contrat courant
FetchExpression fetch = new FetchExpression("<fetch distinct='false' mapping='logical'>" +
"<entity name='new_contrats'>" +
"<link-entity name='new_lignecontrat' alias='nombreligne' from='new_contratsid' to='new_contratsid'>" +
"</link-entity>" +
"</entity>" +
"</fetch>");
EntityCollection lines = service.RetrieveMultiple(fetch);
// Vérification qu'il y a au moins une ligne de contrat associée
if (lines.Entities.Count > 0)
{
if (lines.Entities.Last().GetAttributeValue<OptionSetValue>("statecode").Value == 1)
{
if (lines.Entities.Last().GetAttributeValue<float>("new_unitesrestantes")<0)
{
var unitesRestantes = (statusEntité.GetAttributeValue<float>("new_unitesrestantes")) + (lines.Entities.Last().GetAttributeValue<float>("new_unitesrestantes"));
var unitesUtilisee = (statusEntité.GetAttributeValue<float>("new_unitesutilisees")) - (lines.Entities.Last().GetAttributeValue<float>("new_unitesutilisees"));
statusEntité ["new_unitesutilisees"] = unitesUtilisee;
statusEntité ["new_unitesrestantes"] = unitesRestantes;
service.Update(statusEntité);
}
}
}
else
{
statusEntité["new_unitesutilisees"] = "0";
statusEntité["new_unitesrestantes"] = statusEntité["new_unitestotales"];
service.Update(statusEntité);
}
}
}
}
几点思考:
Q:你确定你的插件正在执行吗?
为了检查这一点,你可以修改代码,在某处抛出InvalidPluginExecutionException,这样你至少知道它在执行。
Q:你的插件注册正确吗?
检查您的插件是否在创建消息中注册,并在预验证或预操作步骤中注册。
Q:你的插件是沿着你期望的路径执行的吗?
我建议您在服务器上执行一些调试(假设您在本地进行开发)
我刚刚意识到您正在尝试使用服务调用更新您的目标实体。当一个插件需要更新该插件的主实体上的字段时,它只需要在预验证或预操作阶段修改目标上的属性。
Entity target = (Entity)context.InputParameters["Target"];
// Récupération des lignes de contrat liées au contrat courant
FetchExpression fetch = new FetchExpression(@"
<fetch distinct='false' mapping='logical'>
<entity name='new_contrats'>
<link-entity name='new_lignecontrat' alias='nombreligne' from='new_contratsid' to='new_contratsid'>
</link-entity>
</entity>
</fetch>");
// Note: Do you need some attribute fields so that the entities are actually returning some relevant data
// Note: Do you want to retrieve ALL the 'new_contrats' or should you be adding a condition in here to the primary entity?
// <filter type='and'>
// <condition attribute='MyIdFieldHere' operator='eq' value='" + context.PrimaryEntityId + "' />
// </filter>
EntityCollection lines = service.RetrieveMultiple(fetch);
// Vérification qu'il y a au moins une ligne de contrat associée
if (lines.Entities.Any())
{
// store last entity in variable so that the collection is enumerabled 4 seperate times
var last = lines.Entities.Last();
if (last.GetAttributeValue<OptionSetValue>("statecode").Value == 1)
{
if (last.GetAttributeValue<float>("new_unitesrestantes") < 0)
{
var unitesRestantes = (target.GetAttributeValue<float>("new_unitesrestantes")) + (last.GetAttributeValue<float>("new_unitesrestantes"));
var unitesUtilisee = (target.GetAttributeValue<float>("new_unitesutilisees")) - (last.GetAttributeValue<float>("new_unitesutilisees"));
target["new_unitesutilisees"] = unitesUtilisee;
target["new_unitesrestantes"] = unitesRestantes;
}
}
}
else
{
// if 'new_unitesutilisees' is a float, then the value must also be a float
target["new_unitesutilisees"] = 0f;
target["new_unitesrestantes"] = target["new_unitestotales"];
}
编辑2:
另外,我假设有一个更好的获取查询运行,而不是检索所有实体,然后只使用最后一个。您能否通过调整查询以设置相反的顺序并仅检索第一个项目来缩小检索列表?根据系统中有多少实体,这个小小的优化将大大减少这个插件的执行时间。
如果这是您正在使用的代码,这可能是因为您的FetchXML
没有检索任何属性,特别是属性new_unitesrestantes
和new_unitesutilisees
,因此RetrieveMultiple
请求检索的任何实体都不会具有这些属性的值。
<fetch distinct='false' mapping='logical'>
<entity name='new_contrats'>
<!-- no attributes listed here -->
<link-entity name='new_lignecontrat' alias='nombreligne' from='new_contratsid' to='new_contratsid'>
<!-- no attributes listed here either -->
</link-entity>
</entity>
</fetch>