BAPI与JCO的使用.docx
《BAPI与JCO的使用.docx》由会员分享,可在线阅读,更多相关《BAPI与JCO的使用.docx(15页珍藏版)》请在冰豆网上搜索。
BAPI与JCO的使用
JCO与BAPI学习小节
1.BAPI的使用1
1.1BAPI概念1
1.2BAPI相关界面1
1.3BAPI使用方法5
2.JCO的使用8
2.1JCO简介8
2.2JCO使用8
2.3JCO开发建议10
1.BAPI的使用
1.1BAPI概念
Term/Synonym
Definition
Businessobject(BO)
1.业务对象,封装了与该对象相关的数据与方法;
2.每个业务对象都必须定义关键字段,用于唯一确定一个特定的业务对象;
3.业务对象中某些通用的方法具有标准的定义格式(如getlist);
4.业务对象中定义的方法分为Instance-dependent方法与instance-independent两类。
BusinessObjectRepository
业务对象仓库。
BusinessApplicationProgrammingInterface(BAPI)
1访问R3中业务对象与业务过程的标准编程接口。
2BAPIs定义了BOR中业务对象的方法。
3BAPIs通过RFC-enable的功能模块实现。
4用户可以自行开发新的BAPI以满足业务需求。
1.2BAPI相关界面
1)事务码BAPI:
BAPIExplore
2)双击Functionmodule,可以浏览实现BAPI的功能模块。
3)在该界面,可以浏览该BAPI的IMPORT、EXPORT、TABLE参数,以及功能模块的相关文档。
4)事务码:
swo2:
BusinessObjectBrowser
5)选中业务对象Salesorder,可以以面向对象的方式进行浏览。
(注:
其中只有蓝色的方法是有BAPI实现的,红色的方法不提供BAPI实现)
6)BAPI测试工具,(点下图中注释的界面)
7)该界面可以输入测试数据,测试相关的BAPI。
1.3BAPI使用方法
在ABAP中调用BAPI的方法与调用FunctionModule的方法相同。
只是要注意BAPI函数没有Exception,调用是否成功是通过参数return返回的。
该return参数在不同的BAPI中结构不同,可能是structure,也可能是table,编程时要注意。
下面的程序是ABAP中调用BAPI_SALESORDER_CREATEFROMDAT2的例子。
注意:
1.创建时,订单类性等参数必须使用德语代码
2.必须调用BAPI_TRANSACTION_COMMIT完成整个事务。
3.某些数据必须用辅助结构(负责确定所要更新的数据位)完成数据更新。
(如ORDER_ITEMS_IN和ORDER_ITEMS_INX)
************************************************************************
*Orderheader:
*-Ordertype:
ORImportantyoumustusethegermancodeTA
*-Salesorg:
1000
*-Distrb.chan.:
10
*-Division:
00
*-Soldtoparty:
1032
*-Shiptoparty:
1032
*-Purchorder:
DG-19970626-3
*Orderitem:
*-Material:
P-100
*-Qty:
1
DATA:
*Orderpartners
LI_ORDER_PARTNERSTYPESTANDARDTABLEOFBAPIPARNR,
L_ORDER_PARTNERSLIKEBAPIPARNR,
*Structuresfororderheader
L_ORDER_HEADER_INLIKEBAPISDHD1,
L_ORDER_HEADER_INXLIKEBAPISDHD1X,
*Tablesfororderitems
LI_ORDER_ITEMS_INTYPESTANDARDTABLEOFBAPISDITM,
L_ORDER_ITEMS_INLIKEBAPISDITM,
LI_ORDER_ITEMS_INXTYPESTANDARDTABLEOFBAPISDITMX,
L_ORDER_ITEMS_INXLIKEBAPISDITMX,
*Returntablefrombapicall
LI_RETURNTYPESTANDARDTABLEOFBAPIRET2,
L_RETURNTYPEBAPIRET2,
*Salesdocumentnumber
L_VBELNLIKEBAPIVBELN-VBELN,
*Errorflag
L_ERRFLAG
(1)TYPEC.
START-OF-SELECTION.
*------------------------------------------------------------------
*Buildpartnerinformation
*------------------------------------------------------------------
CLEARL_ORDER_PARTNERS.
L_ORDER_PARTNERS-PARTN_ROLE='AG'."RememberGermancodes!
L_ORDER_PARTNERS-PARTN_NUMB='0000001000'.
APPENDL_ORDER_PARTNERSTOLI_ORDER_PARTNERS.
*------------------------------------------------------------------
*Buildorderheader
*------------------------------------------------------------------
*Updateflag
L_ORDER_HEADER_INX-UPDATEFLAG='I'.
*Salesdocumenttype
L_ORDER_HEADER_IN-DOC_TYPE='TA'."RememberGermancodes!
L_ORDER_HEADER_INX-DOC_TYPE='X'.
*Salesorganization
L_ORDER_HEADER_IN-SALES_ORG='1000'.
L_ORDER_HEADER_INX-SALES_ORG='X'.
*Distributionchannel
L_ORDER_HEADER_IN-DISTR_CHAN='10'.
L_ORDER_HEADER_INX-DISTR_CHAN='X'.
*Division
L_ORDER_HEADER_IN-DIVISION='00'.
L_ORDER_HEADER_INX-DIVISION='X'.
*Purchaseorder
L_ORDER_HEADER_IN-PURCH_NO_C='DG-19970626-300-FLC'.
L_ORDER_HEADER_INX-PURCH_NO_C='X'.
*------------------------------------------------------------------
*Buildorderitem(s)-Only1isusedinthisexample
*------------------------------------------------------------------
*
L_ORDER_ITEMS_IN-ITM_NUMBER='000010'.
L_ORDER_ITEMS_INX-ITM_NUMBER='000010'.
L_ORDER_ITEMS_IN-MATERIAL='P-100'.
L_ORDER_ITEMS_INX-MATERIAL='X'.
L_ORDER_ITEMS_IN-TARGET_QTY='3.000'.
L_ORDER_ITEMS_INX-TARGET_QTY='X'.
L_ORDER_ITEMS_IN-COMP_QUANT=3.
L_ORDER_ITEMS_INX-COMP_QUANT='X'.
APPENDL_ORDER_ITEMS_INTOLI_ORDER_ITEMS_IN.
L_ORDER_ITEMS_INX-UPDATEFLAG='I'.
APPENDL_ORDER_ITEMS_INXTOLI_ORDER_ITEMS_INX.
*------------------------------------------------------------------
*CALLBapi
*------------------------------------------------------------------
CALLFUNCTION'BAPI_SALESORDER_CREATEFROMDAT2'
EXPORTING
ORDER_HEADER_IN=L_ORDER_HEADER_IN
ORDER_HEADER_INX=L_ORDER_HEADER_INX
IMPORTING
SALESDOCUMENT=L_VBELN
TABLES
RETURN=LI_RETURN
ORDER_ITEMS_IN=LI_ORDER_ITEMS_IN
ORDER_ITEMS_INX=LI_ORDER_ITEMS_INX
ORDER_PARTNERS=LI_ORDER_PARTNERS.
END-OF-SELECTION.
*------------------------------------------------------------------
*CheckandwriteReturntable
*------------------------------------------------------------------
CLEARL_ERRFLAG.
WRITE:
/'Salesdcoument:
',L_VBELN.
LOOPATLI_RETURNINTOL_RETURN.
WRITE:
/L_RETURN-TYPE,L_RETURN-MESSAGE(50).
IFL_RETURN-TYPE='E'.
L_ERRFLAG='X'.
ENDIF.
ENDLOOP.
*------------------------------------------------------------------
*Noerrors-Commit
*------------------------------------------------------------------
CLEARL_RETURN.
IFL_ERRFLAGISINITIAL.
CALLFUNCTION'BAPI_TRANSACTION_COMMIT'
EXPORTING
RETURN=L_RETURN
.
WRITE:
/L_RETURN-TYPE,L_RETURN-MESSAGE.
ENDIF.
2.JCO的使用
JCO简介
JCO是JavaConnector的简称,它封装了JAVA-enabledRFC,实现了基于RFC的BAPI与JAVA接口。
它提供结构化的BAPI调用,目前不支持面向对象的开发。
JCO使用
1)类导入
importcom.sap.mw.jco.*;
2)建立R3连接,有两种方法:
a.持久连接
//申明连接
JCO.ClientmConnection;
//初始化连接
mConnection=
JCO.createClient("001",//SAPclient
"",//userid
"****",//password
"EN",//language(nullforthedefaultlanguage)
"",//applicationserverhostname
"00");//systemnumber
//建立连接
try{
mConnection.connect();
}
catch(Exceptionex){
ex.printStackTrace();
System.exit
(1);
}
//关闭连接
mConnection.disconnect();
b.连接池方式
staticfinalStringPOOL_NAME="Pool";
JCO.Poolpool=JCO.getClientPoolManager().getPool(POOL_NAME);
if(pool==null){
OrderedPropertieslogonProperties=
OrderedProperties.load("/logon.properties");
JCO.addClientPool(POOL_NAME,//poolname
5,//maximumnumberofconnections
logonProperties);//properties
mConnection=JCO.getClient(POOL_NAME);
System.out.println(mConnection.getAttributes());
}
catch(Exceptionex){
ex.printStackTrace();
}
。
。
。
。
。
。
finally{
JCO.releaseClient(mConnection);
}
3)获得BAPI方法
JCO.RepositorymRepository;
mRepository=newJCO.Repository("ARAsoft",mConnection);
IFunctionTemplateft=
try{
mRepository.getFunctionTemplate(“BAPI_SALESORDER_GETSTATUS”);
}
catch(Exceptionex){
thrownewException("ProblemretrievingJCO.Functionobject.");
}
//Createafunctionfromthetemplate
jcoFunction=newJCO.Function(ft);
4)设定输入参数
JCO.FieldSalesDocumentField=jcoFunction.getImportParameterList().getField("SALESDOCUMENT");
SalesDocumentField.setValue(iSalesDocument);
5)执行BAPI
mConnection.execute(jcoFunction);
6)处理“return”参数
JCO.StructurejcoBapiReturn=jcoFunction.getExportParameterList().getStructure("RETURN");
if((jcoBapiReturn.getField("TYPE").getValue()).toString().equals("E"))
thrownewException();
7)获得返回值
JCO.TablejcoStatusInfo=jcoFunction.getTableParameterList().getTable("STATUSINFO");
。
。
。
。
。
。
。
8)最后是异常的捕获与处理
JCO开发建议
基于JAVA语言的特征,建议以如下的方式开发JCO应用。
1)主要的类:
输入参数封装到javabean类中,并统一进行有效性检查。
针对所要调用的BAPI建立代理类,将BAPI的业务功能封装起来。
建立一个解释类,负责调用业务功能类,并将参数从javabeans传递到业务功能类。
2)流程: