查找列表末尾的算法 (SAP GUI)
Algorithm for finding end of a list (SAP GUI)
我正在编写一个脚本,用于将元素添加到 SAP GUI 屏幕中的列表。现在,似乎在使用 SAP GUI 时,没有任何东西 "exists" 除非它实际出现在屏幕上,所以第一步涉及找到列表的末尾。
我通过滚动浏览每个元素并检查它是否为空白来完成此操作。
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
但是,对于非常大的现有列表,这需要很长时间。我试图找出一种方法来更快地找到终点。一些 truths/limitations 我知道:
- 我假设我不知道列表长度。
- 我无法命令
verticalScrollbar.position
超出
的结尾
名单。对于前。如果列表包含 62 个元素,.verticalScrollbar.Position = 100
将不起作用。
- 在上述示例中,SAP 不会抛出错误。什么都没有发生,然后执行下一行代码。
- 所有对元素的引用都是相对于它们在屏幕上的位置。例如,如果我向下滚动 5 个位置,则整个列表的第 6 个元素实际上会索引为 1。
- 另一方面,
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
迭代一个。
是否有普遍接受的更好的方法来完成这种 'search'?
任何输入表示赞赏。
谢谢
我的建议:
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
此致,
脚本人
只为走到最后
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
我正在编写一个脚本,用于将元素添加到 SAP GUI 屏幕中的列表。现在,似乎在使用 SAP GUI 时,没有任何东西 "exists" 除非它实际出现在屏幕上,所以第一步涉及找到列表的末尾。
我通过滚动浏览每个元素并检查它是否为空白来完成此操作。
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
但是,对于非常大的现有列表,这需要很长时间。我试图找出一种方法来更快地找到终点。一些 truths/limitations 我知道:
- 我假设我不知道列表长度。
- 我无法命令
verticalScrollbar.position
超出
的结尾 名单。对于前。如果列表包含 62 个元素,.verticalScrollbar.Position = 100
将不起作用。 - 在上述示例中,SAP 不会抛出错误。什么都没有发生,然后执行下一行代码。
- 所有对元素的引用都是相对于它们在屏幕上的位置。例如,如果我向下滚动 5 个位置,则整个列表的第 6 个元素实际上会索引为 1。
- 另一方面,
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
迭代一个。
是否有普遍接受的更好的方法来完成这种 'search'? 任何输入表示赞赏。 谢谢
我的建议:
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
此致, 脚本人
只为走到最后
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