Текущее время: Сб, июл 19 2025, 06:36

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Поиск элемента в древе (SAP Gui скрипт)
СообщениеДобавлено: Ср, мар 27 2019, 14:58 
Начинающий
Начинающий

Зарегистрирован:
Ср, мар 27 2019, 13:15
Сообщения: 5
Привет форумчане!
Столкнулся с проблемой при попытке автоматизировать стандартное действие в САП.
Требуется в окне "карточки абонента" найти строку с оборудованием и присвоить определённое значение полю.
Изображение
Присвоение действие элементарное с точки зрения программирования, а вот поиск...
Проблема в том, что с точки зрения скрипт-рекордера все элементы древа обрабатываются одинаково:
Code:
session.findById("wnd[0]/shellcont/shell/shellcont/shell").DoubleclickNode "000000001964"

Различаются только цифры в конце - это порядковый номер элемента и он не зависит от уровня вложения, только от номера строки начиная с верха древа.

Однако на самом деле элементы древа совершенно разные и реакция на их открытие тоже, открывается новое окно, иногда нет.
Я написал код с контролем ошибок, который перебором находит нужный пункт, однако из-за того что вложенных элементов в древе может быть больше тысячи (при том что единиц оборудования больше десяти тысяч) процесс поиска очень долгий.
Самый очевидный вариант - искать по наименованию элемента типа 853625 - СЭ ЦЭ6803В 220/380В 10-100А 1(011070087001242), где в скобках как раз идентификатор оборудования по которому ищется совпадение, но как его запросить?


Порывшись на форуме попытался написать код, но результат нулевой.
Code:
mycontrol = oSession.findByName("wnd[0]/shellcont/shell/shellcont/shell", "000000000005")
A = mycontrol.Text


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


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Поиск элемента в древе (SAP Gui скрипт)
СообщениеДобавлено: Ср, мар 27 2019, 15:03 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
а транзакция какая (картинка не открывается ваша)?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Поиск элемента в древе (SAP Gui скрипт)
СообщениеДобавлено: Ср, мар 27 2019, 15:09 
Начинающий
Начинающий

Зарегистрирован:
Ср, мар 27 2019, 13:15
Сообщения: 5
Код запускается из VBA Excel

Code:
Sub ÇàíåñåíèåÂÑÀÏ()
    Set myBook = ActiveWorkbook
    Set mySh = myBook.Sheets("Çàÿâêè")
       If Not IsObject(Application1) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set Application1 = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
   Set Connection = Application1.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 Application1, "on"
End If
'ñ÷èòàåì êîëè÷åñòâî ñòðîê â òàáëèöå
    col = SearchLastRow1(mySh.Range("A:A"))
    'iRow = 1

    For iRow = 2 To col
    'ñ÷èòûâàåì äàííûå èç òàáëèöû Excel íà÷èíàÿ ñî 2 ñòðîêè
        No = mySh.Range("A" + CStr(iRow)).Text
        UST = mySh.Range("B" + CStr(iRow)).Text
        PrUstStar = mySh.Range("C" + CStr(iRow)).Text
        Nomer = mySh.Range("D" + CStr(iRow)).Text
        PrUstNov = mySh.Range("E" + CStr(iRow)).Text

If No <> "" Then
'âûáèðàåì îáðàçåö çàÿâêè
session.findById("wnd[0]").resizeWorkingPane 128, 39, False
session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").doubleClickNode "F00007"
session.findById("wnd[0]/usr/subPARAMS:/MRSKS/ZISU_FIND:0101/ctxtP_BUKRS").Text = "5500"
session.findById("wnd[0]/usr/subPARAMS:/MRSKS/ZISU_FIND:0101/ctxtP_BUKRS").caretPosition = 4
session.findById("wnd[0]/usr/tabsTAB_MAIN/tabpTAB_MAIN_FC3").Select
session.findById("wnd[0]/usr/tabsTAB_MAIN/tabpTAB_MAIN_FC3/ssubMAIN_SCA:/MRSKS/ZISU_FIND:0202/cmbLT_PARAM-PUNAL").Key = "1"
session.findById("wnd[0]/usr/tabsTAB_MAIN/tabpTAB_MAIN_FC3/ssubMAIN_SCA:/MRSKS/ZISU_FIND:0202/cmbLT_PARAM-PUNAL").SetFocus
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/tabsTAB_MAIN/tabpTAB_MAIN_FC3/ssubMAIN_SCA:/MRSKS/ZISU_FIND:0202/cmbLT_PARAM-STATE").Key = "1"
session.findById("wnd[0]/usr/tabsTAB_MAIN/tabpTAB_MAIN_FC3/ssubMAIN_SCA:/MRSKS/ZISU_FIND:0202/subSUB1:/MRSKS/ZISU_FIND:0400/txtS_CNUM-LOW").Text = Nomer
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[0]/usr/cntlGO_ALV_CONT_OIG/shellcont/shell").currentCellColumn = "ANLAGE"
session.findById("wnd[0]/usr/cntlGO_ALV_CONT_OIG/shellcont/shell").clickCurrentCell
U = 2
UStx = 0
On Error Resume Next

Do
U = U + 1
Err.Clear
session.findById("wnd[0]/shellcont/shell/shellcont/shell").doubleClickNode Dlina(U) & U
If Err.Number <> 0 Then session.findById("wnd[0]/tbar[0]/btn[3]").press
Err.Clear
UStx = session.findById("wnd[0]/usr/subCUST_SCREEN:/MRSKS/SAPLISU_ARM:1002/txtGS_ANLAGE-ANLAGE").Text
    If Err.Number = 0 Then
        If UST = UStx Then
            Do
            U = U + 1
            Err.Clear
            session.findById("wnd[0]/shellcont/shell/shellcont/shell").doubleClickNode Dlina(U) & U
                 If Err.Number <> 0 Then
                    session.findById("wnd[0]/tbar[0]/btn[3]").press
                    Else
                        Err.Clear
                        NumerX = session.findById("wnd[0]/usr/subCUST_SCREEN:/MRSKS/ISU_ARM_LOGIKNR:1003/txtGS_LOGIKNR-CUST_FIELD-COUNTERNUMBER").Text
                              If Err.Number = 0 Then
                                If Nomer = session.findById("wnd[0]/usr/subCUST_SCREEN:/MRSKS/ISU_ARM_LOGIKNR:1003/txtGS_LOGIKNR-CUST_FIELD-COUNTERNUMBER").Text Then
                                            session.findById("wnd[0]/usr/subCUST_SCREEN:/MRSKS/ISU_ARM_LOGIKNR:1003/ctxtGS_LOGIKNR-CUST_FIELD-INSTALLPROG").Text = PrUstNov
                                            session.findById("wnd[0]/tbar[0]/btn[11]").press
                                            session.findById("wnd[1]/tbar[0]/btn[0]").press
                                            session.findById("wnd[1]/tbar[0]/btn[0]").press
                                            session.findById("wnd[0]/tbar[0]/btn[3]").press
                                            session.findById("wnd[0]/tbar[0]/btn[3]").press
                                End If
                            End If
                    End If
            Loop While Nomer <> NumerX
         End If
       End If
Loop While UStx <> UST
On Error GoTo 0
    End If
    Next
MsgBox ("Ãîòîâî!")
End Sub
Function SearchLastRow1(rang As Range)
    SearchLastRow1 = rang.Cells.Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row
End Function
Function FullFileName(PartName As String) As String
FullFileName = ""
For Each wb In Workbooks
If InStr(1, LCase(wb.Name), LCase(PartName)) > 0 Then
FullFileName = wb.Name
End If
Next
End Function
Function Dlina(X) As String
If X > 9999 Then
Dlina = "0000000"
Else
    If X > 999 Then
    Dlina = "00000000"
    Else
        If X > 99 Then
        Dlina = "000000000"
        Else
                If X > 9 Then
                Dlina = "0000000000"
                Else
                Dlina = "00000000000"
                End If
        End If
    End If
End If
End Function


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Поиск элемента в древе (SAP Gui скрипт)
СообщениеДобавлено: Ср, мар 27 2019, 15:11 
Начинающий
Начинающий

Зарегистрирован:
Ср, мар 27 2019, 13:15
Сообщения: 5
pberezin написал:
а транзакция какая (картинка не открывается ваша)?


Название транзакции в статусе - "/ISU_CARD"

Я так понимаю форма нестандартная...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Поиск элемента в древе (SAP Gui скрипт)
СообщениеДобавлено: Чт, мар 28 2019, 08:11 
Начинающий
Начинающий

Зарегистрирован:
Ср, мар 27 2019, 13:15
Сообщения: 5
Попробую спросить более конкретно, благо после штудирования различных форумов появилось понимание. Какой метод или свойство запрашивает подпись элемента в графическом интерфейсе из приведённых в таблице?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Поиск элемента в древе (SAP Gui скрипт)
СообщениеДобавлено: Чт, мар 28 2019, 10:28 
Начинающий
Начинающий

Зарегистрирован:
Ср, мар 27 2019, 13:15
Сообщения: 5
Штудирование справки и перебор методов из GuiTree привел меня к такой вещи:
text1 = session.findById("wnd[0]/shellcont/shell/shellcont/shell").GetNodeTextByKey("00000000123")

где GetNodeTextByKey() - запрос подписи элемента дерева по его Key

Теперь тот же перебор, но не с заходом в каждую позицию, а с чтением имени позиции и сверкой, что меня полностью устраивает.
Всем спасибо за внимание, вопрос закрыт


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

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


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

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot]


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

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