Текущее время: Чт, мар 28 2024, 16:44

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Ср, фев 20 2019, 12:33 
Ассистент
Ассистент

Зарегистрирован:
Чт, июн 01 2017, 12:58
Сообщения: 31
Всем привет,

При заполнении танзакции создания реквизиции ME51N (скриншот) через GUI Scripting есть проблема определения пути до контролов на форме.
Некоторые вкладки (Account Assignment) появляются только для определенных типов аккаунтов (Cost Center), но это не проблема.

Проблема в динамическом пути форм Dynpro:
Valuation tab:
Code:
with session
'select tab
.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0020/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:3303/tabsREQ_ITEM_DETAIL/tabpTABREQDT5").Select
'enter valuation price
.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0010/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:3303/tabsREQ_ITEM_DETAIL/tabpTABREQDT5/ssubTABSTRIPCONTROL1SUB:SAPLMEGUI:3320/txtMEREQ3320-PREIS").text = "100"
'enter currency
.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0010/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:3303/tabsREQ_ITEM_DETAIL/tabpTABREQDT5/ssubTABSTRIPCONTROL1SUB:SAPLMEGUI:3320/ctxtMEREQ3320-WAERS").text = "USD"
end with
Texts tab:
Code:
with session
'select tab
.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0010/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:3303/tabsREQ_ITEM_DETAIL/tabpTABREQDT13").select
'select item text
.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0010/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:3303/tabsREQ_ITEM_DETAIL/tabpTABREQDT13/ssubTABSTRIPCONTROL1SUB:SAPLMEGUI:1329/subTEXTS:SAPLMMTE:0200/cntlTEXT_TYPES_0200/shell").selectedNode = "B01"
'enter text
.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0010/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:3303/tabsREQ_ITEM_DETAIL/tabpTABREQDT13/ssubTABSTRIPCONTROL1SUB:SAPLMEGUI:1329/subTEXTS:SAPLMMTE:0200/subEDITOR:SAPLMMTE:0201/cntlTEXT_EDITOR_0201/shellcont/shell").text = "test"
end with

Проблема с первой частью строки:
Цитата:
wnd[0]/usr/subSUB0:SAPLMEGUI:XXXX
XXXX зависит от кол-ва контролов на форме, например:
0013/0010 - первый айтем в реквизиции
0020/0010 - тип айтема, его аккаунт (добавляются/удаляются вкладки айтема)
0019/0015 - свернута ли верхняя часть формы (например заголовок автоматически сворачивается если форма не влезает на экран)

Подскажите надежный способ однозначно указать путь до контрола, в частности выбрать нужную вкладку, если она есть на форме и не городить if else?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Пт, фев 22 2019, 13:46 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
так а в чём проблема то?
ME5xN так реализована, что там вкладки/экраны динамически меняются, в зависимости от параметров (в т.ч. вводимых).
Соответственно код экрана ХХХХ будет разный.

Вам просто надо в коде учитывать случай, когда на закладку перешли, а нужного контрола там нету (т.е. закладка отсутствует). Например, If-ElseIf. Или обернуть в On Error Resume Next каждый такой вызов, чтобы пропускало заполнение тех блоков, для которых закладка не открылась.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Пт, фев 22 2019, 20:42 
Ассистент
Ассистент

Зарегистрирован:
Чт, июн 01 2017, 12:58
Сообщения: 31
Cейчас как раз с If/Else, но это ненадежно так как сложно учесть все комбинации.
С On Error Resume Next можно наверное вообще в цикле перебирать XXXX пока правильный не найдется, но это так себе способ.

Может есть какой-то более оптимальный способ, вроде findByName (тут обращение к полю CostCenter):
Code:
.findByName("ctxtCOBL-KOSTL", "GuiCTextField").Text = "12345"
Но не знаю как через findByName выбрать вкладку или вот это ../cntlTEXT_TYPES_0200/shell").selectedNode = "B01".


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Пн, фев 25 2019, 09:18 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
Цитата:
Но не знаю как через findByName выбрать вкладку


sap-enjoy транзакции типа ME51N - очень своеобразные в плане логики диалоговых экранов (разрабочик изрядно "дунул" ООП, когда их наворачивал). В них помимо команд которые явно повешены на GUI-кнопки, есть масса скрытых команд, которые видны только в абап-коде. Поэтому в таких транзакциях очень помогает /h и анализ в отладчике наполнения sy-ucomm и PAI-логики экранов.

Конкретно в ME51N...53N диалоговые закладки в разделе "Позиция подробно" переключаются командами TABREQDT1 - TABREQDT15
Можете их в окно команд ввести ручками, например TABREQDT3 это закладка Данные материала, TABREQDT15 Данные клиента и т.д.
Соответственно в коде будет oSession.sendcommand('TABREQDT3')

Скрыть/развернуть разделы Заголовок, Обзор позиций, Позиция подробно - команды METOGGON1/METOGGOFF1, METOGGON2/METOGGOFF2, METOGGON3/METOGGOFF3 соответственно.

Навигация по позициям документа - команды FORWARD3200/BACK3200.

Соответственно, логика может быть с использованием On Error (это самый надёжный вариант реализации):

dim mycontrol as object
set mycontrol = nothing
oSession.sendcommand('TABREQDT6') 'На закладку Контировка
on error resume next
set mycontrol = oSession.findByName("ctxtCOBL-KOSTL", "GuiCTextField")
on error goto 0
if mycontrol is nothing then
'закладка Контировка не открылась (или контрола на ней нету)
else
'обработка закладки
mycontrol.Text = '12345'
endif

И далее в таком же стиле.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Ср, фев 27 2019, 11:41 
Ассистент
Ассистент

Зарегистрирован:
Чт, июн 01 2017, 12:58
Сообщения: 31
Огромное спасибо за конкретику с примером, особенно за .sendcommand('TABREQDTXXX') это сильно упрощает жизнь.

pberezin написал:
sap-enjoy транзакции типа ME51N - очень своеобразные в плане логики диалоговых экранов (разрабочик изрядно "дунул" ООП, когда их наворачивал). В них помимо команд которые явно повешены на GUI-кнопки, есть масса скрытых команд, которые видны только в абап-коде. Поэтому в таких транзакциях очень помогает /h и анализ в отладчике наполнения sy-ucomm и PAI-логики экранов.
Есть такое, при разных условиях в одном и том же месте, фокус может переходить на новую вкладку, а может и нет и тому подобные неочевидные вещи..
К сожалению у меня доступ только с правами пользователя.

Подскажите, пожалуйста, как справиться с .findByName в этой enjoy транзакции.
SAP script recorder записывает заполнение поля CostCenter следующим образом:
Code:
.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0020/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:3303/tabsREQ_ITEM_DETAIL/tabpTABREQDT6/ssubTABSTRIPCONTROL1SUB:SAPLMEVIEWS:1101/subSUB2:SAPLMEACCTVI:0100/subSUB1:SAPLMEACCTVI:1100/subKONTBLOCK:SAPLKACB:1101/ctxtCOBL-KOSTL").Text = "12345"

Раньше вроде бы у меня работало в следующем виде, но теперь выдает ошибку 438 "Object does't support this property or method."
Code:
.findByName("ctxtCOBL-KOSTL", "GuiCTextField").Text = "12345"
Вижу, что поле есть на экране, значение тоже пытаюсь записать корректное. Контрол вроде бы тоже находится, но почему-то его свойство Text не могу поменять, в чем тут дело может быть (на скриншоте из первого сообщения это поле в самом низу)?

Еще такой вариант попробовал с форума САПа, но выдает ошибку 620 "The control could not be found by name."
Code:
.findById("wnd[0]").findByName("ctxtCOBL-KOSTL", "GuiCTextField").Text =  "12345"
Вообще поле CostCenter текстовое, не комбобокс, хотя почему-то ctxtCOBL-KOSTL, на всякий случай попробовал и GuiCTextField и GuiTextField, результата нет.

ps несколько ссылок на форум САПа по поиску контролов, так, на всякий случай:
* How to Check the Existence of an Object Without Exception Messagebox
* сообщение от Evando


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Ср, фев 27 2019, 12:45 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
Цитата:
как справиться с .findByName в этой enjoy транзакции. SAP script recorder записывает заполнение поля CostCenter следующим образом:

ну работайте с findById() - разницы особой не должно быть.
Можно же точку останова поставить (только явно в объектную переменную контрол присвоить для удобства анализа) - и в отладчике по "Add watch" посмотреть какие проперти в этом контроле доступны.

Там много моментов в гуискриптинге, когда методом научного тыка, с помощью пошаговой отладки VBA-кода приходится допиливать.
Не простой движок.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Ср, фев 27 2019, 14:15 
Ассистент
Ассистент

Зарегистрирован:
Чт, июн 01 2017, 12:58
Сообщения: 31
pberezin написал:
ну работайте с findById() - разницы особой не должно быть.
Хочется findByName заставить работать, уж очень аккуратно оно выглядит по сравнению с findById.
pberezin написал:
Можно же точку останова поставить..
Да так и тыкаюсь :D
Есть еще Scripting Tracker от Stefan Schnell, но у меня нет возможность ее использовать.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Ср, фев 27 2019, 14:38 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
Цитата:
очень аккуратно оно выглядит по сравнению с findById

зато работает только в пределах подэкрана самого нижнего уровня (в вашем случае SAPLKACB:1101). А FindById понимает полный путь, ровно как рекордер записал (что ускоряет разработку методом тыка).

Цитата:
Есть еще Scripting Tracker от Stefan Schnell, но у меня нет возможность ее использовать

А зачем наворачивать лишние сущности, когда есть экселька? В экселе в vba-редакторе прекрасно всё работает.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Пн, мар 04 2019, 11:05 
Ассистент
Ассистент

Зарегистрирован:
Чт, июн 01 2017, 12:58
Сообщения: 31
В общем получилось найти контрол (если он есть на экране) в enjoy транзакции такими способами:

Вариант 1 - через findByName
Code:
.findById("wnd[0]/usr").findByName("KONTBLOCK:SAPLKACB:1101", "GuiSimpleContainer").findByName("COBL-KOSTL", "GuiCTextField").Text = "12345"

Вариант 2 - ищем номер экрана в сессии
Code:
Function getScreenNbr() As String
    getScreenNbr= Right(session.Children(0).Children(4).Children(1).Name, 4)
End Function
Code:
.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:" & getScreenNbr & "/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:3303/tabsREQ_ITEM_DETAIL/tabpTABREQDT6/ssubTABSTRIPCONTROL1SUB:SAPLMEVIEWS:1101/subSUB2:SAPLMEACCTVI:0100/subSUB1:SAPLMEACCTVI:1100/subKONTBLOCK:SAPLKACB:1101/ctxtCOBL-KOSTL").Text = "12345"

Вариант 3 - брутфорсим номер экрана. Не пробовал, но по идее должно работать.
По аналогии со вторым вариантом передаем в функцию id контрола и перебираем возможные номера (допустим с 10 до 20), как нашли тот на котором нет ошибки - отправляем обратно.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Пн, мар 04 2019, 13:14 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
не совсем конечно понимаю, зачем именно "брутфорсить" ?
Экраны в сапе статичны. Т.е. путь даже через длинную цепочку wnd[0]\usr\контейнер:экран\субконтейнер1:субэкран1\субконтейнер2:субэкран2\..\контрол получается статичным.
Т.е. либо 1 значение пути, либо Error. Поэтому обёртывание в On error resume next - довольно простой и надёжный метод.

если не получается найти - делаете присвоение в object-переменную пути на 1 этаж выше, ставите точку останова, и в VBA-отладчике смотрите содержимое дочерних пропертей объекта, там правильное имя контрола и увидите. Но обычно того, что записал макрорекордер гуискриптинга - хватает и так.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Пн, мар 04 2019, 15:24 
Ассистент
Ассистент

Зарегистрирован:
Чт, июн 01 2017, 12:58
Сообщения: 31
Идея брутфорса, как ее вижу я, в том чтобы не писать сложных проверок по неочевидным условиям.

Например:
  • на экране выбрана вкладка AccountAssignment (Контировка) отображается контрол COBL-KOSTL, но пусть до него будет разным в случаях когда верхняя часть Header или средняя Item Overview свернута/развернута.
    А сворачиваются они автоматически когда контент не влезает в окно САПа, что происходит при уменьшении разрешения экрана (например человек отсоединил внешний монитор где разрешение было выше чем на ноутбуке).
  • номер экрана в пути до вкладки Valuation будет отличаться в зависимости от типа аккаунта материала (CostCenter / Order).
  • что-то еще чего я не учел..

Номера присваиваются экрану в диапазоне 0010-0020, можно конечно найти реальные значения (вроде 0010, 0013, 0015 и тд) и перебирать только по ним, но мне кажется это особо не скажется на производительности.

Хотя может я просто чего-то недопонимаю, так как не знаком с внутренностями транзакции :D


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Пн, мар 04 2019, 17:59 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
Цитата:
пусть до него будет разным в случаях когда верхняя часть Header или средняя Item Overview свернута/развернута.
А сворачиваются они автоматически когда контент не влезает в окно САПа, что происходит при уменьшении разрешения экрана (например человек отсоединил

Ну вообщето, если пользователь сел за пакетную обработку скриптинга - то лучше чтобы он лишних телодвижений с рабочим местом не совершал. Достаточно вывести перед циклом обработки классическое MsgBox("Вы точно точно уверены?") , а следом ещё один Msgbox("Ничего не нажимайте, ничего не отключайте"). Т.е. техническое сочетать с организационным. :D

Цитата:
номер экрана в пути до вкладки Valuation будет отличаться в зависимости от типа аккаунта материала (CostCenter / Order).

ну тогда делайте считывание влияющего поля экрана "Тип аккаунта", и if-elseif - но в любом случае не брутфорс.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Пн, мар 04 2019, 18:30 
Ассистент
Ассистент

Зарегистрирован:
Чт, июн 01 2017, 12:58
Сообщения: 31
Code:
сел за пакетную обработку скриптинга - то лучше чтобы он лишних телодвижений с рабочим местом не совершал.
Да не, в процессе работы скрипта никто ничего не отключает.
Просто человек изначально может работать как с ноутбуком так и ноутбуком+монитор.

Цитата:
ну тогда делайте считывание влияющего поля экрана "Тип аккаунта"
Так и делал, но оно же накладывается на предыдущий пункт и при каждой комбинациии свернутых/развернутых секций будут свои номера экранов..
Можно конечно это все описать через if-else, но не очень приятно в этом копаться )
Ну и в теории разработчики могут добавить поле/кнопку и динамически присваемые номера экранов снова поменяются.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SAP GUI Scripting заполнение ME51N
СообщениеДобавлено: Чт, мар 07 2019, 07:11 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
Цитата:
может работать как с ноутбуком так и ноутбуком+монитор.


call Msgbox_of_stupidity("И монитор не трожь, зараза!", vbExclamation)
простое организационно-техническое решение :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB