VBA驱动SAP GUI完成界面元素值初始化 - NewJune
source link: https://www.cnblogs.com/new-june/p/16479911.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
VBA驱动SAP GUI完成界面元素值初始化
小爬日常利用VBA完成SAP GUI自动化时,经常被这个问题困扰:我们进入一个事务代码界面时,如FBL1N(供应商行项目显示),很多的 GuiTextField(文本框)对象、GuiCheckBox(复选框)对象都已经有值了。我们如果忘了对这些对象的值初始化,可能SAP执行后的结果并非我们预期的那样,如下图所示。
针对这个问题,大部分童鞋很容易想到的方案是:把每个文本框的text属性设为空字符串,把每个复选框的勾选状态都设置为【不勾选】,具体代码如下:
session.findById("wnd[0]/usr/ctxtRACCT-LOW").text = "" '文本框初始化 session.findById("wnd[0]/usr/chkX_SHBV").selected = false 'checkBox值初始化
该方法未尝不可,但是需要在SAP脚本录制阶段,对每个这类元素都初始化并记录后台脚本,属实麻烦,也容易产生遗漏。
还有一个方法是,关闭SAP连接,要求用户重新登录后,再使用我们的脚本工具,此时SAP已经对会话界面的参数完成了初始化。可该方法如果站在用户角度来思考,难免让人觉得有些非人性化,就跟解决不了别人电脑问题,就让别人重启电脑试下的感觉,小爬总觉得它不应该成为我们的最优解。
小爬翻阅了N多资料,苦心人天不负,总算总结出了更通用的方法:对会话元素层层往下穷举子元素,如果发现子元素为文本框,就将text属性置为"",如果发现子元素为复选项,就将其selected属性改为false即可。具体用VBA代码实现的话,还需要知道如何写递归函数,示例如下:
Sub SessionElementInitialization() '对界面元素的值进行初始化,文本框值置为空,复选框状态改为【未勾选】 Dim UserArea As Object If Not IsObject(SAPApplication) Then Set SapGuiAuto = GetObject("SAPGUI") Set SAPApplication = SapGuiAuto.GetScriptingEngine End If If Not IsObject(Connection) Then Set Connection = SAPApplication.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 SAPApplication, "on" End If Set UserArea = session.findByID("wnd[0]/usr") Clear_Fields UserArea MsgBox "已完成!" End Sub '_______________________________ Sub Clear_Fields(Area As Object) Set SAPApplication = GetObject("SAPGUI").GetScriptingEngine Dim Obj As Object Dim NextArea As Object On Error Resume Next For i = 0 To Area.Children.Count - 1 Set Obj = Area.Children(CInt(i)) If Obj.ContainerType = True Then If Obj.Children.Count > 0 Then Set NextArea = SAPApplication.findByID(Obj.ID) Clear_Fields NextArea End If End If If Obj.Type Like "*TextField*" And Obj.changeable = True Then Obj.Text = "" ElseIf Obj.Type = "GuiCheckBox" Then Obj.Selected = False End If Next i End Sub
相信你们已经被这个问题困扰很久了,赶紧用上面的方法试下吧。对了,如果你是python爱好者,如何把上面这段VBA脚本转成python版本,相信你已经有自己的答案了(*^_^*)。
欢迎扫码关注我的公众号 获取更多爬虫、数据分析的知识!
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK