如何使用 C# 自动化 SAP GUI 750
How to Automate SAP GUI 750 with C#
问题:如何打开新的 SAP GuiApplication 针对 SAP Logon 而不是 SAP Easy Access?
我知道这似乎是一个重复的问题,但它更像是对问题 How do I automate SAP GUI with c# 的补充。由于本人声望值不足,无法在评论区提问,请见谅
我能够使用 C# 成功实现到 SAP 的连接,但是,它连接到 "SAP Easy Access" 而不是 "SAP Logon" - 一个更具视觉吸引力的 GUI。我不一定关心视觉外观;问题是某些按钮或文本输入字段不可用或不可见。
这是一张照片:
我认为问题出在 DLL 库上,或者我不知道如何启动 SAP Logon 实例并将其附加到我的会话。
这是我的代码,不包括敏感数据:
using System;
using SAPFEWSELib;
namespace RS_PostSettlementDataPull
{
//SAPActive class to perform script operations
public class SAPActive
{
//Class Member accessors
public static GuiApplication SapGuiApp { get; set; }
public static GuiConnection SapConnection { get; set; }
public static GuiSession SapSession { get; set; }
/**
* Takes in a connection string and creates a GuiApplication linking
* the SAP Connection and Session.
*
* Accepts DEFAULT connection.
*/
public static void OpenSap(string env)
{
SAPActive.SapGuiApp = new GuiApplication(); //Need a way to explicitly create SAP Logon app
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
}
/**
* Takes in connection parameters to login to the SAP session.
*/
public static 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();
}
/**
* Takes in a string UI path Id and returns a GuiTextField linked to the
* current session. Utilizes the SAPActive class.
*/
public static GuiTextField TextFieldPath(string path)
{
GuiTextField rtnField = (GuiTextField)SAPActive.SapSession.FindById(path);
return rtnField;
}
/**
* Takes in a string UI path Id and returns a GuiMenu linked to the
* current session. Utilizes the SAPActive class.
*/
public static GuiMenu MenuPath(string path)
{
GuiMenu rtnField = (GuiMenu)SAPActive.SapSession.FindById(path);
return rtnField;
}
/**
* Takes in a string UI path Id and returns a GuiFrameWindow linked to the
* current session. Utilizes the SAPActive class.
*/
public static GuiFrameWindow FrameWindowPath(string path)
{
GuiFrameWindow rtnField = (GuiFrameWindow)SAPActive.SapSession.FindById(path);
return rtnField;
}
/**
* Takes in a string UI path Id and returns a GuiButton linked to the
* current session. Utilizes the SAPActive class.
*/
public static GuiButton ButtonPath(string path)
{
GuiButton rtnField = (GuiButton)SAPActive.SapSession.FindById(path);
return rtnField;
}
/**
* Main class that acts as the driving SAP GUI Script engine.
*/
public static void Main(string[] args)
{
SAPActive.OpenSap("SENSITIVE");
SAPActive.login("100", "SENSITIVE", "SENSITIVE", "EN");
SAPActive.SapSession.StartTransaction("IW59");
GuiMenu guiMenu;
GuiFrameWindow guiFrameWindow;
GuiTextField guiTextField;
GuiButton guiButton;
guiMenu = SAPActive.MenuPath("wnd[0]/mbar/menu[2]/menu[0]/menu[0]");
guiMenu.Select();
guiTextField = SAPActive.TextFieldPath("wnd[1]/usr/txtV-LOW");
guiTextField.SetFocus();
guiTextField.Text = "SENSITIVE";
guiTextField = SAPActive.TextFieldPath("wnd[1]/usr/txtENAME-LOW");
guiTextField.Text = "";
guiFrameWindow = SAPActive.FrameWindowPath("wnd[1]");
guiFrameWindow.SendVKey(8);
guiFrameWindow = SAPActive.FrameWindowPath("wnd[0]");
guiFrameWindow.SendVKey(8);
//guiButton = SAPActive.ButtonPath("wnd[1]/tbar[0]/btn[8]");
//guiButton.SetFocus();
//guiButton.Press();
}
}
}
感谢您提供的任何帮助!
我也遇到了同样的问题。我不知道 SAP 是否像你写的那样连接到“SAP Easy Access”。
我通过更改 class 对象解决了它:
sapEngine = new GuiApplication();
sapConnexion = sapEngine.OpenConnection(sapGUIConfig.EndPoint,Sync:true);
sapSession = (GuiSession)sapConnexion.Sessions.Item(0);
作者:
sapROTWrapper = new SapROTWr.CSapROTWrapper();
sapGUIROT = _sapROTWrapper.GetROTEntry("SAPGUI");
//Get the reference to the Scripting Engine
sapEngine = sapGUIROT.GetType().InvokeMember("GetScriptingEngine", System.Reflection.BindingFlags.InvokeMethod, null, sapGUIROT, null);
sapConnexion = sapEngine.OpenConnection(sapGUIConfig.EndPoint);
sapSession = sapConnexion.Children(0);
但是它会对你的 scipt 产生一些影响,就像我在 中发现的那样。
问题:如何打开新的 SAP GuiApplication 针对 SAP Logon 而不是 SAP Easy Access?
我知道这似乎是一个重复的问题,但它更像是对问题 How do I automate SAP GUI with c# 的补充。由于本人声望值不足,无法在评论区提问,请见谅
我能够使用 C# 成功实现到 SAP 的连接,但是,它连接到 "SAP Easy Access" 而不是 "SAP Logon" - 一个更具视觉吸引力的 GUI。我不一定关心视觉外观;问题是某些按钮或文本输入字段不可用或不可见。
这是一张照片:
我认为问题出在 DLL 库上,或者我不知道如何启动 SAP Logon 实例并将其附加到我的会话。
这是我的代码,不包括敏感数据:
using System;
using SAPFEWSELib;
namespace RS_PostSettlementDataPull
{
//SAPActive class to perform script operations
public class SAPActive
{
//Class Member accessors
public static GuiApplication SapGuiApp { get; set; }
public static GuiConnection SapConnection { get; set; }
public static GuiSession SapSession { get; set; }
/**
* Takes in a connection string and creates a GuiApplication linking
* the SAP Connection and Session.
*
* Accepts DEFAULT connection.
*/
public static void OpenSap(string env)
{
SAPActive.SapGuiApp = new GuiApplication(); //Need a way to explicitly create SAP Logon app
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
}
/**
* Takes in connection parameters to login to the SAP session.
*/
public static 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();
}
/**
* Takes in a string UI path Id and returns a GuiTextField linked to the
* current session. Utilizes the SAPActive class.
*/
public static GuiTextField TextFieldPath(string path)
{
GuiTextField rtnField = (GuiTextField)SAPActive.SapSession.FindById(path);
return rtnField;
}
/**
* Takes in a string UI path Id and returns a GuiMenu linked to the
* current session. Utilizes the SAPActive class.
*/
public static GuiMenu MenuPath(string path)
{
GuiMenu rtnField = (GuiMenu)SAPActive.SapSession.FindById(path);
return rtnField;
}
/**
* Takes in a string UI path Id and returns a GuiFrameWindow linked to the
* current session. Utilizes the SAPActive class.
*/
public static GuiFrameWindow FrameWindowPath(string path)
{
GuiFrameWindow rtnField = (GuiFrameWindow)SAPActive.SapSession.FindById(path);
return rtnField;
}
/**
* Takes in a string UI path Id and returns a GuiButton linked to the
* current session. Utilizes the SAPActive class.
*/
public static GuiButton ButtonPath(string path)
{
GuiButton rtnField = (GuiButton)SAPActive.SapSession.FindById(path);
return rtnField;
}
/**
* Main class that acts as the driving SAP GUI Script engine.
*/
public static void Main(string[] args)
{
SAPActive.OpenSap("SENSITIVE");
SAPActive.login("100", "SENSITIVE", "SENSITIVE", "EN");
SAPActive.SapSession.StartTransaction("IW59");
GuiMenu guiMenu;
GuiFrameWindow guiFrameWindow;
GuiTextField guiTextField;
GuiButton guiButton;
guiMenu = SAPActive.MenuPath("wnd[0]/mbar/menu[2]/menu[0]/menu[0]");
guiMenu.Select();
guiTextField = SAPActive.TextFieldPath("wnd[1]/usr/txtV-LOW");
guiTextField.SetFocus();
guiTextField.Text = "SENSITIVE";
guiTextField = SAPActive.TextFieldPath("wnd[1]/usr/txtENAME-LOW");
guiTextField.Text = "";
guiFrameWindow = SAPActive.FrameWindowPath("wnd[1]");
guiFrameWindow.SendVKey(8);
guiFrameWindow = SAPActive.FrameWindowPath("wnd[0]");
guiFrameWindow.SendVKey(8);
//guiButton = SAPActive.ButtonPath("wnd[1]/tbar[0]/btn[8]");
//guiButton.SetFocus();
//guiButton.Press();
}
}
}
感谢您提供的任何帮助!
我也遇到了同样的问题。我不知道 SAP 是否像你写的那样连接到“SAP Easy Access”。
我通过更改 class 对象解决了它:
sapEngine = new GuiApplication();
sapConnexion = sapEngine.OpenConnection(sapGUIConfig.EndPoint,Sync:true);
sapSession = (GuiSession)sapConnexion.Sessions.Item(0);
作者:
sapROTWrapper = new SapROTWr.CSapROTWrapper();
sapGUIROT = _sapROTWrapper.GetROTEntry("SAPGUI");
//Get the reference to the Scripting Engine
sapEngine = sapGUIROT.GetType().InvokeMember("GetScriptingEngine", System.Reflection.BindingFlags.InvokeMethod, null, sapGUIROT, null);
sapConnexion = sapEngine.OpenConnection(sapGUIConfig.EndPoint);
sapSession = sapConnexion.Children(0);
但是它会对你的 scipt 产生一些影响,就像我在