flights.setRow(i);
System.out.println(flights.getString("AIRLINE")+"\t"
+flights.getString("CITYFROM")+"\t"
+flights.getString("CITYTO")+"\t"
+flights.getDate("FLIGHTDATE")+"\t"
+flights.getDouble("PRICE")+"\t"
+flights.getString("CURR"));
}
//断开连接
myConnection.disconnect();
}else{
System.out.println(false);
}
}
}//:
~
首先,将连接需要的信息放到一个Properties里,对应的键值都是固定的。
需要注意的是给定的用户名必须有足够的权限进行远程调用。
JCO.ClientmyConnection=JCO.createClient(logonProperties);
这样就创建了一个到SAP系统的连接对象了。
接着只要在这个对象上调用connect()方法就能激活连接。
为了保证这个连接确实可用,加上这一句:
if(myConnection!
=null&&myConnection.isAlive())
接下来比较麻烦,先要从这个活动的连接上拿到一个“仓库”,然后从这个“仓库”里拿到函数模板,再从函数模板里拿到对应函数对象。
JCO.RepositorymyRepository=
newJCO.Repository("Repository", //只是一个名字
myConnection);//活动的连接
StringstrFunc="BAPI_FLIGHT_GETLIST";
IFunctionTemplateft=myRepository.getFunctionTemplate(strFunc.toUpperCase());
JCO.Functionfunction=ft.getFunction();
整个过程很唬人,其实也就那么回事。
这里我们调用的是一个叫“BAPI_FLIGHT_GETLIST”函数,这个函数在SAP系统中被声明为Remote-EnabledModule,能够被远程调用的函数都必须声明为Remote-EnabledModule。
好了,我们现在有函数对象了。
我们知道,SAP函数主要就是有5个输入输出接口:
Import、Export、Changing、Tables、Exceptions。
其中除了Changing在远程调用中是不被允许的外,其他都是可用的属性:
Import:
通过在函数对象上调用getImportParameterList()方法获得Import变量列表。
JCO.ParameterListinput=function.getImportParameterList();
Export:
在函数被执行后通过在函数对象上调用getExportParameterList()方法获得Export变量列表。
JCO.ParameterListoutput=function.getExportParameterList();
Changing:
不支持。
Tables:
通过在函数对象上调用getTableParameterList()方法获得Tables变量列表。
JCO.ParameterListtables=function.getTableParameterList();
Exceptions:
可通过在函数对象上调用getExceptionList()方法获得Exceptions变量数组,也可调用getException(java.lang.Stringkey)获得单个异常对象。
JCO.AbapException[]abapExceptions=function.getExceptionList();
JCO.AbapExceptionabapException=function.getException("1");
Import、Export、Tables所获得的都是JCO.ParameterList对象。
如果参数是基本类型,则可直接设定:
input.setValue(10,"MAX_ROWS");
Objectobject=output.getValue("MAX_ROWS");
当然你这样getValue得到的只能是一个Object对象,如果你知道你会得到什么类型(一般情况下你应该知道),你可以直接get这个类型。
比如,我们知道"MAX_ROWS"是个int值,所以:
intmaxRows=output.getInt("MAX_ROWS");
如果参数是一个结构(如果你是个面向对象的程序员,请回忆一下C语言中的结构变量,谢谢),那么你得先得到一个对应此参数的结构对象,然后对结构中的变量成员get或者set:
JCO.StructuresFrom=input.getStructure("DESTINATION_FROM");
sFrom.setValue("NEWYORK","CITY");
当然如果是Import的话最后别忘了把这个结构放回列表中:
input.setValue(sFrom,"DESTINATION_FROM");
在对Tables的参数进行操作时,也得先得到一个与该参数内部表对应的内部表对象:
JCO.TabletDateRange=tables.getTable("DATE_RANGE");
现在这个内部表对象还是空的,所以要先加一行数据,然后将一个逻辑指针指向该行,再进行各个元素的赋值或取值:
tDateRange.appendRow();
tDateRange.setRow(0);
tDateRange.setValue("I","SIGN");
tDateRange.setValue("EQ","OPTION");
tDateRange.setValue("20040330","LOW");
内部表对象支持直接将表内容发送到HTML文件:
JCO.Tableflights=function.getTableParameterList().getTable("FLIGHT_LIST");
flights.writeHTML("C:
/function.html");
想知道内部表中有几条数据,可以调用getNumRows()方法:
introws=flights.getNumRows();
结束调用时要记得断开连接:
myConnection.disconnect();
2.使用连接池
很多时候我们需要进行大量连接,SAP系统本来就脆弱,连接再一多那真的是老牛拉车了。
所以我们要用连接池进行连接。
下面是一个使用连接池的例子:
packagejcousage;
importcom.sap.mw.jco.JCO;
importjava.util.Properties;
publicclassUsageForPool{
publicstaticvoidcreateConnectionPool(StringpoolName,
intmaxConnection,
PropertieslogonProperties){
JCO.Poolpool=JCO.getClientPoolManager().getPool(poolName);
if(pool==null){
JCO.addClientPool(poolName, //连接池名
maxConnection, //最大连接数
logonProperties); //logon设定参数
}
}
publicstaticJCO.ClientgetConnectionInPool(StringpoolName){
JCO.Clientconnection=null;
JCO.Poolpool=JCO.getClientPoolManager().getPool(poolName);
if(pool!
=null){
connection=JCO.getClient(poolName);
}
returnconnection;
}
publicstaticvoidreleaseConnection(JCO.Clientconnection){
JCO.releaseClient(connection);
}
publicstaticvoidremoveConnectionPool(StringpoolName){
JCO.removeClientPool(poolName);
}
publicstaticvoidmain(String[]args){
PropertieslogonProperties=newProperties();
logonProperties.put("jco.client.ashost","192.168.1.123");
logonProperties.put("jco.client.client","800");
logonProperties.put("jco.client.sysnr","00");
logonProperties.put("jco.client.user","young98");
logonProperties.put("jco.client.passwd","password");
StringpoolName="ThePool";
createConnectionPool(poolName,6,logonProperties);
JCO.Clientconnection=getConnectionInPool(poolName);
connection.connect();
if(connection!
=null&&connection.isAlive()){
System.out.println("Connectionisalive!
");
releaseConnection(connection);
removeConnectionPool(poolName);
}else{
System.out.println("ConnectionFALSE!
");
}
}
}
首先,我们仍然需要一个Properties对象用来建立连接,不过这次是建立的连接是一个连接池: