美文网首页首页投稿(暂停使用,暂停投稿)
SAP接口编程 之 JCo3.0系列(02) : JCo Cli

SAP接口编程 之 JCo3.0系列(02) : JCo Cli

作者: Stone0823 | 来源:发表于2016-04-07 23:38 被阅读821次

    JCo3.0调用SAP函数的过程

    大致可以总结为以下步骤:

    • 连接至SAP系统
    • 创建JcoFunction接口的实例(这个实例代表SAP系统中相关函数)
    • 设置importing参数
    • 调用函数
    • 从exporting参数或者table参数获取数据

    代码:

    package jco3.demo4;
    
    import org.junit.Test;
    import com.sap.conn.jco.JCoDestination;
    import com.sap.conn.jco.JCoDestinationManager;
    import com.sap.conn.jco.JCoException;
    import com.sap.conn.jco.JCoField;
    import com.sap.conn.jco.JCoFunction;
    import com.sap.conn.jco.JCoRepository;
    import com.sap.conn.jco.JCoStructure;
    
    public class RFC
    {   
        public void getCompanyCodeDetail(String cocd) throws JCoException
        {
            // JCoDestination instance represents the backend SAP system
            JCoDestination dest = JCoDestinationManager.getDestination("ECC");
            
            // JCoFunction instance is the FM in SAP we will use
            JCoRepository repository = dest.getRepository();        
            JCoFunction fm = repository.getFunction("BAPI_COMPANYCODE_GETDETAIL");
            if (fm == null){
                throw new RuntimeException("Function does not exists in SAP system.");          
            }   
            
            // set import parameter(s)
            fm.getImportParameterList().setValue("COMPANYCODEID", cocd);
            
            // call function
            fm.execute(dest);
            
            // get company code detail from exporting parameter 'COMPANYCODE_DETAIL'
            JCoStructure cocdDetail = fm.getExportParameterList()
                                        .getStructure("COMPANYCODE_DETAIL");
            
            this.printStructure(cocdDetail);        
        }   
    
        private void printStructure(JCoStructure jcoStru)
        {       
            for(JCoField field : jcoStru){
                System.out.println(String.format("%s\\t%s", 
                        field.getName(), 
                        field.getString()));
            }
        }
        
        @Test
        public void test() throws JCoException
        {
            this.getCompanyCodeDetail("Z900");
        }
    }
    

    JCoFunction接口说明

    • JCoFunction是一个接口,代表SAP系统的函数
    • JCoFunction包含importing参数,exporting参数,changing参数,table参数。分别使用getImportParameterList方法,getExportParameterList方法,getChangingParameterList方法和getTableParameterList获得。这些方法的返回值都是JCoParameter类型
    • JCoFunction.execute方法实际执行函数

    如何创建JCoFunction对象

    上面的代码是第一种创建JCoFunction实例的方法:

    JCoRepository repository = dest.getRepository();    
    JCoFunction fm = dest.getRepository().getFunction("BAPI_COMPANYCODE_GETDETAIL");
    

    如果我们不关心JCoRepository,也可以这样写:

    JCoFunction fm = dest.getRepository().getFunction("BAPI_COMPANYCODE_GETDETAIL");
    

    第三种方法是使用JCoFunctionTemplate.getFunction方法,JCoFunctionTemplate也是一个接口,代表SAP函数的meta-data。

    JCoFunctionTemplate fmTemplate 
                = dest.getRepository().getFunctionTemplate("BAPI_COMPANYCODE_GETDETAIL");
    JCoFunction fm = fmTemplate.getFunction();
    

    JCoStructure接口

    BAPI_COMPANY_CODE_GETDETAIL函数的COMPANYCODE_DETAIL参数是一个结构,刚才我们看到遍历结构所有字段的方式:

    private void printStructure(JCoStructure jcoStru)
    {       
        for(JCoField field : jcoStru){
            System.out.println(String.format("%s\\t%s", 
                    field.getName(), 
                    field.getString()));
        }
    }
    

    因为JCoStructure实现了Iterable接口,所以可以采取上面的办法进行迭代。另外一种方法进行遍历:

    private void printStructure2(JCoStructure jcoStructure)
    {
        for (int i = 0; i < jcoStructure.getMetaData().getFieldCount(); i++){
            System.out.println(String.format("%s\\t%s", 
                    jcoStructure.getMetaData().getName(i),
                    jcoStructure.getString(i)));
        }
    }
    

    相关文章

      网友评论

        本文标题:SAP接口编程 之 JCo3.0系列(02) : JCo Cli

        本文链接:https://www.haomeiwen.com/subject/sicvlttx.html