• 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版本,相信你已经有自己的答案了(*^_^*)。

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

     

  • 相关阅读:
    B树和B+树的介绍和对比,以及MySQL为何选择B+树
    设计模式:饿汉式和懒汉式单例模式(C++实现)以及日志系统的实现
    后端的add接口,能收到postman发来的请求,但是接收不到数据
    前端页面初步开发
    人工智能基础_机器学习040_Sigmoid函数详解_单位阶跃函数与对数几率函数_伯努利分布---人工智能工作笔记0080
    vue2中怎么使用css样式实现给元素穿衣的功能
    内存与IO访问原理
    LeetCode 1095. 山脉数组中查找目标值【数组,二分】1827
    Unirech腾讯云代充-通过VNC 登录腾讯云国际版Windows云服务器实例教程
    八种十倍提升API性能的方式
  • 原文地址:https://www.cnblogs.com/new-june/p/16479911.html