.net SAPGUI解析GUI用户区 问题

.net SAPGUI解析GUI用户区 问题,.net,excel,vba,sap-gui,sap-dotnet-connector,.net,Excel,Vba,Sap Gui,Sap Dotnet Connector,目前在我工作的地方,我们正试图通过使用SAPGui、Excel和VBA自动执行某种重复性任务。通常,我们从SAP的TCodes中收集的大多数报告都显示有一个GUI用户区,这不容易、整洁和快速地解析 解决方案 无论如何,我根据特定类型的需求解析了这些类型的报告。因此,在我第一次尝试解析任何报告(显示为GuiUserArea)时,我想到了这样一个想法:将报告保存为未格式化文本,然后使用VBA(regex、Splits、text Length等)而不是使用GuiUserArea方法和属性来解析它是很容

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

解决方案 无论如何,我根据特定类型的需求解析了这些类型的报告。因此,在我第一次尝试解析任何报告(显示为GuiUserArea)时,我想到了这样一个想法:将报告保存为未格式化文本,然后使用VBA(regex、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?)

    • 由于以下原因,您的代码似乎有缺陷且速度缓慢:

      • 正在设置intItemsShown,然后将其用作循环中的一个步骤 并最终在循环中修改它
      • 您有一个嵌套循环 这只是进行了一次调试。打印,这可能会进一步降低应用程序的速度
      • 由于您似乎正在遍历对象的层次结构,因此 告诉我使用递归调用
        过程孩子,孩子的孩子。。。解析SAP输出 结构可能工作,但不干净,可能会成为 未来的维护噩梦
      我推荐的替代方案

      • 创建一个RFC,它将接受您的参数并返回原始数据 出类拔萃。此链接可能会给我一个良好的开端:
      • 创建web服务并从Excel VBA调用它
      • 创建网页 以HTML格式返回excel可以作为web查询访问的数据。看见 此链接作为开始:
      第一个选项需要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
      

      对于i=0到intVerticalScrollEndPoint步骤初始化演示“首先,感谢您发布您的问题。你为解决你的问题所做的努力帮助了我

      刚刚发现了一些可能帮助您处理水平和垂直滚动条的信息

      在我的例子中,我正在使用一个PFCGGuiUserArea,它是GuiUserArea类的一个对象。正如您在示例中指出的,这个类有两个参数,水平滚动条和垂直滚动条。通过这两个参数(它们是基于类创建的),您还可以获得最小、最大和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传递到该位置

      致以最良好的祝愿,
      Caio

      如果您在某个地方放置断点并查看vba代码中包含的数据以查找所需内容,会发生什么情况?有关详细说明,请参阅。我使用这种方法取得了巨大的成功。在你工作的地方有ABAP程序员吗?它们可以将您需要执行的重复任务包装到RFC函数中,或者编写代码并将其作为Web服务公开。您可以通过.NET connector连接到SAP,但您仍将受限于公开的SAP BAPi(这不是一件坏事,因为这些BAPi至少有很好的文档记录和支持)。您实际想要实现什么,它是否需要SAP中不存在的数据?我不清楚您为什么要在Excel/VBA中而不是在ABAP中使用BDC来执行此操作。@Esti:不幸的是,我们的工厂没有任何ABAP程序员,只是在公司级别,但他们拒绝接受此类请求。因此,我将尝试.NET连接器…@BryanCain:它只需要满足TCode要求的数据。我没有听说过BDC,但只要我有使用ABAP和BDC的特权,我就会尝试它。这根本不起作用,VBA代码需要一个对象。@MaximTeleguz这只是OP提供的代码的一部分。它嵌套在With End With块中。