VBA驅動SAP GUI完成介面元素值初始化

2022-07-15 09:00:45

     小爬日常利用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版本,相信你已經有自己的答案了(*^_^*)。

   歡迎掃碼關注我的公眾號 獲取更多爬蟲、資料分析的知識!