[SAP ABAP开发技术总结]业务对象和BAPI

18.3.1.2.6. 通过报表程序来实现业务对象的方法... 189
18.3.1.2.6.2. 重定义接口与方法实现... 190
18.3.1.2.7. 通过BAPI函数来实现业务对象方法... 192
18.3.1.2.7.1. 创建BAPI参数结构... 192
18.3.1.2.7.2. 创建BAPI函数、BAPI调用返回RETURN结果处理... 193
18.3.1.2.7.3. 将BAPI函数绑定到相应的业务方法... 195
18.3. 业务对象和BAPI
18.3.1. SAP业务对象(SWO1)
业务对象类型是业务对象的定义和描述,对象类型(Object Type) 相当于(但不等于)对象设计语言中类(Class) 的概念,它封装了业务功能和数据
业务对象与BAPI早于ABAP OO,通过非面向对象语言,以面向对象的形式设计了业务对象与BAPI
18.3.1.1. 业务对象类型的组成
l 接口:需实现的业务接口,可以是多个
l 关键字段:用于唯一确定一个业务对象类型的实例,通常是业务对象底层数据库表的对应主键
l 属性:业务对象的数据部分, 可以是数据表中的字段、运行值(又称虚拟属性, virtual attribute) 或指向其它业务对象的指针(对象引用, object reference)等
l 方法:用于操作业务对象属性,可以通过调用事务、function module、 report 或ABAP程序来实现方法,即业务方法的实现方法有多种
l 事件:状态的改变,可通过事件触发工作流或任务
业务对象类型也是可以继承的,如业务对象类型BUS1001006(标准物料)和BUS1001001(零售物料)的父类型都是BUS1001(物料):
18.3.1.2. 业务对象(BO)设计
18.3.1.2.1. 创建业务表
业务对象代表具体的业务数据,因此业务对象类型都有相对应的数据字典结构对应:
18.3.1.2.2. 创建业务对象类型
系统已自动引用SAP标准接口IFSAP,并从中继承了一些默认的属性和方法
18.3.1.2.3. 添加(继承)接口
创建业务对象类型时,除自动默认继承的接口IFSAP外:
还可以为业务对象添加(或叫实现吧)其他的SAP接口,业务对象将从接口中自动继承接口里的属性或方法,其中大多方法需要在业务对象中重新实现。将光标放在Interfaces位置,点击按钮,添加IFCREATE接口
注:这些接口类型也是通过SWO1创建的,只是在初始界面选择的是“Interface type(相当于接口)”,而不是“Object type(相当于类)”
同理添加IFEDIT接口,最后结构如下:
通过查看继承过来的方法属性,发现只有Create方法是静态的,与实例无关
18.3.1.2.4. 添加关键字段Key
关键字段代表着一个业务对象类型的实例,由它来区分各个业务对象,实例业务对象需要此Key
将鼠标放在“Key fields”所在位置上,点击新建按钮,系统将提示是否参照ABAP字典中的表结构创建关键字段,本例中的业务对象基于数据库表ZTAB_EMPLOYEE:
生成的程序代码:
18.3.1.2.5. 添加属性
将光标置于Attributes所在行,点击新建按钮功能,系统将提示是否参照ABAP字典中的表结构创建关键字段:
并为每一个属性输入名称之后,各字段将出现在Attributes列表中:
18.3.1.2.6. 通过报表程序来实现业务对象的方法
18.3.1.2.6.1. 报表程序
现以报表程序的方式,来重新实现业务对象类型继承过来原有方法(Create、Edit、Display等),业务对象的这些方法将通过提交到该报表的方式来实现这些方法的功能:
.
WRITE:/ 'Employee No:',ztab_employee-id,
/ 'Employee Name:',ztab_employee-name,
/ 'Employee Phone:',ztab_employee-phone,
/ 'Employee Email:',ztab_employee-email.
ENDIF.
ENDCASE.
18.3.1.2.6.2. 重定义接口与方法实现
在没有进行重定义之前,这些继承而来的方法名称显示为深红色。将光标置于方法名上,点击(即方法的重定义)按钮,每个方法都经过该操作后,底色会变为白色:
将光标置于Display方法名上,点击“Program”按钮,提示方法还未进行代码实现:
YES后,进行程序代码实现界面,在业务对象的实现程序中添加以下代码:
ExistenceCheck方法用于检查对象实现是否存在,如在对象测试界面中,需要选择“Instance”按钮来测试实例相关的一些方法时,如果未实现该方法,则如果输入一个不存在的ID,系统将仍进入实例测试界面,但实例相关的测试功能不可用。正确实现ExistenceCheck方法后,如果指定关键字段的对象不存在,系统将给出消息提示:Object does not exist。
其中object变量为前面自动生成的变量,相关代码如下:
注:在每次修改程序后,都需要保存并重新生成业务对象类型,才能进行测试
18.3.1.2.6.3. 测试
注:测试界面上的屏幕参数就是 Report 程序选择屏幕
18.3.1.2.7. 通过BAPI函数来实现业务对象方法
本小节将在前面章节的基础上,为业务对象类型添加两个BAPI方法:ZEMPLOYEE_obj.GetList(读取职员列表)和ZEMPLOYEE_obj.GetDetail(读取职员详细信息)。
BAPI方法与上节中所添加的普通方法是不同的,那些借助于报表程序来实现的Create、Edit等方法,仅可在SAP系统内部使用,但BAPI不同的是可以供非SAP系统对业务对象进行访问。
18.3.1.2.7.1. 创建BAPI参数结构
BAPI方法ZEMPLOYEE_obj.GetList需要用到的结构类型(BAPI自定义结构类型需要以ZBAPI开头——其实BAPI函数、BAPI函数的Group、以及BAPI函数参数参照的结构名称中都需要包含BAPI名称串,另外,BAPI函数参数所参照的表结构类型只能被一个BAPI使用,因为释放BAPI后相应结构会被冻结):
BAPI方法ZEMPLOYEE_obj.GetDetail需要用到的结构类型:
18.3.1.2.7.2. 创建BAPI函数、BAPI调用返回RETURN结果处理
先创建函数组 ZEMP,并激活:
现创建BAPI方法需要调用的两个RFM远程函数:ZBAPI_GET_EMPLOYEE_LIST和ZBAPI_GET_EMPLOYEE_DETAIL,ZEMPLOYEE_obj.GetList、ZEMPLOYEE_obj.GetDetail两个BAPI业务方法将借助于这两个BAPI函数来实现。
注:BAPI函数中Export必须有return返回参数(约定俗成), BAPI调用成功与否一般通过RETURN参数返回,该参数的数据结构可以参照数据字典结构BAPIRETURN,其重要的字段有:
l TYPE, 消息类型,如S、E、W、I
l ID, 消息类型
l NUMBER, 消息编号
l MESSAGE, 消息文本
l MESSAGE_V1、MESSAGE_V2、MESSAGE_V3、MESSAGE_V4,消息变量
在函数组ZEMP 的LZEMPTOP顶层包含文件中定义全局的数据变量:
并为ZBAPI_GET_EMPLOYEE_LIST函数添加以下源码:
.
message-msgv1 = 'No Employee is available.'.
PERFORM set_return_message USING message CHANGING return.
ENDIF.
ENDFUNCTION.
BAPIRETURN构造:
FORM set_return_message .
ENDFORM.
注:此BAPI函数为实例对象业务方法,所以需要在Import设置与业务对象Key一样的参数,如这里的ID(名称与类型最好都一致)
.
message-msgv1 = 'Employee does not exist.'.
PERFORM set_return_message USING message CHANGING return.
ENDIF.
ENDFUNCTION.
18.3.1.2.7.3. 将BAPI函数绑定到相应的业务方法
为什么在RFC函数创建好后,还需要将该函数绑定到业务对象类型中:
创建BAPI的最后一步就是为业务对象类型添加BAPI方法,并将上面创建BAPI函数分配给这些BAPI方法:
由于BAPI函数中定义了关键字段作为输入参数,当在添加该方法时就默认此方法为实例方法,所以不能选中Instance-independent选项
点击按钮进行下一步操作,设置待加BAPI方法的参数,一般使用建议,与BAPI函数参数相对应:
绿色表示为BAPI方法
通过相同的方法,创建List BAPI方法,并将ZBAPI_GET_EMPLOYEE_LIST BAPI函数分配给它,由于List为静态方法,所以钩上Instance-independent:
业务对象方法如果是通过BAPI方法来实现的,则实现方式要选择API function,另外还需要指定对应到的BAPI功能模块:
18.3.2. BAPI
BAPI:Business Application Process Interface(业务应用编辑接口),它实质上就是一种特殊的RFC函数
BAPI函数及函数参数参考的结构类型名,都要以ZBAPI开
BAPI函数参数只能是传值,不能有Change与Exception参数
BAPI函数需要有Return返回参数
18.3.2.1. BAPI浏览器
18.3.2.2. SE37查找:BAPI函数的命名规则
BAPI对应的功能模块命名规则BAPI_<业务对象名>_<method>,因此可以直接在SE37中通过前缀BAPI加对象名称或方法名称作为关键字,快速查找一个BAPI功能模块函数。如检索 BAPI*Material*Get*
18.3.2.3. 查找某事务码所对应的BAPI
如果只知道事物代码,可以通过下面的方式查询相应的BAPI。例如找创建销售(物料模板根据此方法好像找不出)订单的BAPI,我们知道事物代码是VA01:
1. 我们进入VA01 界面,找到system status
2. 在事物代码位置上双击(注:不是程序上双击),找到PACKAGE VA
3. 用SE80打开包 VA ,或点击 Display Object List按钮直接进入到SE80对象列表:
18.3.2.4. 常用BAPI函数
BAPI_TRANSACTION_COMMIT COMMIT WORK AND WAIT.
BAPI_TRANSACTION_ROLLBACK ROLLBACK WORK.
BAPI_MATERIAL_SAVEDATA创建及更改物料主数据
BAPI_GOODSMVT_CREATE 物料移动(创建物料凭证 )
BAPI_MATERIAL_AVAILABILITY 可用库存
BAPI_PR_CREATE 创建PR (采购申请)
BAPI_PO_CREATE1 创建PO(采购单)
BAPI_SALESORDER_CREATEFROMDAT2 创建销售订单
BAPI_OUTB_DELIVERY_CREATE_SLS 根据销售订单创建交货单
BAPI_BILLINGDOC_CREATEMULTIPLE 创建发票
BAPI_ACC_DOCUMENT_POST 创建会计凭证
[SAP ABAP开发技术总结]业务对象和BAPI的更多相关文章
- ABAP开发顾问必备:SAP ABAP开发技术总结
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- ABAP开发顾问必备:SAP ABAP开发技术总结[转载]
转载自SAP师太技术博客,原文链接:http://www.cnblogs.com/jiangzhengjun/p/4260224.html 在原文上增加了链接,此文及此文的链接版权都归SAP师太所有. ...
- [SAP ABAP开发技术总结]OPEN SQL
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [SAP ABAP开发技术总结]内表操作
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [SAP ABAP开发技术总结]ABAP程序之间数据共享与传递
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [SAP ABAP开发技术总结]字符串处理函数、正则表达式
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [SAP ABAP开发技术总结]BAPI调用
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [SAP ABAP开发技术总结]面向对象OO
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [SAP ABAP开发技术总结]数据输入输出转换、小数位/单位/货币格式化
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
随机推荐
- Tomcat内存溢出解决办法
使用Java程序从数据库中查询大量的数据时出现异常:java.lang.OutOfMemoryError: Java heap space在JVM中如果98%的时间是用于GC且可用的 Heap siz ...
- java中的拷贝(二)深克隆
浅拷贝(Object类中的clone()方法)是指在拷贝对象时,对于基本数据类型的变量会重新复制一份,而对于引用类型的变量只是对引用进行拷贝. 深拷贝(或叫深克隆) 则是对对象及该对象关联的对象内容, ...
- 【python cookbook】【数据结构与算法】1将序列分解为单独的变量
如果对象是可迭代的(任何序列),则可以进行分解操作,包括元组.列表.字符串.文件.迭代器以及生成器,可通过简单的一个赋值操作分解为单独的变量. 唯一要求:变量的总数和序列相吻合,否则将出错: Pyth ...
- exe文件打开方式(恢复EXE文件关联)
文件关联损坏常常是计算机病毒造成的,目前网络上有很多相关修复工具,相对来说,System Repair Engineer 支持的修复格式是比较齐全的,这个工具可以在http://www.kztechs ...
- Serializable 序列化
序列化是指将对象实例的状态存储到存储媒体的过程.在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流.在随后对对象进行反序列化时,将创建出与 ...
- 理解Linux中断 (1)【转】
转自:http://blog.csdn.net/tommy_wxie/article/details/7425685 版权声明:本文为博主原创文章,未经博主允许不得转载. 一直认为,理解中断是理解内核 ...
- linux下异步IO的简单例子【转】
转自:http://blog.chinaunix.net/uid-24567872-id-87677.html 首先,贴一下异步IO中用的的一些结构体,因为平常很少用,整理起来方便查看. aio.h中 ...
- js获取IP地址方法总结_转
js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338.html 1,js取得IP地址 ...
- ectouch第六讲 之表常用链接
ECTouch1.0 常用链接:精品属性商品mobile/index.php?m=default&c=category&type=best 新品属性商品mobile/index.php ...
- sharepoint 开发
1. 客户端界面搜索 <div> 业务员:<).match(reg); ]);return null; } function search() { var k=document.ge ...