通过DI连接SAP实现添加单据功能


一、What is DI ?

数据接口API (DI API)是一组开发工具,它使SAP业务合作伙伴能够增强和扩展SAP Business One,以及将外部解决方案与SAP Business One应用程序集成。

二、步骤

1.配置连接信息静态文件

application-config.properties:

#数据库IP地址
appconfig.server = ***************
#数据库名称
appconfig.companyDB = ********
#数据库用户名
appconfig.dbUsername = **
#数据库密码
appconfig.dbPassword = ****
#Bo用户名
appconfig.userName = *******
#Bo密码
appconfig.password = ****
#sldServerc
appconfig.sldServer = ***************:40000
#licenseServer
appconfig.licenseServer = ***************:30000
#数据库类型
appConfig.dbServerType = BoDataServerTypes_dst_MSSQL2012

2.引入读取配置文件工具类

AppConfig.java:

package com.avatech.dahupt.demo.model.applicationConfig;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix="appconfig")
@PropertySource(value= {"classpath:application-config.properties"}, encoding = "utf-8")
public class AppConfig {

    private String server;

    private String companyDB;

    private String userName;

    private String password;

    private String dbUsername;

    private String dbPassword;

    private String sldServer;

    private String licenseServer;

    private String dbServerType;

    public String getServer() {
        return server;
    }

    public void setServer(String server) {
        this.server = server;
    }

    public String getCompanyDB() {
        return companyDB;
    }

    public void setCompanyDB(String companyDB) {
        this.companyDB = companyDB;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getDbUsername() {
        return dbUsername;
    }

    public void setDbUsername(String dbUsername) {
        this.dbUsername = dbUsername;
    }

    public String getDbPassword() {
        return dbPassword;
    }

    public void setDbPassword(String dbPassword) {
        this.dbPassword = dbPassword;
    }

    public String getSldServer() {
        return sldServer;
    }

    public void setSldServer(String sldServer) {
        this.sldServer = sldServer;
    }

    public String getLicenseServer() {
        return licenseServer;
    }

    public void setLicenseServer(String licenseServer) {
        this.licenseServer = licenseServer;
    }

    public String getDbServerType() {
        return dbServerType;
    }

    public void setDbServerType(String dbServerType) {
        this.dbServerType = dbServerType;
    }
}

3.引入连接工具类

import com.avatech.dahupt.demo.model.applicationConfig.AppConfig;
import com.avatech.edi.common.exception.DBException;
import com.sap.smb.sbo.api.ICompany;
import com.sap.smb.sbo.api.SBOCOMConstants;
import com.sap.smb.sbo.api.SBOCOMUtil;
import com.sap.smb.sbo.api.SBOErrorMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Field;

public class BoConnect {

    private volatile static ICompany company = null;
    private volatile static BoConnect boConnect = null;

    private static final Logger LOG = LoggerFactory.getLogger(BoConnect.class);

    private String server;
    private String companyDB;
    private String userName;
    private String password;
    private String licenseServer;
    private String sldServer;
    private String dbUsername;
    private String dbPassword;
    private String dbServerType;

    private BoConnect(AppConfig appConfig){
        this.server = appConfig.getServer();
        this.companyDB = appConfig.getCompanyDB();
        this.userName = appConfig.getUserName();
        this.password = appConfig.getPassword();
        this.licenseServer = appConfig.getLicenseServer();
        this.sldServer = appConfig.getSldServer();
        this.dbUsername = appConfig.getDbUsername();
        this.dbPassword = appConfig.getDbPassword();
        this.dbServerType = appConfig.getDbServerType();
    }

    public final static BoConnect getInstance(AppConfig appConfig){
        synchronized (BoConnect.class) {
            if (null == boConnect ) {
                boConnect = new BoConnect(appConfig);
            }
        }
        return boConnect;
    }
    public ICompany getCompany(){
        try{
            if(company == null || !company.isConnected()){
                company = connect();
            }
        }catch (Exception ex){
            throw new DBException("-1",ex.getMessage());
        }
        return  company;
    }

    private ICompany connect(){
        if(company == null)
            company = SBOCOMUtil.newCompany();
        company.setServer(this.server);
        company.setCompanyDB(this.companyDB);
        company.setUserName(this.userName);
        company.setPassword(this.password);
        try{
            Class<?> clz = SBOCOMConstants.class;
            Field[] fields = clz.getDeclaredFields();
            for (int j = 0; j < fields.length; j++) {
                if(fields[j].getName().equals(this.dbServerType)){
                    company.setDbServerType(Integer.parseInt(fields[j].get(SBOCOMConstants.class).toString()));
                }
            }
        }catch (Exception ex){
            company.setDbServerType(SBOCOMConstants.BoDataServerTypes_dst_MSSQL2008);
        }

        company.setUseTrusted(false);
        company.setLanguage(15);
        company.setDbUserName(this.dbUsername);
        company.setDbPassword(this.dbPassword);
        company.setSLDServer(this.sldServer);
        company.setLicenseServer(this.licenseServer);
        int connectionResult = company.connect();
        if (connectionResult != 0) {
            SBOErrorMessage errMsg = company.getLastError();
            throw new DBException("-1","Cannot connect to server: " + this.companyDB + errMsg.getErrorCode()+ " "+ errMsg.getErrorMessage());
        }
        LOG.info("连接成功>>>"+company.getCompanyDB());
        return company;
    }
}

4.创建model、Service、ServiceImpl、controller层

model:

//销售订单
public class Order {
    private String cardCode;
    private Date docDueDate;
    private String comment;

    private List<OrderLines> orderLines;

    public String getCardCode() {
        return cardCode;
    }

    public void setCardCode(String cardCode) {
        this.cardCode = cardCode;
    }

    public Date getDocDueDate() {
        return docDueDate;
    }

    public void setDocDueDate(Date docDueDate) {
        this.docDueDate = docDueDate;
    }

    public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }

    public List<OrderLines> getOrderLines() {
        return orderLines;
    }

    public void setOrderLines(List<OrderLines> orderLines) {
        this.orderLines = orderLines;
    }
}

//销售订单-行
public class OrderLines {
    private String itemCode;

    private Double quantity;

    public String getItemCode() {
        return itemCode;
    }

    public void setItemCode(String itemCode) {
        this.itemCode = itemCode;
    }

    public Double getQuantity() {
        return quantity;
    }

    public void setQuantity(Double quantity) {
        this.quantity = quantity;
    }
}

Service.java:

//AppConfig 是读取配置文件工具类 Order 是实体类对象
void AddSAP(AppConfig appConfig, Order order);

ServiceImpl.java:

@Override
    public void AddSAP(AppConfig appConfig, Order order){
    	//连接对象
        BoConnect boConnect = null;
        //公司对象
        ICompany company = null;
        //要添加单据的对象对象可在帮助文档中进行查找(SDK搜索BoObjectTypes Enumeration)
        IDocuments orders =  null;
        try{
            boConnect = BoConnect.getInstance(appConfig);
            company = boConnect.getCompany();
            orders =  SBOCOMUtil.newDocuments(company, SBOCOMConstants.BoObjectTypes_Document_oOrders);
            orders.setCardCode(order.getCardCode());//客户、供应商代码
            orders.setDocDueDate(order.getDocDueDate());//交货日期
            orders.setComments(order.getComment());//备注

            int count = 0;
            for (OrderLines ol:order.getOrderLines()) {
                if(count != 0){
                    orders.getLines().add();
                }
                orders.getLines().setItemCode(ol.getItemCode());
                orders.getLines().setQuantity(ol.getQuantity());
                count++;
            }
            //新增操作
            if(orders.add() == 0){
                System.out.println("生成销售订单成功,单据编号:" + company.getNewObjectKey());
            }else {
                System.out.println("生成销售订单失败,错误代码:" + company.getLastErrorCode() + ",错误描述:"+company.getLastErrorDescription());
            }
        }catch (Exception ex){
            throw new DBException("-1",ex.getMessage());
        }
    }

Controller.java:

@RestController
@RequestMapping("/v1/demo/*")
public class Controller{

	@Autowired
    private Service service;
    
    @Autowired
    private AppConfig appConfig;

	@GetMapping("OrderAddSap")
	public @ResponseBody void AddSAP(){
		System.out.println("开始执行......");
		try {
			//模拟插入SAP数据
			Order order = null;
			order.setCardCode("A101");
			Date date = new Date();
	        order.setDocDueDate(date);
	        order.setComment("bean  add");
	        List<OrderLines> orderLinesList = new ArrayList<>();
	        
	        OrderLines orderLines =new OrderLines();
	        orderLines.setItemCode("BD00444");
	        orderLines.setQuantity(1.0);
	        orderLinesList.add(orderLines);
	
	        orderLines =new OrderLines();
	        orderLines.setItemCode("BD00443");
	        orderLines.setQuantity(2.0);
	        orderLinesList.add(orderLines);
	
	        order.setOrderLines(orderLinesList);
			//调用添加SAP Service接口
	    	service.AddSAP(appConfig,order);
	    }catch (Exception ex) {
	    	throw new DBException("5001", ex.getMessage());
	   	}
	}
}

三、附.SAP DI API下载链接

https://download.csdn.net/download/qq_35844400/18800546

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值