Dot-Net

SAPGUI 解析 GuiUserArea

  • January 11, 2021

問題!

目前在我工作的地方,我們正在嘗試使用SAPGuiExcelVBA自動執行某種重複性任務。通常,我們從 SAP 的 TCodes 收集的大多數報告都顯示為 GuiUserArea,這並不容易、整潔和快速解析。

解決方案!

無論如何,我設法根據某些類型的要求解析這些報告。因此,我第一次嘗試解析任何報告(顯示為 GuiUserArea)時,我想到了將報告保存為無格式文本然後使用 VBA(正則表達式、拆分, 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 對象)。嘗試使用*.NETSAPGUI*對象但沒有成功以加快程序。

但在路的盡頭, SAPGUI對像似乎不是為這類任務而設計的。

問題!

  • 您還有其他方法可以嘗試解析 GuiUserArea 嗎?
  • 您是否嘗試過使用高級程式語言(甚至腳本語言)來與 SAP 系統而不是 VBA 進行互動?
  • 您是否知道是否有任何其他方式與 SAP 系統互動而不是SAPGUI對象(您是否嘗試過 SAP .NET 連接器?)

由於以下原因,您的程式碼似乎有問題且速度慢:

  • 正在設置 intItemsShown,然後將其用作循環中的一個步驟,並最終在循環中對其進行修改。
  • 您有一個嵌套循環,它只執行 Debug.Print 可能會進一步減慢您的應用程序
  • 由於您似乎正在遍歷對象的層次結構,因此在我看來,使用遞歸呼叫來

處理孩子、孩子的孩子會更合適……解析 SAP 輸出結構可能有效但不干淨,可能會成為未來維護的噩夢。

我推薦的替代品

  • 創建一個 RFC,它將獲取您的參數並將原始數據返回到 Excel。這個連結可能是一個好的開始: http ://www.vbforums.com/showthread.php?337408-VB-and-SAP-Integration
  • 創建 Web 服務並從 Excel VBA 呼叫它
  • 創建一個網頁,該網頁以 HTML 格式返回數據,excel 可以作為 Web 查詢訪問這些數據。請參閱此連結作為開始:http ://www.techrepublic.com/article/pull-data-into-microsoft-excel-with-web-queries/ 。

第一個選項需要 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

引用自:https://stackoverflow.com/questions/16974871