SAP接口编程 之 JCo3.0系列(03) : Table参数

Table参数作为export parameter

BAPI_COMPANYCODE_GETDETAIL是一个适合演示的函数,没有import paramter参数,调用后COMPANYCODE_GETDETAIL 表参数返回SAP系统中所有公司代码的清单。只包括公司代码ID和公司代码名称两个字段。

JCo中,与表参数相关的两个接口是JCoTableJCoRecordMetaDta, JCoTable就是RFM中tabl参数,而JCoRecordMetaDtaJCoTableJCoStructure的元数据。

在.net环境中,我喜欢将IRfcTable转换成DataTable,但Java没有类似的数据结构,所以决定直接在方法中传递JCoTable算了。但为了方便显示,可以考虑使用一个通用代码进行输出:

package jco3.utils;

import com.sap.conn.jco.JCoField;
import com.sap.conn.jco.JCoRecordMetaData;
import com.sap.conn.jco.JCoTable;

public class JCoUtils
{
    public static void printJCoTable(JCoTable jcoTable)
    {
        // header

        // JCoRecordMeataData is the meta data of either a structure or a table.
        // Each element describes a field of the structure or table.
        JCoRecordMetaData tableMeta = jcoTable.getRecordMetaData();
        for(int i = 0; i < tableMeta.getFieldCount(); i++){
            System.out.print(String.format("%s\t", tableMeta.getName(i)));
        }
        System.out.println(); // new line

        // line items

        for(int i = 0; i < jcoTable.getNumRows(); i++){
            // Sets the row pointer to the specified position(beginning from zero)
            jcoTable.setRow(i);

            // Each line is of type JCoStructure
            for(JCoField fld : jcoTable){
                System.out.print(String.format("%s\t", fld.getValue()));
            }
            System.out.println();
        }
    }
}

要点说明

对JCoTable,输出表头和行项目。表头通过获取JCoTable的meta-data,然后使用meta-data的getName()方法。

JCoRecordMetaData tableMeta = jcoTable.getRecordMetaData();
for(int i = 0; i < tableMeta.getFieldCount(); i++){
      System.out.print(String.format("%s\t", tableMeta.getName(i)));
}

JCoTable每一行都是一个JCoStructure,可以通过setRow()设置指针的位置,然后再遍历各个field:

        for(int i = 0; i < jcoTable.getNumRows(); i++){
            // Sets the row pointer to the specified position(beginning from zero)
            jcoTable.setRow(i);

            // Each line is of type JCoStructure
            for(JCoField fld : jcoTable){
                System.out.print(String.format("%s\t", fld.getValue()));
            }
            System.out.println();
        }

完成输出之后,接下来就是RFM调用:

package jco3.demo5;

import org.junit.Test;
import com.sap.conn.jco.*;
import jco3.utils.JCoUtils;

public class JCoTableDemo
{
    public JCoTable getCocdList() throws JCoException
    {
        /**
         * Get company code list in SAP
         * using BAPI BAPI_COMPANYCODE_GETLIST.
         *
         * Since JCoTable is rather flexible, we simply use
         * this interface as return value
         */

        JCoDestination dest = JCoDestinationManager.getDestination("ECC");
        JCoFunction fm = dest.getRepository().getFunction("BAPI_COMPANYCODE_GETLIST");
        fm.execute(dest);

        JCoTable companies = fm.getTableParameterList().getTable("COMPANYCODE_LIST");

        return companies;
    }

    @Test
    public void printCompanies() throws JCoException
    {
        JCoTable companies = this.getCocdList();
        JCoUtils.printJCoTable(companies);
    }
}

Table参数作为import parameter

table作为输入参数,主要解决填充table的问题,基本模式如下:

someTable.appendRow();
someTable.setValue("FLDNAME", someValue);

以RFC_READ_TABLE为例,读取SAP USR04表。

package jco3.demo5;

import org.junit.Test;
import com.sap.conn.jco.*;
import jco3.utils.JCoUtils;

public class JCoTableAsImport
{
    public JCoTable readTable() throws JCoException
    {
        /**
         * Shows how to process JCoTable (as importing)
         */

        JCoDestination dest = JCoDestinationManager.getDestination("ECC");
        JCoFunction fm = dest.getRepository().getFunction("RFC_READ_TABLE");

        // table we want to query is USR04
        // which is user authorization table in SAP
        fm.getImportParameterList().setValue("QUERY_TABLE", "USR04");

        // output data will be delimited by comma
        fm.getImportParameterList().setValue("DELIMITER", ",");

        // processing table parameters
        JCoTable options = fm.getTableParameterList().getTable("OPTIONS");
        // modification date >= 2012.01.01 and <= 2015.12.31
        options.appendRow();
        options.setValue("TEXT", "MODDA GE ‘20120101‘ ");
        options.appendRow();
        options.setValue("TEXT", "AND MODDA LE ‘20151231‘ ");

        // We only care about fields of [user id] and [modification date]
        String[] outputFields = new String[] {"BNAME", "MODDA"};
        JCoTable fields = fm.getTableParameterList().getTable("FIELDS");
        int count = outputFields.length;
        fields.appendRows(count);
        for (int i = 0; i < count; i++){
            fields.setRow(i);
            fields.setValue("FIELDNAME", outputFields[i]);
        }

        fm.execute(dest);

        JCoTable data = fm.getTableParameterList().getTable("DATA");

        return data;
    }

    @Test
    public void printUsers() throws JCoException
    {
        JCoTable users = this.readTable();
        JCoUtils.printJCoTable(users);
    }
}

在代码中我们使用了两种方法来插入table的行项目,第一种方法:

JCoTable options = fm.getTableParameterList().getTable("OPTIONS");
// modification date >= 2012.01.01 and <= 2015.12.31
options.appendRow();
options.setValue("TEXT", "MODDA GE ‘20120101‘ ");
options.appendRow();
options.setValue("TEXT", "AND MODDA LE ‘20151231‘ ");

第二种方法:

String[] outputFields = new String[] {"BNAME", "MODDA"};
JCoTable fields = fm.getTableParameterList().getTable("FIELDS");
int count = outputFields.length;
fields.appendRows(count);
for (int i = 0; i < count; i++){
    fields.setRow(i);
    fields.setValue("FIELDNAME", outputFields[i]);
}

JCoTable重要方法总结

jcoTable_methods.gif

文/StoneWM(简书作者)
原文链接:http://www.jianshu.com/p/a088510cf965
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

时间: 2024-08-11 09:48:01

SAP接口编程 之 JCo3.0系列(03) : Table参数的相关文章

SAP接口编程 之 JCo3.0系列(04) : 会话管理

在SAP接口编程之 NCo3.0系列(06) : 会话管理 这篇文章中,对会话管理的相关知识点已经说得很详细了,请参考.现在用JCo3.0来实现. 1. JCoContext 如果SAP中多个函数需要在一个session中运行,需要JCoContext来提供保证.如果在同一个线程中,大体模式这样: JCoContext.begin(sapDestination); fm1.execute(sapDestination); fm2.execute(sapDestination); JCoConte

SAP接口编程 之 JCo3.0系列(05) : Exception Handling

JCO3.0的Exception,常用的Exception如下: JCoException 继承自java.lang.Exception,是JCo3中Exception的基类. JCoRuntimeException 继承自java.lang.RuntimeException,是JCo3中Runtime的基类. 参考文档 以下是JCo3比较有价值的参考文档 JCo3.0在线帮助http://help.sap.com/saphelp_nwce711/helpdata/en/46/fb807cc7b

SAP接口编程之 NCo3.0之RfcDestination(转)

转载地址:http://www.jianshu.com/p/5a5b4de5e1f1 http://www.jianshu.com/u/fd37d4449963 进入新的系列:.net connector 3.0,简称Nco3.0.Nco3.0是SAP针对.net平台提供的编程接口,由nco1.0/nco2.0演变而来.如果使用.net平台编程,推荐使用nco3.0,3.0和之前1.0/2.0比较,不管是API还是架构,都重新设计过,也借鉴了Jco3.0的设计,所以相对来说比较成熟,给程序员提供

2690036 - SAP HANA 2.0 SPS 03 Database Revision 034

Symptom This is the SAP Release Note for SAP HANA 2.0 Database Revision 034 (2.00.034.00) of the SAP HANA platform software Support Package Stack (SPS 03). Please refer to the following SAP Notes: SAP Note 2380229 - SAP HANA Platform 2.0 - Central No

LXD 2.0 系列(四):资源控制

LXD 提供了各种资源限制.其中一些与容器本身相关,如内存配额.CPU 限制和 I/O 优先级.而另外一些则与特定设备相关,如 I/O 带宽或磁盘用量限制.-- Stéphane Graber 本文导航 -可用资源限制03% -磁盘08% -CPU12% -内存21% -网络 I/O26% -块 I/O29% -它怎么工作?39% -应用这些限制43% -CPU47% -内存58% -磁盘和块 I/O63% -网络 I/O71% -获取当前资源使用率81% -总结92% -更多信息94% 编译自

面向接口编程

系列——MEF实现设计上的“松耦合”(终结篇:面向接口编程) 序:忙碌多事的八月带着些许的倦意早已步入尾声,金秋九月承载着抗战胜利70周年的喜庆扑面而来.没来得及任何准备,似乎也不需要任何准备,因为生活不需要太多将来时.每天忙着上班.加班.白加班,忘了去愤,忘了去算计所谓的价值.天津爆炸事故时刻警示着我们生命的无常,逝者安息,活着的人生活还得继续,珍惜生命,远离伤害.武汉,这座炙热的城市,虽值金秋,却依然经受着“秋老虎”的烘烤,马路上蒸腾的热气迎面袭来,全身毛孔张开,汗流不止,在这般高温下,似乎

java io系列03之 ByteArrayOutputStream的简介,源码分析和示例(包括OutputStream)

前面学习ByteArrayInputStream,了解了“输入流”.接下来,我们学习与ByteArrayInputStream相对应的输出流,即ByteArrayOutputStream.本章,我们会先对ByteArrayOutputStream进行介绍,在了解了它的源码之后,再通过示例来掌握如何使用它. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_03.html ByteArrayOutputStream 介绍 ByteArrayOutpu

Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 概要 上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayList.先对ArrayLis

线程系列03,多线程共享数据,多线程不共享数据

多线程编程,有时希望每个线程的数据相互隔离互不影响,有时却希望线程间能共享数据,并保持同步.本篇体验多线程共享和不共享数据. □ 多线程不共享数据 对于多线程,CLR到底是怎样为它们分配内存栈空间呢?是"一个萝卜一个坑",每个线程都有自己的栈空间:还是"大树底下好乘凉",所有的线程共享同一个栈空间? 我们让2个线程执行相同的静态方法,用到相同的变量,通过打印变量来求证多线程栈空间的分配情况. class Program { static void Main(stri