Меня попросили создать представление, включающее объекты, соответствующие диапазону дат. Таким образом, если поле 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.