SAP JCo BAPI的使用(刘欣) 2009-2-6

本文详细介绍了如何使用SAP JCo库连接SAP服务器,并通过示例讲解了直接连接和连接池连接的方法。此外,还探讨了如何在ABAP环境中创建和调用函数,以及如何利用JCo调用BAPI并处理返回的数据。

//-----------BAPI-------------------
business application programming interface

SAP JCo BAPI的使用(刘欣) 2009-2-6

//----------使用jco调用BAPI------------
1.service.sap.com/connectors上下载jco,3.0使用有点问题,所以使用2007年的jco2.1.8,
在该包中有一个JCo Tutorial.pdf文件,非常详细的讲述了jco的内容.
2.用jco连接sap服务器有两种方式,直接连接和连接池连接(适用于web).

//---------------直接连接服务器的例子----------------
import com.sap.mw.jco.*;
public class direct
{
  public static void main(String[] argv)
  {
JCO.Client mConnection;
mConnection =
JCO.createClient("301", // SAP client
"***", // userid
"*****", // password
"EN", // language (null for the default language)
"190.75.48.88", // application server host name
"00"); // system number
try
{
mConnection.connect();
}
catch (Exception ex)
{
ex.printStackTrace();
System.exit(1);
}
System.out.println(mConnection.getAttributes());
mConnection.disconnect();
  }

//--------------使用pool连接服务器的例子-----------
//注意在这个例子中登陆信息是放到logon.properties文件中读取的
//而OrderedProperties这个类是专门用来读取.properties文件用,需要预先编译
//OrderedProperties类的代码在pdf帮助文件46页:B-3 Utility Class OrderedProperties
//--------下面是logon.properties文件内容--------
jco.client.client=301
jco.client.user=***
jco.client.passwd=*****
jco.client.ashost=190.75.48.88
jco.client.sysnr=00
//---------------下面是程序代码--------------------------
import com.sap.mw.jco.*;
public class usepool
{
static final String POOL_NAME = "Pool";  
public static void main (String args[])
{
  JCO.Client mConnection;
  try
  {
  JCO.Pool pool = JCO.getClientPoolManager().getPool(POOL_NAME);
   if (pool == null)
   {
   OrderedProperties logonProperties =
   OrderedProperties.load("/logon.properties");
   JCO.addClientPool(POOL_NAME, // pool name
   5, // maximum number of connections
   logonProperties); // properties
   }
  mConnection = JCO.getClient(POOL_NAME);
  System.out.println(mConnection.getAttributes());
  JCO.releaseClient(mConnection);
  }
  catch (Exception ex)
  {
  ex.printStackTrace();
  }
}
}
//---连接好服务器后,使用JCO.Repository object仓库对象同BAPI做数据交换---
会使用下面的一下内容
JCo Repository
Function Object
Executing a Function
Accessing a Table
//---------在使用jco之前,应熟悉在本地用BAPI的方式------------
SAP菜单中"工具--业务框架--BAPI开发"目录里包括:
BAPI exploer(BAPI按类型查找)
SW01 业务对象制作
se37可以查看具体某个BAPI的内容,import,export,code.
//----------为熟悉BAPI的调用,应该熟悉funtion的调用------
1.首先,我们用se37做一个小的funtion.这个funtion里有2个入口参数和一个出口参数.
FUNCTION Z_INTEGER_ADD.
*"-----------------------------------
*"*"Local interface:
*"  IMPORTING
*"     REFERENCE(INPUT_1) TYPE  I
*"     REFERENCE(INPUT_2) TYPE  I
*"  EXPORTING
*"     REFERENCE(OUTPUT) TYPE  I
*"------------------------------------
OUTPUT = INPUT_1 + INPUT_2.
ENDFUNCTION.
2.做一段程序去调用.
REPORT Z_CALLING_FUNCTION .
DATA:int1 TYPE i VALUE 3,
     int2 TYPE i VALUE 4,
     sum TYPE i.
    
CALL FUNCTION 'Z_INTEGER_ADD'    
EXPORTING
input_1 = int1
input_2 = int2
IMPORTING
output = sum.
IF sy-subrc = 0.
write sum.
ENDIF.
3.怎么解释主程序中EXPORTING就是FUNCATION中的入口参数.
把主程序看成一个对象,FUNCATION看成一个对象,
首先从主程序提供的出口参数,给FUNCATION.然后FUNCATION接受了,既是入口参数.

4.主程序中要使用FUNCATION中的内表.
由于abap熟悉度不够,实现起来还只有一个一个小功能的做出来.
4.1
//----定义一个内表结构ZTEL_S_J,只有两个字段,用户名和电话号码--------
USERNAME BNAME CHAR 30
TELNUMBER AD_TLNMBR CHAR 30
//--------含有内表的FUNCATION-------------
FUNCTION Z_JAMES_FUNCTION2.
*"---------------------------------------
*"*"Local interface:
*"  TABLES
*"      ITABTEL STRUCTURE  ZTEL_S_J
*"----------------------------------------
*---------------到数据库抓数据------------
select BNAME TEL_NUMBER into table ITABTEL
from ADR2
inner join USR21 on
ADR2~PERSNUMBER = USR21~PERSNUMBER.
ENDFUNCTION.
4.2
//----调用上面的FUNCTION的主程序------
REPORT Z_CALLING_BAPI.
DATA:ITABTEL LIKE TABLE OF ZTEL_S_J WITH HEADER LINE.
CALL FUNCTION 'Z_JAMES_FUNCTION2'
TABLES
  ITABTEL = ITABTEL.
IF sy-subrc = 0.
LOOP AT ITABTEL.
write: / ITABTEL-USERNAME,
         ITABTEL-TELNUMBER.
ENDLOOP.
ENDIF.
4.3
//----------结果---------------
AD1                            68460388
TRN08                          66372877
TXB                            12345678
TRN06                          63303205
WRR                            68460388

上面是在BAPI中取数据,下面我们要调用一下BAPI实现一些功能.
5.1
//-------ABAP用BAPI去新建一个用户---------------
REPORT Z_CALLING_BAPI.
DATA: USERNAME LIKE BAPIBNAME,      "用户名
      PASSWORD LIKE BAPIPWD,        "密码
      LOGONDATA LIKE BAPILOGOND,    "登录数据
      ADDRESS LIKE BAPIADDR3,      "地址信息
      DEFAULTS LIKE BAPIDEFAUL,    "默认
      RETURN LIKE STANDARD TABLE OF BAPIRET2 WITH HEADER LINE,  "返回
START-OF-SELECTION.
USERNAME-BAPIBNAME  = 'zBAPITEST3'.
PASSWORD-BAPIPWD = '123'.
LOGONDATA-GLTGV = ''.
LOGONDATA-GLTGB = ''.
LOGONDATA-USTYP = 'A'.
LOGONDATA-CLASS = ''.
LOGONDATA-ACCNT = ''.
LOGONDATA-TZONE = 'UTC+8'.
LOGONDATA-LTIME = ''.
LOGONDATA-BCODE = ''.
LOGONDATA-CODVN = ''.
ADDRESS-FIRSTNAME = '赵'.
ADDRESS-LASTNAME = '云'.
ADDRESS-TITLE_P = '0002'.
DEFAULTS-DCPFM = 'X'.
DEFAULTS-DATFM = '4'.
CALL FUNCTION 'BAPI_USER_CREATE1'
  EXPORTING
    username         = USERNAME
    logondata        = LOGONDATA
    password         = PASSWORD
    DEFAULTS         = DEFAULTS
    address          = ADDRESS
  tables
    return           = RETURN.
LOOP AT RETURN.
WRITE: / RETURN.
ENDLOOP.
5.2
//-------ABAP用BAPI去改变一个用户角色---------------
REPORT Z_CALLING_BAPI.
DATA: myUSERNAME LIKE BAPIBNAME-BAPIBNAME,      "用户名
      myACTIVITYGROUPS LIKE TABLE OF BAPIAGR WITH HEADER LINE, "角色
      myRETURN LIKE STANDARD TABLE OF BAPIRET2 WITH HEADER LINE,  "返回
START-OF-SELECTION.
myUSERNAME  = 'ZBAPITEST1'.
myACTIVITYGROUPS-AGR_NAME = 'CM5-JHY-001'.
append myACTIVITYGROUPS to myACTIVITYGROUPS.
myACTIVITYGROUPS-AGR_NAME = 'CM5-JHY-002'.
append myACTIVITYGROUPS to myACTIVITYGROUPS.

CALL FUNCTION 'BAPI_USER_ACTGROUPS_ASSIGN'
  EXPORTING
    USERNAME         = myUSERNAME
  TABLES
    ACTIVITYGROUPS   = myACTIVITYGROUPS
    RETURN           = myRETURN.
COMMIT WORK.
LOOP AT myRETURN.
WRITE: / myRETURN.
ENDLOOP.

//--------熟悉在本地ABAP用BAPI的方式到此结束--------


//---jco去调用funcation的结果数据-----------
//---简单的功能那funcation内表中的数据返回到c:\\COMPANYCODE_LIST.html--------
import com.sap.mw.jco.*;
public class usepoolcall
{
static final String POOL_NAME = "Pool";  
public static void main (String args[])
{
  JCO.Client mConnection;
  try
  {
  JCO.Pool pool = JCO.getClientPoolManager().getPool(POOL_NAME);
   if (pool == null)
   {
   OrderedProperties logonProperties =
   OrderedProperties.load("/logon.properties");
   JCO.addClientPool(POOL_NAME, // pool name
   5, // maximum number of connections
   logonProperties); // properties
   }
  mConnection = JCO.getClient(POOL_NAME);
  System.out.println(mConnection.getAttributes());//打印连接属性
  JCO.Repository mRepository;
  mRepository = new JCO.Repository("ARAsoft", mConnection);
  JCO.Function function = mRepository.getFunctionTemplate("Z_JAMES_FUNCTION2").getFunction();
  mConnection.execute(function);
  JCO.Table codes = function.getTableParameterList().getTable("ITABTEL");
  String oldMaxRows = JCO.getProperty("jco.html.table_max_rows");
  JCO.setProperty("jco.html.table_max_rows", "99999");
  codes.writeHTML("c:\\COMPANYCODE_LIST.html");
  JCO.setProperty("jco.html.table_max_rows", oldMaxRows);
  JCO.releaseClient(mConnection);
  }
  catch (Exception ex)
  {
  ex.printStackTrace();
  }
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值