GUI脚本。 如何不每次遍历对象树?

2020-08-25 12:51发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我有几个问题

1。 每次我想访问特定字段时,是否都可能不遍历对象树?

到目前为止,我使用Object.children.item()等等。 但是,无论如何,SAP似乎遍历了所有要素。

我认为这样做会更好,但分析后似乎没有。

如何避免这种情况? 保留某种缓存以直接访问元素

2。 某些GUI事件无效:命中,错误。

我从Session对象(Session_Hit等)中捕获了它们。

CreateSession和DestroySession可以正常工作。

这个想法与内置记录器相同:侦听用户事件并记录脚本,但是有效载荷不同(试图避免连续会话。FindById...并使元素名称易于阅读)。

提前谢谢!

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我有几个问题

1。 每次我想访问特定字段时,是否都可能不遍历对象树?

到目前为止,我使用Object.children.item()等等。 但是,无论如何,SAP似乎遍历了所有要素。

我认为这样做会更好,但分析后似乎没有。

如何避免这种情况? 保留某种缓存以直接访问元素

2。 某些GUI事件无效:命中,错误。

我从Session对象(Session_Hit等)中捕获了它们。

CreateSession和DestroySession可以正常工作。

这个想法与内置记录器相同:侦听用户事件并记录脚本,但是有效载荷不同(试图避免连续会话。FindById...并使元素名称易于阅读)。

提前谢谢!

付费偷看设置
发送
7条回答
clever101
1楼-- · 2020-08-25 13:38

在Windows的SAP GUI中,"系统"菜单中有"记录器",用于记录您的输入并生成VBScript。

它生成以下几行:

设置字段 = FindById("/img/app/con [0]/ses [0]/wnd [0]/usr/lblRS38M-PROGRAMM")
haha101010
2楼-- · 2020-08-25 13:40

@ stefan.schnell您好Stefan。 看来只有您一个人可以在那帮我:)

callcenter油条
3楼-- · 2020-08-25 13:27

你好康拉德,

非常有趣的问题和非常有趣的观点。

1 。 我从来没有做过这样的分析。 这是我的示例:

 TStart = Timer()
 对于i = 1至100
   session.findById(" wnd [0]/usr/txtRSYST-MANDT")。Text = CStr(i)
 下一个
 TEnd = Timer()
 MsgBox CStr(TEnd-TStart)'结果0,8

 设置字段= session.findById(" wnd [0]/usr/txtRSYST-MANDT")
 TStart = Timer()
 对于i = 1至100
   Field.Text = CStr(i)
 下一个
 TEnd = Timer()
 MsgBox CStr(TEnd-TStart)'结果0,4
 

使用对象而不是使用ID为findById的对象快大约两倍。

哇...

Sandra Rossi ,然后给出答案,将UI元素缓存在对象中。 我不知道另一种方式。

2。 hit事件适用于以下示例。

 Sub ses_Error(Sess,ErrID,Desc1,Desc2,Desc3,Desc4)
   MsgBox(Desc1&vbCrLf&Desc2&vbCrLf&Desc3&vbCrLf&Desc4)
 结束子

 Sub ses_Hit(Sess,Comp,IObj)
   MsgBox(IObj)'完美的作品
 结束子

 设置SapGuiAuto = GetObject(" SAPGUI")
 设置应用程序= SapGuiAuto.GetScriptingEngine
 设置连接= application.Children(0)
 设置会话= connection.Children(0)

 如果IsObject(WScript)然后
   WScript.ConnectObject会话" ses_"
 万一

 '-要使用点击事件,必须设置此属性-----------------
 session.findById(" wnd [0]")。ElementVisualizationMode = True

 MsgBox"按一下即可结束"
 

我无法模拟错误事件,但是我认为此代码示例有效。

如何在运行的脚本中模拟对SAP GUI ActiveX控件的访问拒绝?/p>

让我们知道您的经验。

最诚挚的问候
Stefan

打个大熊猫
4楼-- · 2020-08-25 13:38

如果您在问题/答案下发表评论并希望定位 除了问题/答案作者以外的其他人,唯一的解决方案是复制/粘贴其超链接的名称,以便该人收到警告(注意:@不起作用)

Tong__Ming
5楼-- · 2020-08-25 13:26

大家好。 很抱歉收到这么晚的答复。

似乎有误会。

设置ScreenA = Session.FindById(" BLA")

设置ScreenB = Session.FindById(" BLABLA")

ScreenB.DoubleClick进入了第二个屏幕。

ScreenB.MoveBack'进入了第一个屏幕。

ScreenA.Text'对象不再可用,因为SAP已清除引用。

设置ScreenA = Session.FindById(" BLA")'因此,您必须再次查找它,这显然很昂贵。 我经常遇到这种循环操作,您必须在两个屏幕之间切换。

所以最初的问题是,在屏幕切换之间如何保持对ScreenA的引用?

我认为这是主机应用程序(SAP)的局限性,因此应从那里更改。 但是也许存在一些我不知道的解决方法。

SAP小黑
6楼-- · 2020-08-25 13:39

https: //people.sap.com/stefan.schnell 您好Stefan。 看来只有您一个人可以在那帮我:)

一周热门 更多>