本文阐述如何使用SAP JCo 3.4 建立到SAP服务器。
1. 创建一SAP用户:Test01, 使用SU01创建用户,本文不在详述。
为了方便起见,我将Profile "SAP_ALL“ 分配给用户TEST01, 如下图所示:
这样用户就可以通过SAP服务器的验证了,如果没有加这个Profile,以下日志信息会被抛出:
Exception in thread "main" com.sap.conn.jco.JCoException: (103) RFC_ERROR_LOGON_
FAILURE: User TEST01 has no RFC authorization for function group SYST . on 192.1
68.19.28 sysnr 00
at com.sap.conn.jco.rt.MiddlewareJavaRfc.generateJCoException(Middleware
JavaRfc.java:637)
at com.sap.conn.jco.rt.MiddlewareJavaRfc$JavaRfcClient.connect(Middlewar
eJavaRfc.java:1305)
at com.sap.conn.jco.rt.ClientConnection.connect(ClientConnection.java:66
5)
at com.sap.conn.jco.rt.PoolingFactory.init(PoolingFactory.java:103)
at com.sap.conn.jco.rt.ConnectionManager.createFactory(ConnectionManager
.java:173)
at com.sap.conn.jco.rt.DefaultConnectionManager.createFactory(DefaultCon
nectionManager.java:45)
at com.sap.conn.jco.rt.ConnectionManager.getFactory(ConnectionManager.ja
va:162)
at com.sap.conn.jco.rt.RfcDestination.initialize(RfcDestination.java:805
)
at com.sap.conn.jco.rt.RfcDestination.getAttributes(RfcDestination.java:
633)
at com.sap.conn.jco.rt.RfcDestination.getAttributes(RfcDestination.java:
28)
at ConnectNoPool.connectWithoutPool(ConnectNoPool.java:50)
at ConnectNoPool.main(ConnectNoPool.java:56)
Caused by: RfcException: [null]
message: User TEST01 has no RFC authorization for function group SYST . on 1
92.168.19.28 sysnr 00
Return code: RFC_SYS_EXCEPTION(3)
error group: 103
key: RFC_ERROR_LOGON_FAILURE
2. 编写连接SAP服务器代码
import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.ext.DestinationDataProvider;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
public class ConnectNoPool {
static String ABAP_AS = "ABAP_AS_WITHOUT_POOL";
static
{
Properties connectProperties = new Properties();
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "192.168.19.28");
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00");
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "000");
connectProperties.setProperty(DestinationDataProvider.JCO_USER, "TEST01");
//Must use Upper case for password, otherwise, SAP server will report password is incorrect.
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "ADMIN123");
connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "en");
createDataFile(ABAP_AS, "jcoDestination", connectProperties);
}
//Creates a connection configuration file based on parameters given above
static void createDataFile(String name, String suffix, Properties properties)
{
File cfg = new File(name+"."+suffix);
if(!cfg.exists())
{
try
{
FileOutputStream fos = new FileOutputStream(cfg, false);
properties.store(fos, "for tests only !");
fos.close();
}
catch (Exception e)
{
throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e);
}
}
}
public static void connectWithoutPool() throws JCoException
{
JCoDestination destination = JCoDestinationManager.getDestination(ABAP_AS);
System.out.println("Attributes:");
System.out.println(destination.getAttributes());
System.out.println();
}
public static void main(String[] args) throws JCoException
{
connectWithoutPool();
}
}
3. 编译
[c-sharp] view plaincopy
javac -classpath .;D:/Resources/Libraries/SAPJCo/JCO_304/sapjco3.jar -d classes ConnectNoPool.java
4. 运行
[c-sharp] view plaincopy
java -cp D:/Resources/Libraries/SAPJCo/JCO_304/sapjco3.jar;classes ConnectNoPool
结果:
[c-sharp] view plaincopy
Attributes:
DEST: ABAP_AS_WITHOUT_POOL
OWN_HOST: NB-MinFei
PARTNER_HOST: minfei
SYSTNR: 00
SYSID: C11
CLIENT: 000
USER: TEST01
LANGUAGE: E
ISO_LANGUAGE: EN
OWN_CODEPAGE: 1100
OWN_CHARSET: ISO8859_1
OWN_ENCODING: iso-8859-1
OWN_BYTES_PER_CHAR: 1
PARTNER_CODEPAGE: 1100
PARTNER_CHARSET: ISO8859_1
PARTNER_ENCODING: iso-8859-1
PARNER_BYTES_PER_CHAR: 1
OWN_REL: 720
PARTNER_REL: 620
PARTNER_TYPE: 3
KERNEL_REL: 620
TRACE:
RFC_ROLE: C
OWN_TYPE: E
CPIC_CONVID: 00000000
表示用户Test01成功的连接到SAP服务器了。
本节到此为止, 下节将继续描述如何使用连接池来创建SAP连接。