一、配置连接

(1)第一种连接配置

1.根据操作系统将sapjco3.dll文件放入C:\Windows\System32目录; 
2.在项目中引入sapjco3.jar包; 
3.创建DisplaySalesActivity.java类,配置生成连接

public class DisplaySalesActivity {
    static String DESTINATION_NAME1 = "ABAP_AS_WITHOUT_POOL";
    static String DESTINATION_NAME2 = "ABAP_AS_WITH_POOL";
    //配置连接
    static {
        Properties connectProperties = new Properties();
        connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "127.0.0.1");//IP
        connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00");//系统编号
        connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "001");//客户端编号
        connectProperties.setProperty(DestinationDataProvider.JCO_USER, "username");//用户名
        connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "password");//密码
        connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "zh");//语言
        createDestinationDataFile(DESTINATION_NAME1, connectProperties);
        connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "30");//最大空闲连接数
        connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "150");//最大活动连接数
        createDestinationDataFile(DESTINATION_NAME2, connectProperties);
    }
    /*
    *创建配置连接文件
    /
    static void createDestinationDataFile(String destinationName, Properties connectProperties) {
        File destCfg = new File(destinationName + ".jcoDestination");
        try {
            FileOutputStream fos = new FileOutputStream(destCfg, false);
            connectProperties.store(fos, "For tests only !");
            fos.close();
        } catch (Exception e) {
            throw new RuntimeException("Unable to create the destination files", e);
        }
    }

/*
    *获取连接
    /
    public static JCoDestination getSAPDestination() throws JCoException {
        JCoDestination destination = JCoDestinationManager.getDestination(DESTINATION_NAME2);

return destination;

}

public static void main(String[] args) throws JCoException {
        getSAPDestination();
    }
配置好后运行main方法,生成2个连接配置文件(DESTINATION_NAME1 与DESTINATION_NAME2 )和2个日志文件,如果 
在Tomcat中运行,配置好生成地址可以直接在应用中调连接方法。

(2)第二种连接配置

1.配置环境: 
下载sapjco3.dll插件置放在JDK或Tomcat的bin文件夹下 
下载sapjco3.jar置放工程中

2.配置访问属性文件 
SAPConnectionPool.properties

jco.client.lang=zh #语言 
jco.destination.peak_limit=150 #最大活动连接数 
jco.client.client=001 #客户端编号 
jco.client.passwd=password #密码 
jco.client.user=username #用户名 
jco.client.sysnr=00 #系统编号 
jco.destination.pool_capacity=30 #最大空闲连接数 
jco.client.ashost=127.0.0.1 #IP

3.封装获取链接池链接Java类,以便接口使用时调用

SAPConnectionPool类:

@Service("SAPConnectionPool")
public class SAPConnectionPool {
    private static final String SAP_CONN="SAP_CONN";

public static JCoDestination getSAPDestination(){
        try {
            JCoDestination dest = JCoDestinationManager.getDestination(SAP_CONN);
            return dest;
        } catch (JCoException ex) {
                //System.out.println(ex);
                //System.out.println("连接失败,重新连接!");
                //重新连接
                return RegetJocodestination();
        }           
    }

/*****

* 函数功能描述:重新获取JCODestination
    * @return
    ****
     */
    public static JCoDestination RegetJocodestination(){
        try{
            Properties properFile = new Properties();
            ClassLoader cl=Thread.currentThread().getContextClassLoader();
            String filePath=cl.getResource("").toString()+"SAPConnectionPool.properties";
            filePath=filePath.replace("file:", "");
            filePath=filePath.replace("%20", " ");//替换文件名包含空格的
            FileInputStream inputFile = new FileInputStream(filePath);
            properFile.load(inputFile);
            inputFile.close();

Properties connectProperties = new Properties();
            connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, properFile.getProperty("jco.client.ashost"));
            connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  properFile.getProperty("jco.client.sysnr"));
            connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, properFile.getProperty("jco.client.client"));
            connectProperties.setProperty(DestinationDataProvider.JCO_USER,   properFile.getProperty("jco.client.user"));
            connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, properFile.getProperty("jco.client.passwd"));
            connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, properFile.getProperty("jco.destination.pool_capacity"));
            connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT,   properFile.getProperty("jco.destination.peak_limit"));
            connectProperties.setProperty(DestinationDataProvider.JCO_LANG,   properFile.getProperty("jco.client.lang"));

CustomDestinationDataProvider provider = new CustomDestinationDataProvider();
            provider.addDestinationProperties(SAP_CONN, connectProperties);
            Environment.registerDestinationDataProvider(provider);
            try {
                JCoDestination dest = JCoDestinationManager.getDestination(SAP_CONN);
                return dest;
            } catch (JCoException ex) {
                    System.out.println(ex);
                    System.out.println("重新连接失败");
            }           
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;        
    }

}

CustomDestinationDataProvider类

public class CustomDestinationDataProvider implements DestinationDataProvider {
    private Map providers = new HashMap();
    @Override
    public Properties getDestinationProperties(String destName) {
       if (destName == null)
           throw new NullPointerException("请指定目的名称");
       if (providers.size() == 0)
           throw new IllegalStateException("请加入一个目的连接参数属性给提供者");
       return (Properties)providers.get(destName);
   }

// 没有实现事件处理
   @Override
   public boolean supportsEvents(){
       return false;
   }

@Override
   public void setDestinationDataEventListener(DestinationDataEventListener listener) {
       throw new UnsupportedOperationException();
   }

public void addDestinationProperties(String destName, Properties provider) {
       providers.put(destName, provider);
   }
}

二、接口调用

JCO采用的是中间式接口,即外部系统将SAP系统所需的信息生成中间数据表,SAP系统直接读取中间文件或将中间表中的信息写入数据库中,中间式接口是比较常用的一种方式,这种方式外部系统和SAP系统相对独立,接口不涉及双方内部的结构,而且接口的责任也很明确,数据的安全性也得到了保证。但这种方式存在的问题就是两个系统的数据同步性稍差一些,但只要合理地规定读写中间文件或数据表的时间,数据的同步性是不会影响使用的。

以下是我在项目中用到的参数传递的方法调用,应该基本满足部分接口调用,例:

JCoDestination destination =SAPConnectionPool.getSAPDestination();//获取连接
//返回一个JCoFunction初始参数的传递函数名。获取接口方法
JCoFunction function = destination.getRepository().getFunction("Function_NAME");

//1.单独的参数,不在表结构下
function.getImportParameterList().setValue("NAME1", "VALUE1");// 参数

//2.JCoStructure 一般为HEADER参数
JCoStructure Structure=function.getImportParameterList().getStructure("_HEADER");
Structure.setValue("NAME1", "VALUE1");//参数
Structure.setValue("NAME2", "VALUE2");//参数

//3.JCoTable 主体参数,可为多个主体参数。。。
JCoTable headerImportParam = function.getTableParameterList().getTable("_TABLE");//返回的值i个字段作为一个表
//如果为参数集合,在外层加for循环即可
headerImportParam.appendRow();//附加表的最后一个新行,行指针,它指向新添加的行。
headerImportParam.setValue("NAME1", "VALUE1");//参数
headerImportParam.setValue("NAME2", "VALUE2");//参数

//执行接口
function.execute(destination);

//接口返回结果
JCoTable returnStructure = function.getTableParameterList().getTable("TD_RETURN");
for (int i = 0; i < returnStructure.getNumRows(); i++) {
    returnStructure.setRow(i);  
    System.out.println(returnStructure.getString("Param1"));
    System.out.println(returnStructure.getString("Param2"));
}

JAVA使用JCO实现调用SAP接口方法相关推荐

  1. SpringBoot项目使用JCO实现调用SAP接口实例

    一.JCO接口介绍 JCO采用的是中间式接口,即外部系统将SAP系统所需的信息生成中间数据表,SAP系统直接读取中间文件或将中间表中的信息写入数据库中,中间式接口是比较常用的一种方式,这种方式外部系统 ...

  2. JAVA调用SAP接口地址_Java以webservice方式调用SAP接口传输数据

    Java以webservice方式调用SAP接口传输数据,在SAP中生成 会计凭证/冲销会计凭证 1.生成会计凭证(已完成) 2.冲销会计凭证(以下教程截图以该接口为例) Java调用sap的webs ...

  3. Java 调用第三方接口方法

    Java 调用第三方接口方法 一. 通过JDK网络类Java.net.HttpURLConnection 1.java.net包下的原生java api提供的http请求 使用步骤: 1.通过统一资源 ...

  4. sapjco3调用sap接口

    一.环境 准备环境,本文用的是springboot项目,需要sapjco3.jar和sapjco3.dll文件,sqpjco3.dll文件需要放在system32文件夹下,sapjco3.jar因为m ...

  5. 【Kotlin】Kotlin 类的继承 三 ( super 关键字使用 | super@ 外部调用父类方法 | 子类选择性调用 父类 / 接口 方法 super )

    文章目录 I . 子类调用父类总结 II . 子类调用父类方法 ( super ) III . 子类内部类调用父类方法 ( super@ ) IV . 子类选择调用不同的 父类 / 接口方法 ( su ...

  6. C#调用Dephi接口方法

    C#想要调用Dephi接口方法,有两种解决办法 一.将Dephi程序编译成一个COM组件,然后在C#里引用COM组件, 二.非托管调用Dephi的DLL文件,代码如下: Code Dephi接口方法: ...

  7. 易语言调用微信接口方法(通过wxDriver.dll命令)

    易语言调用微信接口方法(通过wxDriver.dll命令) 先看易语言DLL命令图: DLL命令源码: .版本 2' ***************************************** ...

  8. C#如何连接SAP调用SAP接口函数

    在项目中我们经常会遇到SAP与其他应用系统对接的情况,如OA对接SAP的FI.HR模块,生产系统对接SAP的MM模块等等.这里和大家介绍下C#如果调用SAP接口,从而调用SAP接口函数. 下面先贴出代 ...

  9. java使用JCO调用SAP接口

    博客参考:http://blog.csdn.net/jay_1989/article/details/51821069 (可以说我是基本照抄,所以本篇博客为转载) 其实在写这篇博客之前,已经有很多前辈 ...

最新文章

  1. 《研磨设计模式》chap5 单例模式singleton
  2. 讲义not have data_“熟记英语300句 中考英语无忧虑”讲练(089)讲义文本
  3. 最原创的验证码产生过程,桃花朵朵开
  4. javascript --- [虚拟DOM] 初始化 实现
  5. php+mysql实现数据分批插入
  6. 谁动了你的主机-Windows“唤醒”和“开机”时自动拍照-狩猎者项目
  7. oracle querytimeout,聊聊pg jdbc的queryTimeout及next方法
  8. java装饰模式理解_Java设计模式之装饰模式趣谈
  9. 设计模式17---设计模式之模板方法模式(Template Method)(行为型)
  10. eclipse反编译后的文件去除注释 /** 123 **/
  11. 基于springboot的网上零食购物系统
  12. 报名软件批次分类code不能为空_为什么金蝶入库单保存时提示批号不能为空
  13. 如何使用JavaScript重定向到另一个网页
  14. 【机器视觉锁付整体解决方案】视觉纠偏和找孔示教操作
  15. 什么是适用于iPhone和iPad的iOS最新版本?
  16. Go Moudle笔记
  17. 【C++实现】编译原理 免考小队 FIRSTVT集生成算法
  18. GPIOB->CRH=0XFFFF0FFF;GPIOB->CRH|=(u32)8<<12;(学习笔记)
  19. 零基础学习大数据分析难吗?
  20. 反调试/反汇编技术、TEB/PEB部分说明

热门文章

  1. 深入浅出JS—11 ES6中类class和extends的使用
  2. SQL语句中EXISTS的使用详解及示例
  3. SQUIRREL语言
  4. JavaScript 杨辉三角 杨辉三角 II
  5. Tensorflow实例-CNN处理句子相似度(MPCNN)
  6. MotionEvent 事件解读
  7. ecshop + 主从 + memcache + memcache监控
  8. C语言-结构体-计算两点距离(Problem 3591)
  9. GitLab API 接入指南
  10. C++primer 第五版 练习题【3.32】 P104页 个人解答