Поиск по этому блогу

четверг, 1 сентября 2011 г.

SAP gui scripting. Автоматизация пользовательских действий в интерфейсе.

Иногда приходится проделывать одни и те же действия в работе с SAP GUI, иначе сказать,- что работа укладывается в одну логическую цепочку действий. Эту логическую цепочку действий можно переложить из рутинного кликанья мыши на автономную работу GUI интерфейса, посредством макросов.


Пользовательский интерфейс имеет встроенный макро - рекордер, что уже облегчает работу с макросами. Если gui под Windows, то запись рекордера проводится на языке Visual Basic Script. Так же можно создавать макросы на Java Script.



Для тех, у кого этот пункт меню неактивный, - Настройка разрешения на использование скриптов 

Все скрипты по умолчанию сохраняются в каталоге "С:\Documents and Settings\%пользователь%\SapWorkDir\". 
В диалоговом окне макро - рекордера находятся кнопки записи, остановки, воспроизведения и детальной информации:



Для небольшого примера создадим макрос выполняющий изменение наименования единицы оборудования в паспорте (транзакция IE02). Для этого определим последовательность наших действий в gui - интерфейсе:
  • Начать запись макроса
  • Запустить транзакцию IE02
  • Указать в селективном экране номер единицы оборудования
  • Выполнить программу
  • В паспорте изменить наименование ЕО
  • Сохранить изменения
  • Вернуться в основное меню
  • Остановить запись макроса
Записанный скрипт будет выглядеть таким образом:

If Not IsObject(application) Then
   Set SapGuiAuto  = GetObject("SAPGUI")             '| Определяется интерфейс.
   Set application = SapGuiAuto.GetScriptingEngine   '| Определяется скриптовый движок.
End If
If Not IsObject(connection) Then
   Set connection = application.Children(0)          '| Определяется подключение.
End If
If Not IsObject(session) Then
   Set session    = connection.Children(0)           '| Определяется сессия управления.
End If
If IsObject(WScript) Then
   WScript.ConnectObject session,     "on"           '| Открытие сессии.
   WScript.ConnectObject application, "on"           '| управления интерфейсом.
End If

'   Все что ниже этого комментария, - записаные нами действия

'   Развернуть основное окно (можно удалить строку)
session.findById("wnd[0]").maximize
'   Запись транзакции в командной строке
session.findById("wnd[0]/tbar[0]/okcd").text = "ie02"
'   Нажатие клавиши [Enter]
session.findById("wnd[0]").sendVKey 0
'   Запись ЕО в поле селективного экрана
session.findById("wnd[0]/usr/ctxtRM63E-EQUNR").text = "10038857"
'   Установка позиции курсора в поле селективного экрана (можно удалить)
session.findById("wnd[0]/usr/ctxtRM63E-EQUNR").caretPosition = 8
'   Нажатие клавиши [Enter]
session.findById("wnd[0]").sendVKey 0
'   Запись наименования в поле паспорта ЕО
session.findById("wnd[0]/usr/subSUB_EQKO:SAPLITO0:0152/subSUB_0152B:SAPLITO0:1525/ctxtITOB-SHTXT").text = "Задвижка линейная №20"
'   Установка позиции курсора в поле наименования ЕО (можно удалить)
session.findById("wnd[0]/usr/subSUB_EQKO:SAPLITO0:0152/subSUB_0152B:SAPLITO0:1525/ctxtITOB-SHTXT").caretPosition = 21
'   Нажатие кнопки "Сохранение"
session.findById("wnd[0]/tbar[0]/btn[11]").press
'   Нажатие кнопки "Назад" (возвращение в основное меню)
session.findById("wnd[0]/tbar[0]/btn[3]").press

Можно очистить скрипт от лишних строк, которые не влияют на логику наших действий (отмеченные в комментариях как,- "можно удалить"), получится более компактно.
Так как мы записали обычный vbs - скрипт, то и запускать его можно всеми средствами Windows:
  • С командной строки cmd.exe
  • Двойным кликом
  • Перетаскиванием в основное окно sap gui (drag&drop)
Единственное что попросит скрипт, так это разрешение на соединение с приложением sap:

 

Напоследок, придадим скрипту небольшую интерактивность. Значения (номер ЕО и наименование ЕО), жестко определенные в коде, запросим у пользователя с помощью функции VB - InputBox() и двух переменных:

numEO = InputBox("Введите номер ЕО")
nameEO = InputBox("Введите наименование ЕО")

И уже эти переменные укажем в качестве текстовых значений для полей sap gui:

If Not IsObject(application) Then
   Set SapGuiAuto  = GetObject("SAPGUI")
   Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
   Set connection = application.Children(0)
End If
If Not IsObject(session) Then
   Set session    = connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session,     "on"
   WScript.ConnectObject application, "on"
End If

numEO = InputBox("Введите номер ЕО")
nameEO = InputBox("Введите Наименование ЕО")
session.findById("wnd[0]/tbar[0]/okcd").text = "ie02"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtRM63E-EQUNR").text = numEO
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/subSUB_EQKO:SAPLITO0:0152/subSUB_0152B:SAPLITO0:1525/ctxtITOB-SHTXT").text = nameEO
session.findById("wnd[0]/tbar[0]/btn[11]").press
session.findById("wnd[0]/tbar[0]/btn[3]").press

При запуске скрипт начинает работать с самым первым подключением - application.Children(0). Если запущено несколько оконных режимов, скрипт отработает на первом.

5 комментариев:

  1. а как быть с вводом русских символов. у меня например не воспринимает и отказывается воспроизводить такой ввод на SAP GUI 720 pathclvl8

    ОтветитьУдалить
  2. Таких проблем не возникало. Однако, проверьте кодировку самого скриптового файла, должна быть в ANSI.

    ОтветитьУдалить
  3. А есть ли какой-либо способ отрабатывать ошибки? Можно ли как-то отключать отображение действие ("тихий режим") (как в Excel)?

    ОтветитьУдалить
  4. Так как это windows скрипты, попробуйте MS-овский Script Debugger for Windows для отлавливания ошибок. Частично отображение действий можно отключить параметром "/INPLACE",- его указать при подключении в функции OpenConnection, после идентификатора системы. Например: Set Connection = oApp.OpenConnection("KPR/INPLACE"), где oApp - приложение из которого вызывается скрипт, KPR - идентификатор системы. Почему частичное? - потому что не родительские окна(wnd[1],wnd[2]...) будут отображаться. Хотя, можно покопать в сторону функции SetParent для этих окон.

    ОтветитьУдалить
  5. Огромное спасибо! отличный пост.

    ОтветитьУдалить