24

C#言語を使用してSAPGUIウィンドウを自動化したいと思います。私は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へのセッションを作成して、フィールドにテキストを入力し始める方法がわかりません。任意の例とサンプルをいただければ幸いです。

4

3 に答える 3

28

これはネクロスレッドかもしれませんが、私が働いているのと同じような状況にありました. テスト目的で、C# で記述された自社開発の自動化プラットフォームの残りの部分と統合できる SAP GUI 自動化が必要でした。私は、SAP の自動化レイヤーの基礎として使用できる、SAP が提供する GUI 自動化用ライブラリーを利用する 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 の場合ですが、一般的なルールとオブジェクトは同じです)。SAP GUI ランタイム階層の部分を確実に読んでください。たくさんの質問に答えてくれます。 http://www.synactive.com/download/sap%20gui%20scripting/sap%20gui%20scripting%20api.pdf

于 2013-01-07T22:51:53.990 に答える
1

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

できないことは、オペレーティング システムがプロセス間に立てた高い壁を橋渡しすることです。プロセスが別のプロセスのメモリにアクセスできないようにする壁。これは非常に重要なセキュリティと安全機能です。1 つには、プロセスが、プロセスにとってプライベートである必要があるデータにアクセスするのを防ぎます。パスワードのように。また、クラッシュしているプロセスがマシン上で実行されている他のプロセスに影響を与えるのを防ぎます。タスク マネージャーを使用してプロセスを強制終了することができ、何も起こらなかったかのように、すべてが順調に進んでいきます。

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

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

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

于 2012-11-01T14:33:28.367 に答える
-1

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

あなたはできる

  • コード (SDK) から使用します。C#コードを自動生成するツールがあります
  • UiPath 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 のメニュー、ボタン、または入力のワークフローの自動化は次のようになります。

ここに画像の説明を入力

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

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

于 2014-10-02T14:39:10.110 に答える