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

PowerApps C#插件开发:检查Dataverse表expired列是否更新

PowerApps Dataverse C#插件:检查Expired列变更并联动更新其他表

以下是实现需求的初始代码框架,你可以根据实际表名、列名调整:

核心代码实现

using Microsoft.Xrm.Sdk;
using System;

public class ExpiredColumnHandler : 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);
        ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

        try
        {
            // 仅处理目标实体的Create和Update消息
            if (!context.MessageName.Equals("Create", StringComparison.OrdinalIgnoreCase) && 
                !context.MessageName.Equals("Update", StringComparison.OrdinalIgnoreCase))
                return;

            // 获取目标实体(替换为你的实际表逻辑名称,比如new_asset)
            Entity targetEntity = (Entity)context.InputParameters["Target"];
            string targetTableLogicalName = "new_yourtargettable";
            if (!targetEntity.LogicalName.Equals(targetTableLogicalName, StringComparison.OrdinalIgnoreCase))
                return;

            bool isExpired = false;
            bool needProcess = false;

            // 处理新增场景:直接检查expired列值
            if (context.MessageName.Equals("Create", StringComparison.OrdinalIgnoreCase))
            {
                if (targetEntity.Contains("new_expired"))
                {
                    isExpired = (bool)targetEntity["new_expired"];
                    needProcess = isExpired;
                }
            }
            // 处理更新场景:检查expired列是否从非过期变为过期
            else if (context.MessageName.Equals("Update", StringComparison.OrdinalIgnoreCase))
            {
                if (targetEntity.Contains("new_expired"))
                {
                    isExpired = (bool)targetEntity["new_expired"];
                    // 结合PreImage对比修改前的值(需在注册插件时配置PreImage并包含new_expired列)
                    if (context.PreEntityImages.Contains("PreImage"))
                    {
                        Entity preImage = context.PreEntityImages["PreImage"];
                        bool oldExpiredValue = preImage.Contains("new_expired") ? (bool)preImage["new_expired"] : false;
                        // 仅当状态从非过期变为过期时触发后续操作
                        needProcess = !oldExpiredValue && isExpired;
                    }
                    else
                    {
                        // 无PreImage时,仅当本次设置为过期时处理
                        needProcess = isExpired;
                    }
                }
            }

            // 执行关联表更新逻辑
            if (needProcess)
            {
                // 示例:更新关联表的指定字段(替换为你的实际表和字段逻辑名称)
                Entity relatedTableEntity = new Entity("new_relatedtable");
                relatedTableEntity.Id = GetRelatedTableId(service, targetEntity.Id, targetTableLogicalName);
                relatedTableEntity["new_isarchived"] = true;

                service.Update(relatedTableEntity);
                tracingService.Trace($"已成功更新关联表记录,目标实体ID: {targetEntity.Id}");
            }
        }
        catch (Exception ex)
        {
            tracingService.Trace($"插件执行异常: {ex.ToString()}");
            throw new InvalidPluginExecutionException("处理Expired列变更时发生错误", ex);
        }
    }

    // 辅助方法:根据目标实体ID获取关联表记录ID(需根据你的关联逻辑调整)
    private Guid GetRelatedTableId(IOrganizationService service, Guid targetEntityId, string targetTableLogicalName)
    {
        // 示例:通过关联查询获取对应记录ID,需替换为你的查询逻辑
        var query = new QueryExpression("new_relatedtable")
        {
            ColumnSet = new ColumnSet("new_relatedtableid"),
            Criteria = new FilterExpression
            {
                Conditions = {
                    new ConditionExpression("new_yourtargettableid", ConditionOperator.Equal, targetEntityId)
                }
            }
        };
        var result = service.RetrieveMultiple(query);
        return result.Entities.Count > 0 ? result.Entities[0].Id : Guid.Empty;
    }
}

关键配置与说明

  • 插件注册要求:
    • 注册到目标表的Create和Update消息
    • 执行阶段选择PostOperation(确保目标实体数据已持久化)
    • 建议添加过滤属性为new_expired,仅当该列变更时触发插件,减少无效执行
    • 更新场景如需对比修改前后值,需配置PreImage并包含new_expired列
  • 占位符替换:将代码中new_yourtargettable、new_expired、new_relatedtable、new_isarchived等替换为你实际的表和列逻辑名称
  • 权限设置:确保插件执行用户拥有目标表和关联表的读写权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:05:19