Luis Vásquez
Luis Vásquez

Reputation: 135

The control could not be found by id. SAP GUI bug?

I am trying to automate SAP data extraction using scripting. The problem I am facing is a recorded script in SAP isn't working when I'm running it, when I use findById("id") method it comes out that cannot be found, however the tabs are there.

The idea is to move between the tabs (using session.findById("id").Select) to extract info in that panels. Use a list of Purchase Orders (PO's), make a loop and extract the information, it's simple.

However, these tabs aren't found randomly. Sometimes it works, sometimes it is not found. All PO's (if I do it manually) have tabs with the data, but in the script it doesn't work.

For example:

The red box is the tabs that I am trying to select

SAP:

Output of the recorded script (just moving between tabs):

    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]").resizeWorkingPane 183,24,false
   
session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0015/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT13").select
' Extract info
session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0019/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT15").select
' Extract info
session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0015/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT18").select
' Extract info

Error:

The control could not be found by id.

enter image description here

I'm using:

enter image description here

My theory, the tab is hidden and doesn't find it, that I would have to use the arrows to move, however when I use the arrows at the time of making the script recording, it simply doesn't add them to the code.

Sorry for my English, and thanks in advance for your time.

Upvotes: 4

Views: 20076

Answers (3)

SAP RPA guy
SAP RPA guy

Reputation: 1

Problem is that SAP changes the SAPLMEGUI:00XX number all the time. You need to figure it out first. A way to do this is to find it through:

Session.findById("wnd[0]/usr/").Children(0).ID 

The last four digits of the return string are the ID you are looing for. Use it do address the table and tabs, then it works.

Upvotes: 0

Scott Ridings
Scott Ridings

Reputation: 844

Ah yes, my favorite SAP screen: ME23N. Who knows what the SAPLMEGUI:00XX will be! But, if you find the element by it's name you'll never run into this problem. Additionally, this solves the problem of the tab you want not being there; because, depending on the line item of the PO, who knows what tabs will be available.

Here's how I get over this every time, without fail.

In your sub procedure use the function below. If the tab is there it will select it and return true and you can continue extracting your data. You need the tab text and the name of the tab strip.

You can find the name of the tab strip easily. Look at what has been recorded. It has the "tabs" prefix.

session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0015/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT13")

Public Sub Main()

    If IsTabThere("ITEM_DETAIL", "Account Assignment") = True Then
        ' Extract info
    End If

    If IsTabThere("ITEM_DETAIL", "Purchase Order History") = True Then
        ' Extract info
    End If

End Sub

Public Function IsTabThere(ByVal tabStripName As String, ByVal tabText As String) As Boolean

    Dim userArea As Object
    Dim tabStrip As Object
    Dim tabToSelect As Object

    Set userArea = session.FindById("wnd[0]/usr")
    Set tabStrip = userArea.FindByName(tabStripName, "GuiTabStrip").Children

    For Each tabToSelect In tabStrip
        If tabToSelect.Text = tabText Then
            tabToSelect.Select
            IsTabThere = True

            ' Will exit here if the tab was selected and return true
            Exit Function
        End If
    Next

    IsTabThere = False
End Function

Hope this makes your day. Good luck!

If your interested in making your script more dynamic checkout my answer on this post. I explain how to get started using the SAP GUI Scripting API.

how-to-run-sap-gui-script-from-excel-macro

Upvotes: 2

ScriptMan
ScriptMan

Reputation: 1625

I can only offer a workaround on this phenomenon.

for example:

...
for i = 1 to 99
    on error resume next
    session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:00" & right("0" & cstr(i),2) & "/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT13").select
    if err.number = 0 then exit for
    on error goto 0
    next
    on error goto 0
' Extract info
for i = 1 to 99
    on error resume next
    session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:00" & right("0" & cstr(i),2) & "/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT15").select
    if err.number = 0 then exit for
    on error goto 0
    next
    on error goto 0
' Extract info
for i = 1 to 99
    on error resume next
    session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:00" & right("0" & cstr(i),2) & "/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT18").select
    if err.number = 0 then exit for
    on error goto 0
    next
    on error goto 0
' Extract info

Regards, ScriptMan

Upvotes: 4

Related Questions