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
相关产品推荐
相关产品推荐

