JAVA 调用SAP端接口

       SAP的R/3系统与Java平台一样有着许多类似的技术理念,以及同样广泛的企业级用户,但是它们完全是两个不同的世界。当用户面临流程或者数据整合方面的需求的时候,就迫切需要一种高效的方式,在R/3系统和Java平台之间实时地交换数据。基于这样的需求,SAP提供了一套高效的基于RFC的ABAP和Java进程间通讯组件:SAP Java Connector(JCo)。

一、sapjoc3.jar获取

由于sap官网提供的链接需要合作公司提供账号密码,如果商用请索要正确的用户名密码下载
直接把 sapjco3.jar sapjco3.dll sapjco3.pdb 拷贝至lib下,然后add library把他们都添加进去

二、源码编写

package com.authine.cloudpivot.web.api.controller.runtime;

import com.authine.cloudpivot.web.api.handler.CustomizedOrigin;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoTable;
import com.sap.conn.jco.ext.DestinationDataProvider;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * 调用SAP接口 ZZTRD_CRM_001  crm 取合同与客户信息接口
 */

@Api(description = "流程操作类", tags = "运行时::流程实例接口")
@RestController
@RequestMapping("/api/runtime/sap")
@Slf4j
@Validated
@CustomizedOrigin(level = 0)
public class GetSAPContractController {

    //客户
    private String CustomerName;
    //项目名称
    private String ProjectName;
    //项目编号
    private String ProjectNumber;
    //合同金额
    private String Amount;
    //已开票金额
    private String AlreadAmount;
    //已发货额
    private String AlreadDeliveryAmount;


    private String customerName;//客户
    private String projectName;//项目名称
    private String projectNumber;//项目编号
    private String amount;//合同金额
    private String subscriber;//负责人、认款人(营销经理)
    private String subscriberNum;//负责人、认款人(营销经理)工号
    private String contractNum;//crm合同编号
    private String kunnr2;//开票方
    private String name3;//开发票方名称

    public String getCustomerName() {
        return customerName;
    }
    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }
    public String getProjectName() {
        return projectName;
    }
    public void setProjectName(String projectName) {
        this.projectName = projectName;
    }
    public String getProjectNumber() {
        return projectNumber;
    }
    public void setProjectNumber(String projectNumber) {
        this.projectNumber = projectNumber;
    }
    public String getAmount() {
        return amount;
    }
    public void setAmount(String amount) {
        this.amount = amount;
    }
    public String getSubscriber() {
        return subscriber;
    }
    public void setSubscriber(String subscriber) {
        this.subscriber = subscriber;
    }
    public String getSubscriberNum() {
        return subscriberNum;
    }
    public void setSubscriberNum(String subscriberNum) {
        this.subscriberNum = subscriberNum;
    }
    public String getContractNum() {
        return contractNum;
    }
    public void setContractNum(String contractNum) {
        this.contractNum = contractNum;
    }
    public String getKunnr2() {
        return kunnr2;
    }
    public void setKunnr2(String kunnr2) {
        this.kunnr2 = kunnr2;
    }
    public String getName3() {
        return name3;
    }
    public void setName3(String name3) {
        this.name3 = name3;
    }


    @ApiOperation("GetSAPContract业务方法")
    @ApiImplicitParams(@ApiImplicitParam(name = "customerCode", value = "参数1", dataType = "String", paramType = "query", required = true))
    @GetMapping("/GetSAPContract")
    public List<GetSAPContractController> GetSAPContract(String customerCode) {

/*
 * 与SAP连接配置
 * @author fengxin
 */
        String D12 = "10.10.100.86";
       String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";
       {
           Properties connectProperties = new Properties();

           connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, D12);          //服务器
           connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00");          //系统编号
           connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "800");        //SAP集团
           connectProperties.setProperty(DestinationDataProvider.JCO_USER, "PDM_RFC");      //用户名
           connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "123789");     //密码
           connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH");           //登录语言
           connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3");   //最大连接数
           connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "100");    //最大线程数

           createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);
       }
       List<GetSAPContractController> ret = new ArrayList<GetSAPContractController>();
       try {

           JCoDestination destination = null;
           destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);              //获取SAP连接
           JCoFunction function = destination.getRepository().getFunction("ZZTRD_CRM_001");

           if (function == null)
               throw new RuntimeException("BAPI not found in SAP.");

           function.getImportParameterList().setValue("I_KUNNR", customerCode);  //传参
           function.execute(destination);

           JCoTable jtab = function.getTableParameterList().getTable("G_ITEM");
           for (int i = 0; i < jtab.getNumRows(); i++) {
               jtab.setRow(i);
               GetSAPContractController c = new GetSAPContractController();

               c.setCustomerName(jtab.getString("NAME1"));//客户
               c.setProjectName(jtab.getString("POST1"));//项目名称
               c.setProjectNumber(jtab.getString("VBELN"));//项目编号
               c.setAmount(jtab.getString("KZWI1"));//合同金额
               c.setSubscriber(jtab.getString("NAME2"));//营销经理
               c.setSubscriberNum(jtab.getString("KUNNR1")/*.substring(4,10)*/);//营销经理工号
               c.setContractNum(jtab.getString("BSTKD"));//crm合同编号
               c.setKunnr2(jtab.getString("KUNNR2"));//开票方
               c.setName3(jtab.getString("NAME3"));//开票方名称
               ret.add(c);
           }
       } catch (Exception e) {
           e.printStackTrace();
           return ret;
       }
       return ret;
   }

    /**
     * 创建SAP接口属性文件。
     * @param name  ABAP管道名称
     * @param suffix    属性文件后缀
     * @param properties    属性文件内容
     */
    private static void createDataFile(String name, String suffix, Properties properties) {
        File cfg = new File(name + "." + suffix);
        System.out.println(cfg.getPath());
        cfg.delete();
        if (!cfg.exists()) {

            try {
                FileOutputStream fos = new FileOutputStream(cfg, false);
                properties.store(fos, "for test only!");
                fos.close();
            } catch (Exception e) {
                throw new RuntimeException(
                        "Unable to create the destination file:"
                                + cfg.getName());
            }
        }
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值