J代码调用操作SAP创建

简介: 首先在我们自己的maven项目中,提供一个属性配置文件如下图所示,提供SAP足够权限用户的用户名密码等信息

首先在我们自己的maven项目中,提供一个属性配置文件
如下图所示,提供SAP足够权限用户的用户名密码等信息
image
然后测试java代码
TestNG代码如下

package com.tsmi.hibernate.utils;

import org.testng.annotations.Test;

import com.sap.mw.jco.JCO;

public class ConfigUtilTest {
  @Test
  public void f() {
     
        String clientV = ConfigUtil.getProperty("SAP_CLIENT");
        String user = ConfigUtil.getProperty("SAP_USRE");
        String pwd = ConfigUtil.getProperty("SAP_PASSWORD");
        String lang = ConfigUtil.getProperty("SAP_LANG");
        String ipAddress = ConfigUtil.getProperty("SAP_IPADDRESS");
        String sync = ConfigUtil.getProperty("SAP_SYSNR");
        System.out.println("ConfigUtilTest测试类信息:--clientV is: " + clientV + " ;user is: " + user + " ;pwd is: " + pwd + " ;lang is: " + lang
                + " ;ipAddress is: " + ipAddress + "--");
        
        //测试java端从SAP获取待检单的数据
        //测试输入参数建议: 172.16.10.80上生产机PRD 采购组:911;供应商编号:20108007;日期:当天;
        try {
            /*
            JCO.Table output = SAPfunction.getDJDinfo("911", "20108007", "20180408", "1000");

            System.out.println("----getCapacity():返回值的容量,预定返回值内表一条记录包含23个元素-----" + output.getCapacity());
            System.out.println("----getFieldCount():" + output.getFieldCount());
            System.out.println("----getName():SAP中Function的返回值的参数名称----" + output.getName());
            System.out.println("----getFieldCount():返回值中的记录数" + output.getNumRows());

            
            if (output.getNumRows() > 0) {
                do {
                    String sEBELN = (String) output.getValue("EBELN");
                    String sEBELP = (String) output.getValue("EBELP");
                    String sMATNR = (String) output.getValue("MATNR");
                    String sTXZ01 = (String) output.getValue("TXZ01");
                    String sKGY = (String) output.getValue("KGY");
                    String sLGORT = (String) output.getValue("LGORT");
                    System.out.println(
                            sEBELN + "--" + sEBELP + "--" + sMATNR + "--" + sTXZ01 + "--" + sKGY + "--" + sLGORT);
                } while (output.nextRow());

            } else {
                System.out.println("!!请检查java端输入参数,因为从SAP返回的记录数为0!!");
            }
            */
                   //上面的代码都没有什么用
            //测试向SAP传递一颗物料(慎重使用)
                   //本次测试的核心代码
            SAPfunction.sendMToSAP();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
  }
}

上述代码执行后,SAP端会创建一个物料
下面展示一下创建物料的java代码内容

package com.tsmi.hibernate.utils;

import java.util.Vector;
import com.sap.mw.jco.IFunctionTemplate;
import com.sap.mw.jco.JCO;

/**
 * @author Administrator
 * 涉及到LIFNR MATNR PERNR等SAP中的编号字段,请确保java端或者abap端进行了前导零的补齐或者删除
 * 
 */
public class SAPfunction {
    
    /**
     * 从SAP获取待检单数据
     * 输入参数: 采购组+供应商编号+过账日期+工厂
     * 返回值:JCO.Table的实例
     * @throws Exception 
     */
    public static JCO.Table getDJDinfo(String sEKGRP,String sLIFNR,String sBUDAT,String sWERKS) throws Exception {
        
        JCO.Client mConnection = SAPClientUtil.getConnectedClient();
        JCO.Function function = SAPClientUtil.createFunction("Z_PLM_DJD", mConnection);
        JCO.Table input = function.getTableParameterList().getTable("ITAB_INPUT");
        input.appendRow();

        setDJDInput(input, sEKGRP, sLIFNR, sBUDAT, sWERKS);

        mConnection.execute(function);
        // 返回值
        JCO.Table output = function.getTableParameterList().getTable("ITAB_MSEG_MKPF");
        output.firstRow();

        return output;
    }
    
    public static void setDJDInput(JCO.Table input,String sEKGRP,String sLIFNR,String sBUDAT,String sWERKS){
        // 172.16.10.89上测试机DEV 采购组:902;供应商编号:20002012;日期:20120921;
        // 172.16.10.80上生产机PRD 采购组:911;供应商编号:20108007;日期:当天;
        input.setValue(sEKGRP, "EKGRP");             //采购组
        input.setValue(sLIFNR, "LIFNR");             //供应商编号
        input.setValue(sBUDAT, "BUDAT");              //过账日期
        input.setValue(sWERKS, "WERKS");             //工厂
    }
    
    
    /**
     * 核心方法:发送物料到ERP系统
     * @param part
     * @param mark
     * @return
     * @throws Exception
     */
    public static String sendMToSAP() throws Exception{
        
        boolean mark = false;
        StringBuffer buf = new StringBuffer();
        //获取SAP中Function Module的连接参数
        JCO.Client mConnection = SAPClientUtil.getConnectedClient();
        //使用参数和Fucntion name创建Function Module的实例
        JCO.Function function = SAPClientUtil.createFunction("Z_PDM_MATERIAL", mConnection);//函数名
        //获取SAP中Function Module的输入参数
        JCO.Table input = function.getTableParameterList().getTable("IM_TAB");
        
        input.appendRow();
        //为输入参数提供数据,核心语句input.setValue(bianma, "MATNR");     //物料编码
        setTableValue(input);
        mark = true;

        if(mark){
            //执行SAP的Function Module
            mConnection.execute(function);
            JCO.Table output = function.getTableParameterList().getTable("IT_RETURN");
            output.firstRow();
            do{
                String flag = (String)output.getValue("TYPE");
                String number = (String)output.getValue("MATNR");
                String message = (String)output.getValue("MESSAGE");
                //log.debug("number:" + number + ";flag:" + flag + ";message:" + message);
                if(flag.equals("E")){
                    if(message.trim().length() > 0)
                        buf.append("物料编号为:" + number + " 的物料,传送erp失败。message:" + message + "\n");
                }
            }while(output.nextRow());
        }
        if(buf.toString().length() == 0){
            buf.append("success");
        }
        return buf.toString();
    }
    //所创建物料的具体参数
    public static void setTableValue(JCO.Table input){
        
        String factory = "";
        double penqimianji = 0;
        double zhongliang = 0;
        String bianma = "";
        String miaoshu = "";
        String zhongyaodu = "01";
        String chanpinxinghao = "产品型号";
        
        //String type = TypeIdentifierUtility.getTypeIdentifier(part).getTypename();

        factory = "1000";
        penqimianji = 2.2;
        zhongliang = 3.3;
        // 物料编码
        bianma = "BJBPJAVA2018122901";
        // 物料描述
        miaoshu = "由java代码创建的物料1";
        String xinghao = "型号1";
        String unit = "KG";
        
        unit = toERPUnit(unit);
        
        input.setValue(bianma, "MATNR");     //物料编码
        input.setValue(miaoshu, "MAKTX");     //物料描述
        input.setValue(unit, "MEINS");          //单位
        input.setValue("Z201", "MTART");     //物料类型
        input.setValue(penqimianji, "VOLUM");//涂装面积
        input.setValue(zhongliang, "NTGEW"); //重量
        input.setValue(zhongyaodu, "TEMPB"); //重要度
        input.setValue(chanpinxinghao, "WRKST");     //产品型号
        input.setValue("1000", "PRCTR");     //利润中心
        input.setValue(factory, "WERKS");     //工厂
    }
    
    public static String toERPUnit(String unit){
        if(unit.equals("EA")){
            return "EA";
        }else if(unit.equals("KG")){
            return "KG";
        }else if(unit.equals("M")){
            return "M";
        }else if(unit.equals("L")){
            return "L";
        }else if(unit.equals("SQ_M")){
            return "M2";
        }else if(unit.equals("MIN")){
            return "MIN";
        }else if(unit.equals("CU_M")){
            return "M3";
        }else if(unit.equals("KM")){
            return "KM";
        }else if(unit.equals("MM")){
            return "MM";
        }else if(unit.equals("CAN")){
            return "CAN";
        }else if(unit.equals("DEG")){
            return "DEG";
        }else if(unit.equals("BLANK")){
            return "EA";
        }else if(unit.equals("PC")){
            return "PC";
        }else{
            return "";
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

上述代码首先调用其它对象的方法,连接了SAP
下面这个对象中的方法,用来连接SAP

package com.tsmi.hibernate.utils;

import java.util.HashMap;
import java.util.Map;

import com.sap.mw.jco.IFunctionTemplate;
import com.sap.mw.jco.JCO;
import com.tsmi.hibernate.utils.ConfigUtil;

public class SAPClientUtil {

    public static JCO.Client getConnectedClient(){
    
        String clientV = ConfigUtil.getProperty("SAP_CLIENT");
        String user = ConfigUtil.getProperty("SAP_USRE");
        String pwd = ConfigUtil.getProperty("SAP_PASSWORD");
        String lang = ConfigUtil.getProperty("SAP_LANG");
        String ipAddress = ConfigUtil.getProperty("SAP_IPADDRESS");
        String sync = ConfigUtil.getProperty("SAP_SYSNR");
        JCO.Client client = JCO.createClient(clientV, user, pwd, lang, ipAddress, sync);
        client.connect();
        return client;
        
    }

    public static JCO.Function createFunction(String name, JCO.Client client) throws Exception {
        JCO.Repository repository = new JCO.Repository("ARAsoft", client);
        try {
            IFunctionTemplate ft = repository.getFunctionTemplate(name.toUpperCase());
            if (ft == null)
                return null;
            return ft.getFunction();
        } catch (Exception ex) {
            throw new Exception("Problem retrieving JCO.Function object.");
        }
    }
    
    public static JCO.Table callRFC(String funcName, String paramName, String paramValue, String returnTab) throws Exception{
        Map<String, String> params = new HashMap<String, String>();
        params.put(paramName, paramValue);
        
        return callRFC(funcName, params, returnTab);
    }
    
    public static JCO.Table callRFC(String funcName, String paramName, String paramValue, String returnTab, JCO.Client client) throws Exception{
        Map<String, String> params = new HashMap<String, String>();
        params.put(paramName, paramValue);
        
        return callRFC(funcName, params, returnTab, client);
    }
    
    public static JCO.Table callRFC(String funcName, Map<String, String> params, String returnTab) throws Exception{
        return callRFC(funcName, params).getTableParameterList().getTable(returnTab);
    }
    
    public static JCO.Table callRFC(String funcName, Map<String, String> params, String returnTab, JCO.Client client) throws Exception{
        return callRFC(funcName, params, client).getTableParameterList().getTable(returnTab);
    }
    
    public static JCO.Function callRFC(String funcName, Map<String, String> params) throws Exception{
        JCO.Client client = null;
        try{
            client = SAPClientUtil.getConnectedClient();
            return callRFC(funcName, params, client);
        }catch(Exception e){
            throw e;
        }finally{
            if(client != null){
                client.disconnect();
                client = null;
            }
        }
    }
    
    public static JCO.Function callRFC(String funcName, Map<String, String> params, JCO.Client client) throws Exception{
        client = SAPClientUtil.getConnectedClient();
        JCO.Function function = createFunction(funcName, client);
        JCO.ParameterList input = function.getImportParameterList();
        if(params != null){
            for(String key : params.keySet())
                input.setValue(params.get(key), key);
        }
        
        client.execute(function);
        return function;
    }
}

下面这个对象的方法,用来获取properties文件,用来得到创建RFC连接所需要的用户名密码

package com.tsmi.hibernate.utils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;

//import wt.log4j.LogR;

/**
 * 配置文件工具类
 * @author Li Banggui
 *
 */
public class ConfigUtil {
    
    //private static final Logger logger = LogR.getLogger(ConfigUtil.class.getName());

    // 配置属性
    private static final String CONFIGFILE = "/integration.properties";        //配置文件路径
    private static Properties configs = new Properties();
    private static long lastModified = 0;            //文件更新时间
    private static long lastCheckModified = 0;        //最后一次检查文件更新时间
    private static long checkModifiedInteval = 1000 * 60 * 5;    //检查文件更新间隔
    // 加载配置属性
    static {
        confirmLatest();
    }

    /**
     * 获取配置文件URL
     * @return
     */
    public static URL getConfigFileUrl() {
        URL url = ConfigUtil.class.getResource(CONFIGFILE);
        return url;
    }
    
    public static InputStream getConfigAsStream() {
        URL url = getConfigFileUrl();
        try {
            return url != null ? url.openStream() : null;
        } catch (IOException e) {
            return null;
        }
    }

    /**
     * 确认配置文件内容最新,若不是最新,则重新读取
     * 
     */
    private static synchronized void confirmLatest(){
        //logger.debug("******* check latest: " + System.currentTimeMillis() + ", " + lastCheckModified + ", " + lastModified + ", " + checkModifiedInteval);
        if(System.currentTimeMillis() - lastCheckModified<checkModifiedInteval)
            return;
        lastCheckModified = System.currentTimeMillis();
        InputStream is = null;
        try {
            URL url = getConfigFileUrl();
            
            long modified = getFileLastModified(url);
            //logger.debug("**** new modified: " + modified);
            if(modified>lastModified){
            //    logger.debug("****** 系统配置文件更新,重新读取......");
                lastModified = modified;
                is = url.openStream();
                Properties tempps = new Properties();
                tempps.load(is);
                configs.clear();
                for (Enumeration item = tempps.keys(); item.hasMoreElements();) {
                    try {
                        String key = (String) item.nextElement();
                        String viewkey = new String(key.getBytes("ISO-8859-1"), "GB2312");
                        String value = new String(tempps.getProperty(key).getBytes("ISO-8859-1"), "GB2312");
                        configs.put(viewkey, value);
                    } catch (UnsupportedEncodingException e) {
                    //    logger.error("读取系统默认配置文件内容错误", e);
                    }
                }
                String strCheckModifiedInteval = configs.getProperty("checkModifiedInteval");
                try{
                    if(strCheckModifiedInteval!=null)
                        checkModifiedInteval = (long) (Float.parseFloat(strCheckModifiedInteval) * 60 * 1000);
                }catch(Exception e){
                    //logger.error("系统配置刷新频率错误", e);
                }
            }
        } catch (IOException e) {
            //logger.error("打开系统默认配置文件错误", e);
        } finally {
            if(is!=null) IOUtils.closeQuietly(is);
        }
    }
    
    /**
     * 获取文件修改时间
     * @param url
     * @return
     * @throws UnsupportedEncodingException
     */
    private static long getFileLastModified(URL url) throws UnsupportedEncodingException{
        File file = new File(URLDecoder.decode(url.getFile(),"UTF-8"));
        return file.lastModified();
    }

    /**
     * 获取配置属性值
     *
     * @param key
     * @return
     */
    public static String getProperty(String key) {
        confirmLatest();
        if (key == null) {
            return null;
        }
        return configs.getProperty(key);
    }

    /**
     * 获取配置属性值
     *
     * @param key
     * @return
     */
    public static String getProperty(String key, String defaultValue) {
        confirmLatest();
        if (key == null) {
            return defaultValue;
        }
        return configs.getProperty(key, defaultValue);
    }

    /**
     * 获取一组以相同前缀开头的key对应的值
     * 
     * @param keyPrex
     * @return
     */
    public static Map<String,String> getSimilarProperties(String keyPrex) {
        confirmLatest();
        Map<String,String> result = new HashMap<String,String>();
        for (Enumeration item = configs.keys(); item.hasMoreElements();) {
            String key = (String) item.nextElement();
            if (key.toLowerCase().startsWith(keyPrex.toLowerCase())) {
                result.put(key, (String) configs.get(key));
            }
        }
        return result;
    }
}

这就是全部
运行结果
image
image

image
image
image

目录
相关文章
|
7月前
|
存储 供应链 应用服务中间件
什么是 SAP 产品的 Sizing 操作
什么是 SAP 产品的 Sizing 操作
49 0
|
7月前
|
存储
使用 ABAP 代码获得 SAP 系统支持的所有 language 列表
使用 ABAP 代码获得 SAP 系统支持的所有 language 列表
31 0
|
7月前
使用 ABAP 代码删除指定 SAP CRM 系统里 Opportunity 订单的文本
使用 ABAP 代码删除指定 SAP CRM 系统里 Opportunity 订单的文本
47 0
|
1月前
|
存储
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
21 0
|
7月前
|
XML JavaScript 前端开发
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示试读版
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示试读版
66 0
|
4月前
|
Web App开发 开发者
5. 问题解答:SAP Fiori Launchpad 点了 Logout 之后,背后都运行了哪些代码
5. 问题解答:SAP Fiori Launchpad 点了 Logout 之后,背后都运行了哪些代码
27 0
|
6月前
SAP CRM note 的修改操作实现
SAP CRM note 的修改操作实现
36 0
|
6月前
|
安全 数据库
SAP ABAP 动态生成 ABAP 程序并动态调用的例子代码试读版
SAP ABAP 动态生成 ABAP 程序并动态调用的例子代码试读版
34 0
|
6月前
|
API
SAP OData V2 和 V4 里针对日期类型的字段进行过滤操作(filter)的正确语法试读版
SAP OData V2 和 V4 里针对日期类型的字段进行过滤操作(filter)的正确语法试读版
45 1
|
7月前
|
存储 数据处理 数据库
关于 SAP CRM User Status 处理的示例 ABAP 代码
关于 SAP CRM User Status 处理的示例 ABAP 代码
26 0