转自一篇老文章:http://www.itpub.net/thread-1098733-1-4.html
Q1. 为什么还用JCo,而不用SAP JRA呢?
A1. SAP JRA只在netweaver java stack上面运行,纯ABAP stack没法跑。
Q2. 为什么非用JCA
A2. 为了利用强大的J2EE Server的现成功能来管理连接
Q3. 为什么用sap-bapi-jca-adapter
A3. 因为不要重新发明轮子,而且发明轮子需要耗费很长的时间
Q4. 什么是sap-bapi-jca-adapter?从哪里下载文档在哪里?例子在哪里?
A4. 这是个开源项目,提供了对JCo的JCA封装,项目首页在http://www.techjava.de/projects/sap-bapi-jca-adapter/,文档,代码等可从sf.net找到,http://sourceforge.net/projects/sapbapijcaadapt/。例子暂时没找到,你可以参考本文,或者参考项目的单元测试程序
Q5. 怎么编译代码
A5. 因为项目还比较原始,有不少代码错误,可能需要修改代码,建议大家下载源代码自己编译。当然,你要遵守项目的License,LGPL,共享出你的所有修改和增强。编译时需要注意几点。
0. 用Eclipse或其他CVS工具从sf.net下载代码
1. 从https://websmp202.sap-ag.de/~sapidb/011000358700007415502002E下载sapjco3-ntintel-3.0.1.zip和sapjco-ntintel-2.1.8.zip,展开
2. 在项目根目录下建立ext-lib文件夹,将sapjco.jar和sapjco3.jar拷贝过去
3. 用ant编译,或在eclipse下用ant编译
4. build.xml中property name="distr.dir.jboss"对应的是jboss server的地址,应该将这句话删除,可以在project.properties中用distr.dir.jboss属性来指定jboss的地址
5. 编译后会执行部署操作,将sapcrm-jboss-ds.xml和sap-bapi-adapter.rar两个文件拷贝至distr.dir.jboss中
Q6. JBOSS中怎么配置
A6. 以jboss-4.2.3.GA为例说明
1. 将sapjco.jar,sapjco3.jar,sapjcorfc.dll,sapjco3.dll复制到jboss/server/default/lib或类似目录中
2. 确保librfc32.dll在windows\system32下,这个文件装了sap gui就有了,如果没有,jco2的包里
3. 修改jboss/server/default/conf下的jbossjta-properties.xml文件, 在<properties depends="arjuna" name="jta">下增加<property name="com.arjuna.ats.jta.allowMultipleLastResources" value="true"/>
4. 将jboss/server/default/deploy下sapcrm-jboss-ds.xml复制成sap-bapi-adapter-jboss-ds.xml,并修改其中的<jndi-name>以及以下几个config-property
host
systemNumber
repositoryName,这个填任意字符串即可,建议用SID
client
UserName
Password
Language
并增加<config-property name="destinationFactory" type="java.lang.String">net.sf.sapbapijca.adapter.jco.JCo2DestinationFactory</config-property>
**这里指定了使用JCo2的库,暂时使用JCo3的库有点问题,我还在研究
Q7. 好了,下面怎么调用ABAP那边的函数呢?
A7. 示例代码如下,JCo2版本,JCo3的我正在研究中
import java.util.Map;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.resource.ResourceException;
import javax.resource.cci.Connection;
import javax.resource.cci.ConnectionFactory;
import javax.resource.cci.Interaction;
import javax.resource.cci.InteractionSpec;
import javax.resource.cci.MappedRecord;
import javax.resource.cci.RecordFactory;
import net.sf.sapbapijca.adapter.cci.InteractionSpecImpl;
....
Connection connection = null;
try
{
Context initctx = new InitialContext();
ConnectionFactory factory = (ConnectionFactory)initctx.lookup("java:eis/sap/demo");
connection = factory.getConnection();
Interaction interaction = connection.createInteraction();
InteractionSpec spec = new InteractionSpecImpl("RFC_READ_TABLE");
RecordFactory recordFactory = factory.getRecordFactory();
MappedRecord in = recordFactory.createMappedRecord("INPUT");
in.put("QUERY_TABLE", "TB027T");
MappedRecord resultRecord = (MappedRecord)interaction.execute(spec, in);
for(Object entry : resultRecord.entrySet())
{
Object key = ((Map.Entry)entry).getKey();
Object value = ((Map.Entry)entry).getValue();
log.info("Key: " + key.toString());
log.info("Value: " + value.toString());
}
}
catch (NamingException e)
{
e.printStackTrace();
}
catch (ResourceException e)
{
e.printStackTrace();
}
finally
{
if (connection != null)
try
{
connection.close();
}
catch (ResourceException e)
{
e.printStackTrace();
}
}
public int getFieldCount()
{
return record != null ? record.getFieldCount() : 0 ;
}