Пример расчета длительностей workflow, по мотивам этой темы.
Код:
' ================================================== ' возвращает длительность последнего нахождения в указанном статусе в секундах ' (за период с даты создания записи по текущее время) ' параметры: текущая запись, алиас статуса, наименование календаря ' если наименование календаря - не пустая строка, то с учетом календаря ' пример вызова: ' Dim intSeconds : intSeconds = GetLastTimeInState(ActiveRequest, "State", "") Function GetLastTimeInState(objActiveRequest, strStateAlias, strCalendarName) Dim strPrevLogHeader : strPrevLogHeader = strLogHeader ' сохраняем предыдущий заголовок лог-сообщения 'strLogHeader = "IncidentMgmt_General.GetLastTimeInState(" & _ ' objActiveRequest.UserFields("Number").Value & ", " & _ ' "State:" & strStateAlias & ", " & _ ' "Calendar:" & strCalendarName & ")" 'log_d "start" Dim dtStartDate : dtStartDate = GetDateLastStateTransition(objActiveRequest, strStateAlias) ' дата последнего перехода в указанный статус Dim objFilter : Set objFilter = objActiveRequest.RequestFolder.MakeFilter objFilter.ObjectUniqueId = objActiveRequest.UniqueId ' нужна только указанная запись Dim objQuery : Set objQuery = objActiveRequest.RequestFolder.MakeQuery objQuery.Filter = objFilter Dim objQueryResultColumn : Set objQueryResultColumn = objQuery.AddColumn("TimeInState") objQueryResultColumn.Type = 5 ' otQColTypeTimeInState objQueryResultColumn.Field = "State" ' алиас поля "Статус" objQueryResultColumn.State = strStateAlias ' нужен указанный статус objQueryResultColumn.StartDate = dtStartDate ' с даты последнего перехода в указанный статус objQueryResultColumn.EndDate = Now ' по текущее время objQueryResultColumn.TimeScale = 1 ' otQScaleSeconds If strCalendarName <> "" Then 'log_d "считаем с учетом календаря: " & strCalendarName objQueryResultColumn.Calendar = strCalendarName End If Dim objQueryResult : Set objQueryResult = objQuery.Execute ' выполняем запрос 'log_d "длит. последнего нахождения в статусе """ & strStateAlias & """, секунд: " & cstr(objQueryResult.Value(0, 0)) GetLastTimeInState = objQueryResult.Value(0, 0) ' возвращаем результат 'log_d "finish" 'strLogHeader = strPrevLogHeader ' возвращаем предыдущий заголовок лог-сообщения End Function ' ================================================== ' возвращает суммарную длительность нахождения в указанном статусе в секундах с даты создания записи по текущее время ' параметры: текущая запись, алиас статуса, наименование календаря ' если наименование календаря - не пустая строка, то с учетом календаря ' пример вызова: ' Dim intSeconds : intSeconds = GetTotalTimeInState(ActiveRequest, "State", "") Function GetTotalTimeInState(objActiveRequest, strStateAlias, strCalendarName) Dim strPrevLogHeader : strPrevLogHeader = strLogHeader ' сохраняем предыдущий заголовок лог-сообщения 'strLogHeader = "IncidentMgmt_General.GetTotalTimeInState(" & _ ' objActiveRequest.UserFields("Number").Value & ", " & _ ' "State:" & strStateAlias & ", " & _ ' "Calendar:" & strCalendarName & ")" 'log_d "start" Dim objFilter : Set objFilter = objActiveRequest.RequestFolder.MakeFilter objFilter.ObjectUniqueId = objActiveRequest.UniqueId ' нужна только указанная запись Dim objQuery : Set objQuery = objActiveRequest.RequestFolder.MakeQuery objQuery.Filter = objFilter Dim objQueryResultColumn : Set objQueryResultColumn = objQuery.AddColumn("TimeInState") objQueryResultColumn.Type = 5 ' otQColTypeTimeInState objQueryResultColumn.Field = "State" ' алиас поля "Статус" objQueryResultColumn.State = strStateAlias ' нужен указанный статус objQueryResultColumn.StartDate = objActiveRequest.UserFields("DateCreated").TValue ' с даты создания objQueryResultColumn.EndDate = Now ' по текущее время objQueryResultColumn.TimeScale = 1 ' otQScaleSeconds If strCalendarName <> "" Then 'log_d "считаем с учетом календаря: " & strCalendarName objQueryResultColumn.Calendar = strCalendarName End If Dim objQueryResult : Set objQueryResult = objQuery.Execute ' выполняем запрос 'log_d "сумм. длит. нахождения в статусе """ & strStateAlias & """, секунд: " & cstr(objQueryResult.Value(0, 0)) GetTotalTimeInState = objQueryResult.Value(0, 0) ' возвращаем результат 'log_d "finish" 'strLogHeader = strPrevLogHeader ' возвращаем предыдущий заголовок лог-сообщения End Function ' ================================================== ' возвращает дату/время последнего перехода в указанный статус ' (за период с даты создания записи по текущее время) ' если перехода в указанный статус не было, возвращает дату создания ' предполагается, что дата создания не пустая ' пример вызова: ' Dim dtDate : dtDate = GetDateLastStateTransition(ActiveRequest, "State") Function GetDateLastStateTransition(objActiveRequest, strStateAlias) 'Dim strPrevLogHeader : strPrevLogHeader = strLogHeader ' сохраняем предыдущий заголовок лог-сообщения 'strLogHeader = "SLM_General.GetDateLastStateTransition(" & _ ' objActiveRequest.UserFields("Number").Value & ", " & _ ' "State:" & strStateAlias & ")" 'log_d "start" Dim objFilter : Set objFilter = objActiveRequest.RequestFolder.MakeFilter objFilter.ObjectUniqueId = objActiveRequest.UniqueId ' нужна только указанная запись Dim objQuery : Set objQuery = objActiveRequest.RequestFolder.MakeQuery objQuery.Filter = objFilter Dim objQueryResultColumn : Set objQueryResultColumn = objQuery.AddColumn("DateLastStateTransition") objQueryResultColumn.Type = 3 ' otQColTypeStateTransDate objQueryResultColumn.Field = "State" ' алиас поля "Статус" objQueryResultColumn.FromState = Null ' из любого статуса objQueryResultColumn.ToState = strStateAlias ' в указанный статус objQueryResultColumn.LastStateTransition = True ' нужен последний переход objQueryResultColumn.StartDate = objActiveRequest.UserFields("DateCreated").TValue ' с даты создания objQueryResultColumn.EndDate = Now ' по текущее время objQueryResultColumn.DefaultDate = objActiveRequest.UserFields("DateCreated").TValue ' по умолчанию дата создания Dim objQueryResult : Set objQueryResult = objQuery.Execute ' выполняем запрос 'log_d "дата последнего перехода в статус """ & strStateAlias & """: " & cstr(objQueryResult.Value(0, 0)) GetDateLastStateTransition = objQueryResult.Value(0, 0) ' возвращаем результат 'log_d "finish" 'strLogHeader = strPrevLogHeader ' возвращаем предыдущий заголовок лог-сообщения End Function