SAP:SAPGUI Parse GuiUserArea

时间:2013-06-07 01:26:16

标签: .net excel vba excel-vba sap

问题!

目前在我工作的地方我们正试图通过 SAPGui Excel &的使用自动执行某种重复性任务。 VBA 。通常,我们从SAP的TCode收集的大多数报告都使用GuiUserArea显示,这不容易,整洁且快速解析。

解决方案!

无论如何,我设法根据某些类型的要求解析这些类型的报告。因此,我第一次尝试解析任何报告(显示为GuiUserArea)时,我想到了将报告保存为未格式化文本然后使用VBA解析它(Regexes,Splits)的想法很容易,Text Length,...)而不是使用GuiUserArea方法和属性。

请注意,使用此过程(保存文件)更容易,更快速地解析信息,但是使用 SAPGUI 对象只是为了保存文件而不是完成更复杂的任务,如解析信息......

使用GuiUserArea我提出了以下解决方案:

Sub ParseSAPGUI()
    Dim objSAPGui As Object
    Dim objApplication As Object
    Dim objConnection As Object
    Dim objSession As Object

    If (objSAPGui Is Nothing) Then
        Set objSAPGui = GetSAPGuiObject()
        Set objApplication = GetSAPGuiScriptEngine(objSAPGui)
    End If

    If (objConnection Is Nothing) Then
        Set objConnection = GetSAPGuiConnection(objApplication)
    End If

    If (objSession Is Nothing) Then
        Set objSession = GetSAPGuiSession(objConnection)
    End If

    With objSession

        Dim intItemsShown As Integer
        Dim intVerticalScrollEndPoint As Integer
        Dim intHorizontalScrollEndPoint As Integer

        ' Move to the end of the GuiUserArea
        .findById("wnd[0]/usr").HorizontalScrollbar.Position = 10000
        .findById("wnd[0]/usr").VerticalScrollbar.Position = 10000

        ' Store end points
        intVerticalScrollEndPoint = .findById("wnd[0]/usr").VerticalScrollbar.Position
        intHorizontalScrollEndPoint = .findById("wnd[0]/usr").HorizontalScrollbar.Position

        ' Move to the start of the GuiUserArea
        .findById("wnd[0]/usr").HorizontalScrollbar.Position = 0
        .findById("wnd[0]/usr").VerticalScrollbar.Position = 0

        ' Items per page being shown
        intItemsShown = objSession.findById("wnd[0]/usr").Children.Count - 1

        Dim i As Integer
        Dim n As Integer

        For i = 0 To intVerticalScrollEndPoint Step intItemsShown
            .findById("wnd[0]/usr").VerticalScrollbar.Position = i
            intItemsShown = objSession.findById("wnd[0]/usr").Children.Count - 1
            For n = 0 To intItemsShown
                Debug.Print .findById("wnd[0]/usr").Children.ElementAt(n).Text
            Next n
        Next i

    End With
End Sub

上面显示的代码完美,但以下语句除外:

  • 它几乎解析了所有类型的 GuiUserArea 报告,除了具有宽水平窗口的报告。我正在努力解决这些问题,但缺少 SAPGUI 对象的文档。

  • 对于大量数据来说速度慢而且速度很慢(因为我们正在使用VBA到COM对象)。尝试使用 .NET SAPGUI 对象而没有成功,以加快流程。

但最后,似乎 SAPGUI 对象并非设计用于这类任务。

问题!

  • 您是否有其他方法可以尝试解析GuiUserArea?
  • 您是否尝试使用高级编程语言(甚至是脚本语言)来与SAP而不是VBA进行交互?
  • 您知道是否有其他方式与SAP交互而不是 SAPGUI 对象(您是否尝试过SAP .NET Connector?)

~EderQuiñones

2 个答案:

答案 0 :(得分:2)

由于以下原因,您的代码似乎有些错误和缓慢:

  • 正在设置intItemsShown,然后将其用作循环中的步骤 并最终在循环中修改它。
  • 你有一个嵌套循环 这只是一个Debug.Print可能会进一步减慢您的应用程序
  • 由于您似乎正在遍历对象的层次结构,因此它似乎是 我认为使用递归调用更合适 处理孩子,孩子的孩子......解析SAP输出 结构可能会工作,但不干净,可能会成为一个 维护未来的噩梦。

我推荐的替代品

第一个选项需要SAP方面的ABAP。另外两个选项假定您有一个与SAP集成的Web服务器。

For i = 0 To intVerticalScrollEndPoint Step intItemsShown ' <--intItemsShown is being used here
    .findById("wnd[0]/usr").VerticalScrollbar.Position = i
    intItemsShown = objSession.findById("wnd[0]/usr").Children.Count - 1 ' and modified here
    For n = 0 To intItemsShown ' and used here again
        Debug.Print .findById("wnd[0]/usr").Children.ElementAt(n).Text
    Next n
Next i

答案 1 :(得分:2)

首先,感谢发布您的问题。你努力解决问题的努力正在帮助我。

刚刚找到一些可能有助于您处理水平和垂直滚动条的信息

就我而言,我正在使用PFCGGuiUserArea,这是GuiUserArea Class的一个对象。正如您在示例中所指出的,此类具有以下两个参数:Horizo​​ntalScrollbar和VerticalScrollbar。从这两个参数(它们是基于类创建的),您还有最小,最大和pagesize参数。

在垂直的情况下:

VerticalScrollbar Maximum: 349   '==> Total Rows of the GuiUserArea
VerticalScrollbar Minimum: 0     '==> First Row of the GuiUserArea
VerticalScrollbar Position: 1    '==> Position of the Cursor 
VerticalScrollbar Page Size: 34  '==> Total Rows per Page

在横向

的情况下
HorizontalScrollbar Maximum: 190      '==> Total of Columns available
HorizontalScrollbar Minimum: 0        '==> First Column Available
HorizontalScrollbar Position: 0       '==> Position of the cursor
HorizontalScrollbar Page Size: 255    '==> Total Columns per Page

因此,您可以改进指向此属性的代码,以便解决宽水平滚动。这将从系统获得准确的信息,因此您不必将1000传递到该位置。

最诚挚的问候, 卡欧