Иногда приходится проделывать одни и те же действия в работе с 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). Если запущено несколько оконных режимов, скрипт отработает на первом.
а как быть с вводом русских символов. у меня например не воспринимает и отказывается воспроизводить такой ввод на SAP GUI 720 pathclvl8
ОтветитьУдалитьТаких проблем не возникало. Однако, проверьте кодировку самого скриптового файла, должна быть в ANSI.
ОтветитьУдалитьА есть ли какой-либо способ отрабатывать ошибки? Можно ли как-то отключать отображение действие ("тихий режим") (как в Excel)?
ОтветитьУдалитьТак как это windows скрипты, попробуйте MS-овский Script Debugger for Windows для отлавливания ошибок. Частично отображение действий можно отключить параметром "/INPLACE",- его указать при подключении в функции OpenConnection, после идентификатора системы. Например: Set Connection = oApp.OpenConnection("KPR/INPLACE"), где oApp - приложение из которого вызывается скрипт, KPR - идентификатор системы. Почему частичное? - потому что не родительские окна(wnd[1],wnd[2]...) будут отображаться. Хотя, можно покопать в сторону функции SetParent для этих окон.
ОтветитьУдалитьОгромное спасибо! отличный пост.
ОтветитьУдалить