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

被折叠的 条评论
为什么被折叠?



