You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改Dynamics 365 CE汇总字段的最小值与最大值(本地部署)

解决Dynamics 365 CE托管汇总字段最小值/最大值修改问题

方案1:直接修改SQL数据库(本地部署专属)

本地部署环境可直接操作底层数据库,操作前务必完整备份数据库:

  • 托管字段的元数据存储在MetadataSchema.Attribute表中
  • 通过字段逻辑名和对应实体ID定位目标记录,执行SQL修改最小值/最大值:
UPDATE MetadataSchema.Attribute
SET MinValue = 0, MaxValue = NULL -- 根据需求调整,NULL表示取消最大值限制
WHERE LogicalName = '你的汇总字段逻辑名'
AND EntityId = (SELECT EntityId FROM MetadataSchema.Entity WHERE LogicalName = '主实体逻辑名')
  • 执行后重启Dynamics 365应用池与异步服务,清除服务器和浏览器缓存,确保元数据生效

方案2:PowerShell调用Organization Service修改元数据

通过官方API修改字段约束,无需直接操作SQL:

  • 编写并执行以下PowerShell脚本(替换占位符为你的环境信息):
Add-Type -Path "C:\Program Files\Microsoft Dynamics 365\WebResources\bin\Microsoft.Xrm.Sdk.dll"
$connectionString = "AuthType=AD;Url=http://你的D365服务器地址/XRMServices/2011/Organization.svc;Domain=域名;Username=用户名;Password=密码"
$service = New-Object Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy($connectionString)

# 获取目标字段元数据
$attributeRequest = New-Object Microsoft.Xrm.Sdk.Messages.RetrieveAttributeRequest
$attributeRequest.EntityLogicalName = "主实体逻辑名"
$attributeRequest.LogicalName = "汇总字段逻辑名"
$attributeRequest.RetrieveAsIfPublished = $true
$attributeResponse = $service.Execute($attributeRequest)
$attribute = $attributeResponse.AttributeMetadata

# 修改最小值和最大值
$attribute.MinValue = 0 # 设置为允许的最小值,如0
$attribute.MaxValue = $null # 取消最大值限制或设置具体数值

# 更新字段元数据
$updateRequest = New-Object Microsoft.Xrm.Sdk.Messages.UpdateAttributeRequest
$updateRequest.Attribute = $attribute
$updateRequest.EntityName = "主实体逻辑名"
$updateRequest.MergeLabels = $true
$service.Execute($updateRequest)
  • 执行后刷新Dynamics 365界面,验证字段约束是否生效

方案3:前置插件绕过约束

若不想改动字段元数据,可编写插件在保存时临时调整值:

  • 创建插件注册在主实体的Create、Update消息前置阶段,代码示例:
using Microsoft.Xrm.Sdk;

public class BypassRollupFieldConstraint : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
        IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity entity)
        {
            string rollupFieldName = "你的汇总字段逻辑名";
            if (entity.Contains(rollupFieldName) && entity.GetAttributeValue<int>(rollupFieldName) == 0)
            {
                // 临时设置为符合原约束的1,保存后可在后置阶段改回0
                entity[rollupFieldName] = 1;
            }
        }
    }
}
  • 将插件部署到本地Dynamics 365环境,确保保存记录时触发

注意事项

  • 所有操作前必须备份数据库,避免数据丢失
  • 修改元数据后需清除缓存,确保界面同步更新
  • 插件方案仅绕过约束,不修改字段本身的元数据设置

内容的提问来源于stack exchange,提问作者Sefid NT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:52:39