java - Java 中的 SAP GUI 脚本
问题描述
我正在按照下面的示例从 Java https://blogs.sap.com/2012/11/01/how-to-use-sap-gui-scripting-inside-java/处理 sapguiscripting 。
Obj = new ActiveXComponent(Session.invoke("FindById",
"wnd[0]/usr/txtRSYST-BNAME").toDispatch());
Obj.setProperty("Text", "BCUSER");
//-Set GUIPasswordField Password------------------------------
//-
//- session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = _
//- "minisap"
//-
//------------------------------------------------------------
Obj = new ActiveXComponent(Session.invoke("FindById",
"wnd[0]/usr/pwdRSYST-BCODE").toDispatch());
Obj.setProperty("Text", "minisap");
即使我传递了参数username
,password
我仍然无法从 java 启动 SAP 应用程序。我还需要修改什么才能使其正常工作?
解决方案
要从头开始完成登录过程,您需要添加 2 个操作:
将 saplogon.exe 作为新进程启动
打开与所需 sap 服务器的连接。对于此步骤,需要已经在 saplogon 中配置所需的连接。
现在您可以运行代码来执行登录。
1的代码:
//Opening the SAP Logon
//this string should point to the saplogon.exe on your system.
String sapLogonPath = "C:\\Program Files (x86)\\SAP\\FrontEnd\\SAPgui\\saplogon.exe";
Process p;
try {
p = Runtime.getRuntime().exec(sapLogonPath);
//the sleep is to let the system wait until the sap logon has fully loaded. You might reduce the time of the sleep depending on the performance of your system
Thread.sleep(7000);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
2的代码:
//SAP Connection Name
//this string is the name of the connection configured in SAP Logon
String sapConnectionName = "SAPServer";
Connection = new ActiveXComponent(
GUIApp.invoke("OpenConnection",sapConnectionName).toDispatch());
一个完整的独立工作示例的代码:
以下是您的链接中的代码 + 所需的所有修改,以便启动 SAP Logon、打开连接并登录用户。
package com.sapguiscripting;
import java.io.IOException;
//-Begin----------------------------------------------------------------
//-
//- How to use SAP GUI Scripting inside Java
//- Example: Logon to an SAP system
//-
//-
//----------------------------------------------------------------------
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class SAPGUIScriptingLogon {
public static void main(String[] args) {
//-Variables------------------------------------------------------
ActiveXComponent SAPROTWr, GUIApp, Connection, Session, Obj;
Dispatch ROTEntry;
Variant ScriptEngine;
ComThread.InitSTA();
//Opening the SAP Logon
String sapLogonPath = "C:\\Program Files (x86)\\SAP\\FrontEnd\\SAPgui\\saplogon.exe";
Process p;
try {
p = Runtime.getRuntime().exec(sapLogonPath);
Thread.sleep(7000);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//-Set SapGuiAuto = GetObject("SAPGUI")---------------------------
SAPROTWr = new ActiveXComponent("SapROTWr.SapROTWrapper");
try {
ROTEntry = SAPROTWr.invoke("GetROTEntry", "SAPGUI").toDispatch();
//-Set application = SapGuiAuto.GetScriptingEngine------------
ScriptEngine = Dispatch.call(ROTEntry, "GetScriptingEngine");
GUIApp = new ActiveXComponent(ScriptEngine.toDispatch());
//SAP Connection Name
String sapConnectionName = "SAPServer"; //this is the name of the connection in SAP Logon
Connection = new ActiveXComponent(
GUIApp.invoke("OpenConnection",sapConnectionName).toDispatch());
//-Set connection = application.Children(0)-------------------
//Connection = new ActiveXComponent(GUIApp.invoke("Children", 0).toDispatch());
//-Set session = connection.Children(0)-----------------------
Session = new ActiveXComponent(
Connection.invoke("Children", 0).toDispatch());
//-Set GUITextField Client------------------------------------
//-
//- session.findById("wnd[0]/usr/txtRSYST-MANDT").text = "000"
//-
//------------------------------------------------------------
Obj = new ActiveXComponent(Session.invoke("FindById","wnd[0]/usr/txtRSYST-MANDT").toDispatch());
Obj.setProperty("Text", "000");
//-Set GUITextField User--------------------------------------
//-
//- session.findById("wnd[0]/usr/txtRSYST-BNAME").text = _
//- "BCUSER"
//-
//------------------------------------------------------------
Obj = new ActiveXComponent(Session.invoke("FindById",
"wnd[0]/usr/txtRSYST-BNAME").toDispatch());
Obj.setProperty("Text", "SAP*");
//-Set GUIPasswordField Password------------------------------
//-
//- session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = _
//- "minisap"
//-
//------------------------------------------------------------
Obj = new ActiveXComponent(Session.invoke("FindById",
"wnd[0]/usr/pwdRSYST-BCODE").toDispatch());
Obj.setProperty("Text", "Down1oad");
//-Set GUITextField Language----------------------------------
//-
//- session.findById("wnd[0]/usr/txtRSYST-LANGU").text = "DE"
//-
//------------------------------------------------------------
Obj = new ActiveXComponent(Session.invoke("FindById",
"wnd[0]/usr/txtRSYST-LANGU").toDispatch());
Obj.setProperty("Text", "EN");
//-Press enter------------------------------------------------
//-
//- session.findById("wnd[0]").sendVKey 0
//-
//------------------------------------------------------------
Obj = new ActiveXComponent(Session.invoke("FindById",
"wnd[0]").toDispatch());
Obj.invoke("sendVKey", 0);
}
catch (Exception e) {
}
finally {
ComThread.Release();
System.exit(0);
}
}
}
//-End------------------------------------------------------------------
推荐阅读
- c# - C# Netfwtypelib - 添加超过 1 个远程地址?
- windows - Git钩子不在Windows上运行
- javascript - 文本在输出中垂直上下跳跃。使用 "document.getElementById("firstDiv").innerHTML = document.getElementById("location").value;"
- java - 不带参数访问列表中的下一个元素
- python - PyQt4:仅在 GUI 错误中的透明按钮上闪烁白色
- android - 此视频无法阅读:已授予权限,VideoView 和 MediaController 似乎已正确定义和使用
- javascript - 使用 Express 和 Node 从同步函数中调用异步(Promise)函数
- sql - ORA-01652: 使用 DBMS_RANDOM.VALUE 时无法在表空间 TEMP 错误中将临时段扩展 128
- android - PWA 推送 API 与 Android 推送通知
- c# - 为什么我可以在其他事件中使用此变量