小爬日常利用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版本,相信你已經有自己的答案了(*^_^*)。
歡迎掃碼關注我的公眾號 獲取更多爬蟲、資料分析的知識!