web-dev-qa-db-ja.com

C#でSAP GUIを自動化する方法

C#言語を使用してSAP GUIウィンドウを自動化したい。私はVBScriptでそれを行うことができますが、コードの再利用は恐ろしいです。さらに、80個以上のプロセスを実行する代わりに、スレッドを使用したいと思います。これを行う方法のドキュメントとサンプルはどこにありますか?これが私が使用しているコードです。基本的に、私が直面している問題は、SAP GUIへの接続を確立し、その場でSAP GUIを作成し、トランザクションを開始し、いくつかのフィールドにテキストを入力する方法です。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using White.Core.Factory;
using White.Core.UIItems.Finders;
using White.Core.InputDevices;
using System.Threading;
using System.Diagnostics;
using SAP.Connector;
using SAP;


namespace SAP_Automation
{
    class Program
    {
        public static void Main(string[] args)
        {
            string ExeSourceFile = @"C:\Program Files\SAP\SapSetup\setup\SAL\SapLogon.s8l";
            White.Core.Application _application;
            White.Core.UIItems.WindowItems.Window _mainWindow;

            var c = SAP.Connector.Connection.GetConnection("**");
            var c = new SAPConnection("ASHOST=*; GWHOST=*; GWSERV=*; ASHOST=*; SYSNR=00;USER=user; PASSWD=**;");
            c.Open();


            }
        }
    }
}

ご覧のとおり、接続を作成できますが、GUIへのセッションを作成してフィールドにテキストを入力する方法を知りません。どんな例やサンプルも歓迎します。

22
Luke101

これはネクロスレッディングかもしれませんが、私は同じような状況で働いていました。 C#で記述された他の自社開発の自動化プラットフォームと統合できるテスト目的でSAP GUI自動化が必要でした。私は、SAPの自動化レイヤーの基盤として使用できるGUI自動化用のSAP提供ライブラリーを利用した1つのソリューションの提案を作成するのを手伝いました。

SAPファイルのインストールに次のファイルが存在しますか? x:\ Program Files\SAP\FrontEnd\SAPGui\sapfewse.ocx?

その場合、Visual Studio(またはIDE使用しているもの))に参照として追加します。基本的には、相互作用を可能にする多数のSAP固有のオブジェクトを含むクラスライブラリです。必要なもののほとんどをSAP GUIから公開するため、非常に効果的です。他の試みで、SAPの多くのオブジェクトが利用できないことがわかりました。

これは、私がやった初期の概念実証です。接続文字列を使用してSAPを起動し、資格情報を入力して、トランザクションコードに移動します。

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using SAPFEWSELib;

namespace SAPGuiAutomated
{
//created a class for the SAP app, connection, and session objects as well as for common methods. 
    public class SAPActive
    {
        public static GuiApplication SapGuiApp { get; set; }
        public static GuiConnection SapConnection { get; set; }
        public static GuiSession SapSession { get; set; }

        public static void openSap(string env)
        {
            SAPActive.SapGuiApp = new GuiApplication();

            string connectString = null;
            if (env.ToUpper().Equals("DEFAULT"))
            {
                connectString = "1.0 Test ERP (DEFAULT)";
            }
            else
            {
                connectString = env;
            }
            SAPActive.SapConnection = SAPActive.SapGuiApp.OpenConnection(connectString, Sync: true); //creates connection
            SAPActive.SapSession = (GuiSession)SAPActive.SapConnection.Sessions.Item(0); //creates the Gui session off the connection you made
        }

        public void login(string myclient, string mylogin, string mypass, string mylang)
        {
            GuiTextField client  = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-MANDT", "GuiTextField");
            GuiTextField login  = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-BNAME", "GuiTextField");
            GuiTextField pass  = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-BCODE", "GuiPasswordField");
            GuiTextField language  = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-LANGU", "GuiTextField");

            client.SetFocus();
            client.text = myclient;
            login.SetFocus();
            login.Text = mylogin;
            pass.SetFocus();
            pass.Text = mypass;
            language.SetFocus();
            language.Text = mylang; 

            //Press the green checkmark button which is about the same as the enter key 
            GuiButton btn = (GuiButton)SapSession.FindById("/app/con[0]/ses[0]/wnd[0]/tbar[0]/btn[0]");
            btn.SetFocus(); 
            btn.Press();

        }
    }
    //--------------------------//
    //main method somewhere else 
    public static void Main(string[] args)
    {
        SAPActive.openSAP("my connection string");
        SAPActive.login("10", "jdoe", "password", "EN");
        SAPActive.SapSession.StartTransaction("VA03");
    }

あなたは、この主題に関する多くのドキュメントがありません。以下は、私が始めるのに役立ついくつかのソースです

-計画の元のソース http://scn.sap.com/thread/1729689

-APIのドキュメント(VBとjavascriptの場合、一般的なルールとオブジェクトは同一)。SAPGUIランタイム階層の一部を確実に読んでください。多くの質問に答えます。 http://www.synactive.com/download/sap%20gui%20scripting/sap%20gui%20scripting%20api.pdf

24
tyh

iPath を使用して、あらゆる種類のアプリケーション(ブラウザ、デスクトップ、Javaなど)を自動化できます。 SAPでのデータ入力、メニューナビゲーション、および画面スクレイピングを自動化する方法に関するチュートリアル

あなたはできる

  • コード(SDK)から使用します。 C#コードを自動生成するツールがあります
  • iPath Studio から直接ワークフロー(ビジュアルオートメーション)を作成して実行します。

C#自動生成コードのサンプルを次に示します。

        // Attach window  menu
        UiNode wnd3 = UiFactory.Instance.NewUiNode().FromSelector("<wnd app='sap business one.exe' cls='&#35;32768' idx='1' />");            
        // Click 'Business Pa...' menu
        UiNode uiClickBusinessPamenu_3 = wnd3.FindFirst(UiFindScope.UI_FIND_DESCENDANTS, "<ctrl name='Business Partners' role='popup menu' /><ctrl automationid='2561' />");
        uiClickBusinessPamenu_3.Click(88, 9, UiClickType.UI_CLICK_SINGLE, UiMouseButton.UI_BTN_LEFT, UiInputMethod.UI_HARDWARE_EVENTS);            
        // Attach window 'SAP Business' 
        UiNode wnd4 = UiFactory.Instance.NewUiNode().FromSelector("<wnd app='sap business one.exe' cls='TMFrameClass' title='SAP Business One 9.0 - OEC Computers' />");            
        // Click 'Add' button
        UiNode uiClickAddbutton_4 = wnd4.FindFirst(UiFindScope.UI_FIND_DESCENDANTS, "<wnd cls='ToolbarWindow32' title='View' /><ctrl name='View' role='tool bar' /><ctrl name='Add' role='Push button' />");
        uiClickAddbutton_4.Click(13, 24, UiClickType.UI_CLICK_SINGLE, UiMouseButton.UI_BTN_LEFT, UiInputMethod.UI_HARDWARE_EVENTS);

SAP Business Oneのメニュー、ボタン、入力のワークフローの自動化は次のようになります。

enter image description here

最後に、SDKドキュメントは here ...にあります。これは、ワークフローを使用したくない場合に備えています。

注:私はUiPathで働いています。また、Automation Anywhere、WinAutomation、Jacada、Selenium、Ranorexなどの他の自動化ツールを並べて使用し、ニーズに合ったものを選択する必要があります。

1
mbadit

ここでは、UIオートメーションでできることとその制限事項を理解することが非常に重要です。ユーザーインターフェイスの機能を自動化するように設計されています。ユーザーがマウスとキーボードを使用してできることは何でも、ボタンをクリックしたり、テキストボックスにテキストを入力したり、ウィンドウを移動したりできます。

それができることnotすることは、オペレーティングシステムがプロセス間に置く高い壁を埋めることです。プロセスが別のプロセスのメモリにアクセスするのを防ぐ壁。これは非常に重要なセキュリティおよび安全機能です。プロセス専用のデータにプロセスがアクセスするのを防ぎます。パスワードが好きです。また、別のプロセスでは、クラッシュするプロセスがマシン上で実行される他のプロセスに影響するのを防ぎます。タスクマネージャを使用してプロセスを強制終了すると、何も起こらなかったようにすべてが順調に動き続けます。

この結果、プログラムでSAPConnectionオブジェクトを作成すると、プログラムのみが使用できる接続になります。 UIオートメーションを使用して、このオブジェクトを別のプロセスに何らかの方法で渡すメカニズムはありません。せいぜい、接続から取得したデータを使用して、クリックするボタンに影響を与えることができます。

プロセス間でデータを共有できるようにするプロセス相互運用は、.NETで十分にサポートされています。低レベルのアプローチはソケットと名前付きパイプで、高レベルのアプローチはRemotingとWCFです。古いプログラムはCOMオートメーションをサポートしていますが、Officeはその良い例です。ただし、タンゴには2つ必要であり、両方のプログラムを使用してそれを利用する必要があります。

したがって、既存のSAPアプリケーションを自動化しようとしており、このアプリがOfficeプログラムがサポートする種類である自動化を明示的にサポートしていない場合、テキストボックスを埋めてボタンをクリックするだけでほとんど動かなくなります。

1
Hans Passant