Объявление

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

Скрипт для заполнения полей

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

  • Скрипт для заполнения полей

    Добрый день!

    Только начинаю знакомство с омнитрекером (9.3.0 3966), буду рад любой помощи. Сейчас есть 2 вопроса:
    1. Где взять службу OMNITRACKER Scheduler?
    2. Хочу сделать скрипт, который будет заполнять поля в обращении:
    ActiveRequest.UserFields("WorkGroup").TValue = "Мониторинг производственных сервисов"
    ActiveRequest.UserFields("Service").TValue = "Сопровождение"
    ActiveRequest.UserFields("TypeRequest").TValue = "Инцидент"
    ActiveRequest.SaveEx 265

    После запуска скрипта значения указанных полей обнуляются. Нужное значение для (ActiveRequest.UserFields("TypeRequest").TValue = "Инцидент") находится в таблице (fcTypeRequests) в текстовом поле (Name). Подскажите, пожалуйста, как правильно составить VBS скрипт.
    Последний раз редактировалось Ilya_MSK; 30-05-2018, 10:11.

  • #2
    1. OMNITRACKER Scheduler устанавливается по умолчанию вместе с сервером приложений. Смотрите в оснастку MMC Services.
    2. Предполагаю, что все три поля, которые вы хотите заполнить - ссылочные поля. Это означает, что справа от "=" должны быть экземпляры информационных объектов - записи соответствующих справочников. Поэтому вам нужно сначала их найти отдельной функцией или указать по ссылке, если это возможно в контексте вашего скрипта.
    Вам могут сказать, что можно указать и UniqueId записей справочников - и это правда, но я не рекомендую вам так делать на вашем уровне практики программирования в OMNITRACKER.

    Флаги для SaveEx рекомендую указывать выражением: не "SaveEx 265", а "SaveEx 1 + 256 + 8" - так (и в таком порядке) нагляднее.

    > Нужное значение для (ActiveRequest.UserFields("TypeRequest").TValue = "Инцидент") находится в таблице (fcTypeRequests) в текстовом поле (Name).

    Это значение ("Инцидент" на русском) - не для программной обработки. Должно быть поле с кодом, алиасом - что-то такое. Какие еще поля есть в этом справочнике?
    С уважением, Сергей Осадчий

    Комментарий


    • #3
      Сообщение от Sergey Osadchy Посмотреть сообщение
      Это значение ("Инцидент" на русском) - не для программной обработки. Должно быть поле с кодом, алиасом - что-то такое. Какие еще поля есть в этом справочнике?
      1. У нас старая версия Омни и из-за этого нет шедулера.
      2. Вы правы, значение "Инцидент" находится в другой папке, Alias Name этой папки = fcClassifier, далее подпапка fcTypeRequests и в ней уже записаны значения с типом запросов. Там у значений два поля, наименование на русском и номер, у Инцидента 00001.

      Помогите, пож., с примером.

      Комментарий


      • #4
        Сообщение от Ilya_MSK Посмотреть сообщение
        1. У нас старая версия Омни и из-за этого нет шедулера.
        Тогда только обновляться, отдельно его не поставишь.

        Сообщение от Ilya_MSK Посмотреть сообщение
        2. Помогите, пож., с примером.
        Так как вы не сообщили подробности о полях справочников услуг и рабочих групп, давайте пока ограничимся заполнением поля "TypeRequest". И предположим, что поле типа автономер (сужу по вашему "00001") в справочнике fcTypeRequests имеет алиас "Number".

        В самом простом виде (*) скрипт может быть таким:

        Код:
        Option Explicit
        
        Const FOLDER_PATH_fcTypeRequests = "fcClassifier\fcTypeRequests"
        
        SetFields ActiveRequest
        
        ' Заполняет поле "TypeRequest" значением "Инцидент"
        ' и сохраняет запись
        Sub SetFields(oRequest)
            Dim bSave : bSave = False
        
            Dim oRequestType : Set oRequestType = GetReferenceItem(FOLDER_PATH_fcTypeRequests, 1)
            If Not oRequestType Is Nothing Then
                oRequest.UserFields("TypeRequest").TValue = oRequestType
                bSave = True
            End If
        
            If bSave Then
                oRequest.SaveEx 1 + 256 + 8 ' не знаю, нужен ли вам флаг 8
            End If
        End Sub
        
        ' Возращает запись указанного справочника по указанному автономеру
        Function GetReferenceItem(sFolderAlias, iAutoNumber)
            Set GetReferenceItem = Nothing
            Dim oFolder : Set oFolder = ActiveSession.GetRequestFolderByPath(sFolderAlias)
            Dim oFilter : Set oFilter = oFolder.MakeFilter
            oFilter.UserField("Number") = iAutoNumber
            Dim oRequests : Set oRequests = oFolder.Search(oFilter, False)
            If oRequests.Count > 0 Then
                Set GetReferenceItem = oRequests.Item(0)
            End If
        End Function
        Поиск нужной вам услуги можно сделать либо этой же функцией, если там тоже только автономер, либо написать отдельную с поиском по другому полю.
        Поиск рабочей группы, если это специальная папка типа "UserGroups", лучше сделать по полю, на которое смапировано специальное поле "Group Name" (см. на закладке "Special Folder" папки групп).

        * В самом простом виде - это без проверки ошибок (неправильно указан путь папки и/или автономер, нет записи с таким номером в указанной папке; ошибки сохранения разного рода), без учета контекста работы скрипта и связанного с этим переоткрытия текущей записи, без систематического логирования, без грамотного подхода к структуре кода (использование глобальных библиотек скриптов). Советую в будущем уделить внимание этим вопросам.

        Если есть возможность, то сходите на тренинг по программированию в российский OMNINET.
        С уважением, Сергей Осадчий

        Комментарий


        • #5
          Сообщение от Sergey Osadchy Посмотреть сообщение
          В самом простом виде (*) скрипт может быть таким:
          Выдает ошибку: at line 27, char 4: Поле с меткой/псевдонимом 'Number' не найдено (IOtFilter)

          Сообщение от Sergey Osadchy Посмотреть сообщение
          Так как вы не сообщили подробности о полях справочников услуг и рабочих групп
          Где посмотреть эти данные? На вкладках "Special Folder" ничего галками не отмечено, пусто.

          Я предполагал что это действие можно было сделать тремя строчками со ссылкой на нужное поле, на подобии этого: Set tmpUser = ActiveUser.Object
          ActiveRequest.UserFields("Responsible").TValue = tmpUser.UserFields("Employe").TValue
          ActiveRequest.SaveEx 265

          Комментарий


          • #6
            Сообщение от Ilya_MSK Посмотреть сообщение
            Выдает ошибку: at line 27, char 4: Поле с меткой/псевдонимом 'Number' не найдено (IOtFilter)
            Ожидаемо, я так и написал: "предположим, что поле типа автономер .. в справочнике fcTypeRequests имеет алиас "Number".
            Замените "Number" на ваш правильный алиас поля.

            Какой именно? Откройте настройки папки fcTypeRequests двойным щелчком - окно "Folder Definitions", закладка "Fields" содержит список полей. Если не уверены в том, какое поле из списка находится на форме с лейблом "Номер" и имеет значение "00001", то откройте конструктор формы ("Folder Definitions" - "Forms") и уточните.

            Давайте разберемся с этим, чтобы скрипт заработал, а потом перейдем к услуге и группе.
            С уважением, Сергей Осадчий

            Комментарий


            • #7
              Сообщение от Sergey Osadchy Посмотреть сообщение
              Замените "Number" на ваш правильный алиас поля.
              Спасибо, корректно отработало после изменения поля на нужное. Как изменить еще услугу этим же скриптом?

              Комментарий


              • #8
                В папке, запись из которой мы изменяем скриптом, есть поле с алиасом "Service" - ссылка на справочник услуг. В настройках этого поля вы видите путь папки услуг. Посмотрите на поля этой папки ("Folder Definitions" - "Fields") и решите, какое поле лучше использовать для поиска услуги - или дайте скриншот закладки "Folder Definitions""Fields" - посмотрим вместе.

                В идеале это должно быть поле, значение которого не будет меняться - чтобы скрипт продолжал работать. Наименование услуги в принципе поменяться может. Как правило, для идентификации записей справочников делают специальное поле, тогда вы можете при необходимости даже удалить запись справочника и создать новую с таким же идентификатором - и скрипт будет работать, как и раньше. Как вы теперь понимаете, если использовать в качестве идентификатора автономер или UniqueId, то при пересоздании записи справочника скрипт придется обновить. Но если случай пересоздания маловероятен, то можем использовать те идентификаторы, что у нас есть.
                С уважением, Сергей Осадчий

                Комментарий


                • #9
                  Alias Name папки Services. На вкладке Fields есть два поля текстовых "Наименование" - Name и "Номер" - ID. Предлагаю так же по ID, 171.

                  Комментарий


                  • #10
                    Сообщение от Sergey Osadchy Посмотреть сообщение
                    Поэтому вам нужно сначала их найти отдельной функцией или указать по ссылке...
                    Если значения найдены и скрипт отрабатывает, возможно ли указать значения по ссылке?

                    Комментарий


                    • #11
                      Сообщение от Ilya_MSK Посмотреть сообщение
                      Alias Name папки Services. На вкладке Fields есть два поля текстовых "Наименование" - Name и "Номер" - ID. Предлагаю так же по ID, 171.
                      Добавим путь к справочнику услуг, доработаем функцию поиска, добавим установку значения поля:

                      Код:
                      Option Explicit
                      
                      Const FOLDER_PATH_fcTypeRequests = "fcClassifier\fcTypeRequests"
                      Const FOLDER_PATH_Services = "[укажите полный путь папки]"
                      
                      SetFields ActiveRequest
                      
                      ' Заполняет поля:
                      ' "TypeRequest" = "Инцидент" (автономер 1)
                      ' "Service" = "Сопровождение" (ID 171)
                      ' и сохраняет запись
                      Sub SetFields(oRequest)
                          Dim bSave : bSave = False
                      
                          Dim oRequestType : Set oRequestType = _
                              GetReferenceItem(FOLDER_PATH_fcTypeRequests, "Number", 1)
                          If Not oRequestType Is Nothing Then
                              oRequest.UserFields("TypeRequest").TValue = oRequestType
                              bSave = True
                          End If
                      
                          Dim oService : Set oService = _
                              GetReferenceItem(FOLDER_PATH_Services, "ID", 171)
                          If Not oService Is Nothing Then
                              oRequest.UserFields("Service").TValue = oService
                              bSave = True
                          End If
                      
                          If bSave Then
                              oRequest.SaveEx 1 + 256 + 8
                          End If
                      End Sub
                      
                      ' Возращает запись справочника по значению указанного поля
                      ' sFolderAlias Путь папки
                      ' sFieldAlias Алиас поля
                      ' vFieldValue Значение поля
                      Function GetReferenceItem(sFolderAlias, sFieldAlias, vFieldValue)
                          Set GetReferenceItem = Nothing
                          Dim oFolder : Set oFolder = ActiveSession.GetRequestFolderByPath(sFolderAlias)
                          Dim oFilter : Set oFilter = oFolder.MakeFilter
                          oFilter.UserField(Eval("sFieldAlias")) = vFieldValue
                          Dim oRequests : Set oRequests = oFolder.Search(oFilter, False)
                          If oRequests.Count > 0 Then
                              Set GetReferenceItem = oRequests.Item(0)
                          End If
                      End Function
                      С уважением, Сергей Осадчий

                      Комментарий


                      • #12
                        Сообщение от Ilya_MSK Посмотреть сообщение
                        Если значения найдены и скрипт отрабатывает, возможно ли указать значения по ссылке?
                        По ссылке - я имел в виду что-то типа
                        ActiveRequest.UserFields("Service").TValue = ActiveRequest.UserFields("Template").TValue.UserFi elds("Service").TValue

                        В вашем случае, исходя из первоначальной постановки задачи, ничего такого нет.
                        С уважением, Сергей Осадчий

                        Комментарий


                        • #13
                          Сообщение от Sergey Osadchy Посмотреть сообщение

                          Добавим путь к справочнику услуг, доработаем функцию поиска, добавим установку значения поля:
                          at line 39, char 18: Folder not found (IOtSession) Может ли быть ошибка в том, что у корневой папки поле Alias Name пустое?


                          Комментарий


                          • #14
                            Сообщение от Ilya_MSK Посмотреть сообщение
                            at line 39, char 18: Folder not found (IOtSession) Может ли быть ошибка в том, что у корневой папки поле Alias Name пустое?
                            Я указал Service, а надо было \Service и заработало. Спасибо за подробный ответ!

                            Комментарий


                            • #15
                              По выше описанному вопросов больше нет, Сергей спасибо!

                              Усложним задачу, новые обращения формируются из письма, тема письма переходит в тему обращения в поле ShortDescription, корневая папка fldIncReq. Поступает большое количество типовых обращений от одного и того же автора с разными темами. Как добавить эти метрики? Например если ShortDescription = "проверка печати", то меняем поле TypeRequest на как описано выше, если ShortDescription = "замена тонера", то меняем Service.
                              Последний раз редактировалось Ilya_MSK; 05-06-2018, 16:30.

                              Комментарий

                              Обработка...
                              X