4

VBA驱动SAP GUI完成界面元素值初始化 - NewJune

 1 year ago
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执行后的结果并非我们预期的那样,如下图所示。

1412260-20220715003336734-329665135.png

  针对这个问题,大部分童鞋很容易想到的方案是:把每个文本框的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版本,相信你已经有自己的答案了(*^_^*)。

   欢迎扫码关注我的公众号 获取更多爬虫、数据分析的知识!

%E5%85%AC%E4%BC%97%E5%8F%B7%E4%BA%8C%E7%BB%B4%E7%A0%81.bmp

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK