8

問題!

現在、私が働いている場所では、 SAPGuiExcel 、およびVBAを使用して、自動的に何らかの反復タスクを実行しようとしています。通常、SAP の TCodes から収集したレポートのほとんどは、簡単ではなく、簡潔で迅速に解析できない GuiUserArea で表示されます。

解決!

とにかく、特定の種類の要件に応じて、これらの種類のレポートを解析することができました。そのため、初めてレポート (GuiUserArea として表示) を解析しようとしたとき、レポートを書式設定されていないテキストとして保存し、VBA (Regexes、Splits 、テキストの長さ、...) 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 to COM Objectsを使用しているため、当然のことです)。プロセスを高速化するために、成功せずに.NETおよびSAPGUIオブジェクトを操作しようとしました。

しかし、結局のところ、SAPGUIオブジェクトはこの種のタスク用に設計されていないようです。

質問!

  • GuiUserArea を解析する他の方法はありますか?
  • SAP システムと対話するために、VBA の代わりに高レベルのプログラミング言語 (またはスクリプト言語) を使用しようとしましたか?
  • SAPGUIオブジェクトではなく、SAP システムと対話する他の方法があるかどうか知っていますか(SAP .NET コネクタを試しましたか?)
4

2 に答える 2

2

次の理由により、コードにバグがあり、遅いようです。

  • intItemsShown が設定されている場合、それをループ内のステップとして使用し、最終的にループ内で変更します。
  • Debug.Print を実行するネストされたループがあり、アプリの速度がさらに低下する可能性があります
  • オブジェクトの階層をトラバースしているように見えるので、再帰呼び出しを使用して
    子、子の子を処理する方が適切であるように思われます... SAP出力構造の解析は機能する可能性がありますが、クリーンではなく、おそらく今後のメンテナンスの悪夢。

私の推奨する代替案

最初のオプションでは、SAP 側で ABAP が必要です。他の 2 つのオプションは、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
于 2013-07-19T01:42:12.380 に答える