0

我正在编写一个脚本,将元素添加到 SAP GUI 屏幕中的列表中。现在,似乎在使用 SAP GUI 时,除非它实际上在屏幕上,否则什么都“不存在”,因此第一步涉及查找列表的末尾。

我通过滚动每个元素并检查它是否为空白来完成此操作。

Do While Not blank
If session.findById("wnd[1]/usr/tblSAPLCZDITCTRL_4010/ctxtMAPL-MATNR[2,0]").Text = "" Then blank = True
session.findById("wnd[1]/usr/tblSAPLCZDITCTRL_4010").verticalScrollbar.Position = i
i = i + 1
Loop

但是,对于非常大的现有列表,这需要很长时间。我正在想办法更快地找到结局。我知道的一些事实/限制:

  1. 我假设我不知道列表长度。
  2. 我不能指挥verticalScrollbar.position太远超出
    列表的末尾。例如。如果列表包含 62 个元素,.verticalScrollbar.Position = 100则不起作用。
  3. 在上述示例中,SAP 不会引发错误。什么都没有发生,然后执行下一行代码。
  4. 所有对元素的引用都与它们在屏幕上的位置有关。例如,如果我向下滚动 5 个位置,整个列表的第 6 个元素实际上将索引为 1。
  5. 另一方面verticalScrollbar.Position是绝对的

我正在考虑执行以下操作(在非常伪代码中):

i = 0
do while scrolled = true
    scrolled = false
    a = GUIlist[0]
    verticalScrollbar.Position = i + 1000
    b = GUIlist[0]
    'check to see the first element shown has changed
    if a <> b then 
        scrolled = true
        i = i + 1000
    end if
loop

do while scrolled = true
    scrolled = false
    a = GUIlist[0]
    verticalScrollbar.Position = i + 500
    b = GUIlist[0]
    if a <> b then 
        scrolled = true
        i = i + 500
    end if
loop

...依此类推,直到我迭代i一个。

是否有一种普遍接受的更好的方式来进行这种“搜索”?任何输入表示赞赏。谢谢

4

2 回答 2

3

只为走到最后

max_scrollbar = session.findById("wnd[1]/usr/tblSAPLCZDITCTRL_4010").verticalScrollbar.Maximum ' Get the maximum scrollbar value
session.findById("wnd[1]/usr/tblSAPLCZDITCTRL_4010").verticalScrollbar.Position = max_scrollbar  ' Go to the end 
于 2017-06-12T15:10:37.907 回答
3

我的建议:

session.findById("wnd[0]").sendVKey 83 
myPosition = session.findById("wnd[1]/usr/tblSAPLCZDITCTRL_4010").verticalScrollbar.Position
do 
if session.findById("wnd[1]/usr/tblSAPLCZDITCTRL_4010/ctxtMAPL-MATNR[2,0]").Text = ""  then exit do
myPosition = myPosition + 1
session.findById("wnd[1]/usr/tblSAPLCZDITCTRL_4010").verticalScrollbar.Position = myPosition
loop 
msgbox myPosition

问候, ScriptMan

于 2016-10-19T11:33:23.133 回答