【问题标题】:The control could not be found by id. SAP GUI bug?无法通过 id 找到控件。 SAP GUI 错误?
【发布时间】:2019-08-02 17:42:12
【问题描述】:

我正在尝试使用脚本自动提取 SAP 数据。我面临的问题是 SAP 中的记录脚本在我运行时无法正常工作,当我使用 findById("id") 方法时,它会出现无法找到,但是选项卡在那里。

想法是在选项卡之间移动(使用session.findById("id").Select)以提取该面板中的信息。使用 po 的列表,循环并提取信息,很简单。

但是,这些标签不是随机找到的。有时它有效,有时它找不到。所有 PO(如果我手动执行)都有包含数据的选项卡,但在脚本中它不起作用。

例如:

红色框是我要选择的选项卡 录制脚本的输出(只是在选项卡之间移动):

    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

错误:

我正在使用:

我的理论,选项卡被隐藏并且找不到它,我必须使用箭头移动,但是当我在录制脚本时使用箭头时,它根本不会添加它们到代码。

对不起我的英语,并提前感谢您的时间。

【问题讨论】:

  • 我没有测试,但是如果你得到了 GuiTabStrip 对象,我猜它的所有 GuiTab 对象的列表都包含在 Children 属性中(这么说,我阅读了帮助文件 SAPGUIScripting.chm随 SAP GUI 安装提供)

标签: automation vbscript sap-gui


【解决方案1】:

我只能针对这种现象提供一种解决方法。

例如:

...
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

问候, 脚本人

【讨论】:

  • 是我让它工作的唯一方法。非常感谢,问候。
【解决方案2】:

啊,是的,我最喜欢的 SAP 屏幕:ME23N。谁知道 SAPLMEGUI:00XX 会是什么!但是,如果您按名称查找元素,您将永远不会遇到这个问题。此外,这解决了您不想出现的选项卡的问题;因为,根据采购订单的行项目,谁知道哪些选项卡可用。

这就是我每次克服这个问题的方法,没有失败

在您的子程序中使用下面的函数。如果选项卡在那里,它将选择它并返回 true,您可以继续提取数据。您需要标签文本标签条的名称

您可以轻松找到标签条的名称。看看记录了什么。它有“tabs”前缀。

session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0015/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/标签ITEM_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

希望这会让你开心。祝你好运!

如果您有兴趣使您的脚本更具动态性,请查看我在这篇文章中的回答。我将解释如何开始使用 SAP GUI Scripting API。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    • 1970-01-01
    • 2016-01-16
    • 2017-02-03
    相关资源
    最近更新 更多