Объявление

Свернуть
Пока нет объявлений.

Расчет длительностей workflow с помощью OtQuery

Свернуть
X
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Расчет длительностей workflow с помощью OtQuery

    Пример расчета длительностей 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
    С уважением, Сергей Осадчий
Обработка...
X