通过工作流更新字段,更好的方法?

c# .net dynamics-crm-2011 dynamics-crm-2016

130 观看

2回复

2582 作者的声誉

我被要求创建一个视图,其中包含适合日期范围的实体。因此,如果实体的new_date1字段小于今天,并且其new_date2字段大于今天,则该实体应出现在表单的子网格中。

不幸的是,您无法使用简单的视图执行此操作,因为FetchXML不支持可能返回当前日期的计算和运算符。

我想到了Active在实体上创建一个字段的想法,然后根据输入的日期范围使用JavaScript规则设置该字段。

然后,视图可以使用该Active字段作为过滤条件。

问题在于,如果一段时间内未打开实体的表单,则该实体可能会变为非活动状态(例如,今天的日期现在超出了两者date1date2但如果用户未打开该实体的表单,则该字段将不会更新自身,并且该视图将非活动实体显示为活动实体。

因此,我想到安排工作流来收集应该处于活动状态或非活动状态的所有实体,然后此工作流将启动子工作流,该工作流会将Active标志设置为“是”或“否”。

这里是一些涉及的代码:

private void LaunchUpdateOpportunityWorkflow(IOrganizationService service, ITracingService tracingService, DataCollection<Entity> collection, bool active)
{

        foreach (Entity entity in collection)
        {
            //launch a different workflow, depending on whether we want it active or inactive...
            Guid wfId = (active) ? setActiveWorkflowId : setInactiveWorkflowId;
            ExecuteWorkflowRequest execRequest = new ExecuteWorkflowRequest();
            execRequest.WorkflowId = wfId;
            execRequest.EntityId = (Guid)entity["opportunityid"];

            try
            {
                CrmServiceExtensions.ExecuteWithRetry<ExecuteWorkflowResponse>(service, execRequest);
            }
            catch (Exception ex)
            {
                tracingService.Trace(string.Format("Error executing workflow for opportunity {0}: {1}", entity["opportunityid"], ex.Message));
            }
        }

}

收集相关信息的过程DataCollection是通过简单的RetrieveMultipleRequest请求完成的。

这种方法的问题在于,如果服务器重新启动,则必须有人去启动运行上面代码的工作流。

有更好的方法吗?我正在使用MS CRM 2016。

作者: Francis Ducharme 的来源 发布者: 2016 年 5 月 24 日

回应 (2)


1

14839 作者的声誉

我认为您可以使用FetchXML实现此目的。

new_date1 领域比今天要小

这早于24小时。

new_date2 场大于今天

这是将来的任何日期,因此假设您的日期不超过100年,则可以使用“下一个X年”。

在此处输入图片说明

正如达伦·刘易斯(Darren Lewis)所指出的,根据您对昨天的定义,可能不超过24小时。在这种情况下,请尝试使用最近的X年。

在此处输入图片说明

作者: James Wood 发布者: 24.05.2016 10:35

3

2850 作者的声誉

决定

在Jame的答案中,如果在使用fetchxml无法实现过滤条件的情况下过滤条件变得复杂,则始终可以使用插件。

在“ RetrieveMultiple”消息上注册一个插件。

var queryExpression = PluginExecutionContext.InputParameters["Query"];
if(queryExpression == null || !queryExpression.EntityName.equals("yourentityname", StringComparison.InvariantCultureIgnoreCase) return;

添加高级查找所特有的条件,因为无法过滤出哪个高级查找触发了实体上的插件,实现此目的的最简单方法是添加属性并在高级查找查询中使用它。

检查条件,如果找到,则用户正在尝试运行您已设置的高级查找:

if (queryExpression.Criteria == null || queryExpression.Criteria.Conditions == null ||
!queryExpression.Criteria.Conditions.Any()) return;

找到匹配的条件,因此您可以删除它并添加要通过以下条件过滤数据的条件:

 var matchContidion = queryExpression.Criteria.Conditions.FirstOrDefault(c => c.AttributeName == "yourflagattribute");
 if (matchContidion == null) return;

删除虚拟匹配条件并添加您自己的条件:

queryExpression.Criteria.Conditions.Remove(matchContidion);
queryExpression.Criteria.Conditions.Add(new ConditionExpression("new_date1", ConditionOperator.LessThan, DateTime.Now));
queryExpression.Criteria.Conditions.Add(new ConditionExpression("new_field2", ConditionOperator.Equals, "Some complex value which cannot be set using fetchxml")); //for example, based on certain values, you might want to call a webservice to get the filter value. 
作者: dynamicallyCRM 发布者: 24.05.2016 10:47
32x32