24

我想使用 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 的会话并开始在字段中输入文本。任何示例和示例将不胜感激。

4

3 回答 3

28

这可能是 necro-threading,但我工作的时候也遇到过类似的情况。我们需要 SAP GUI Automation 来进行测试,以便与我们用 C# 编写的其他本土自动化平台集成。我帮助创建了一个解决方案的提案,该解决方案利用了 SAP 提供的 GUI 自动化库,可用作 SAP 自动化层的基础。

您的 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 自动化可以做什么以及它的局限性是非常重要的。它旨在自动化用户界面的功能。您可以单击按钮、在文本框中输入文本、移动窗口等,用户可以使用鼠标和键盘进行任何操作。

不能做的是架起操作系统在进程之间竖起的高墙。阻止一个进程访问另一个进程的内存的墙。这是一个非常重要的安全和安全功能。一方面,它阻止进程访问应该是进程私有的数据。就像密码一样。另一方面,它阻止崩溃进程影响机器上运行的其他进程。您可以使用任务管理器终止一个进程,并且一切都继续愉快地进行,就好像什么都没发生一样。

这样做的结果是,在您的程序中创建一个 SAPConnection 对象是一个只有您的程序可以使用的连接。没有机制可以通过 UI 自动化以某种方式将此对象传递给另一个进程。充其量您可以使用从连接中检索到的数据来影响您单击的按钮。

允许在进程之间共享数据的进程互操作类型在 .NET 中得到了很好的支持。低级方法是套接字和命名管道,高级方法是 Remoting 和 WCF。较旧的程序支持 COM 自动化,Office 就是一个很好的例子。然而,这需要两个探戈,必须编写两个程序才能利用它。

因此,如果您尝试自动化现有的 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 回答