我被要求创建一个包含适合日期范围的实体的视图。因此,如果实体的new_date1
字段小于今天,并且其new_date2
字段大于今天,则该实体应该出现在表单上的子网格中。
不幸的是,您不能使用简单的视图来执行此操作,因为 FetchXML 不支持可以返回今天日期的计算和运算符。
我想出了Active
在实体上创建一个字段的想法,然后让 javascript 规则根据输入的日期范围设置该字段。
然后视图可以使用该Active
字段作为过滤条件。
date1
问题是,如果实体的表单在一段时间内没有打开,实体可能会变为非活动状态(例如,今天的日期现在超出了两者date2
)但是如果用户没有打开实体的表单,该字段将不会自行更新并且该视图会将非活动实体显示为活动实体。
所以我想有一个计划的工作流收集所有应该处于活动状态或不活动状态的实体,然后这个工作流启动一个子工作流,将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。