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

目录导航

声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!
原文出自:

18.3.         业务对象和BAPI 184

18.3.1.     SAP业务对象(SWO1)... 184

18.3.1.1.           业务对象类型的组成... 185

18.3.1.2.           业务对象(BO)设计... 185

18.3.1.2.1.       创建业务表... 185

18.3.1.2.2.       创建业务对象类型... 186

18.3.1.2.3.       添加(继承)接口... 186

18.3.1.2.4.       添加关键字段Key. 187

18.3.1.2.5.       添加属性... 187

18.3.1.2.6.       通过报表程序来实现业务对象的方法... 189

18.3.1.2.6.1.    报表程序... 189

18.3.1.2.6.2.    重定义接口与方法实现... 190

18.3.1.2.6.3.    测试... 191

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.2.     BAPI 197

18.3.2.1.           BAPI浏览器... 197

18.3.2.2.           SE37查找:BAPI函数的命名规则... 198

18.3.2.3.           查找某事务码所对应的BAPI 198

18.3.2.4.           常用BAPI函数... 199

18.3.     业务对象和BAPI

18.3.1.           SAP业务对象(SWO1

业务对象类型是业务对象的定义和描述,对象类型(Object Type) 相当于(但不等于)对象设计语言中类(Class) 的概念,它封装了业务功能和数据

业务对象与BAPI早于ABAP OO,通过非面向对象语言,以面向对象的形式设计了业务对象与BAPI

18.3.1.1.       业务对象类型的组成

l       接口:需实现的业务接口,可以是多个

l       关键字段:用于唯一确定一个业务对象类型的实例,通常是业务对象底层数据库表的对应主键

      属性:业务对象的数据部分, 可以是数据表中的字段、运行值(又称虚拟属性, virtual attribute) 或指向其它业务对象的指针(对象引用, object reference)等

      方法:用于操作业务对象属性,可以通过调用事务、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等),业务对象的这些方法将通过提交到该报表的方式来实现这些方法的功能:

REPORT  zbo_employee_rep.
TABLES: ztab_employee.
PARAMETERS: id LIKE ztab_employee-id OBLIGATORY,
            name LIKE ztab_employee-name,
            phone LIKE ztab_employee-phone,
            email LIKE ztab_employee-email,
            op.
START-OF-SELECTION.
  ztab_employee-id = id.
  ztab_employee-name = name.
  ztab_employee-phone = phone.
  ztab_employee-email = email.
  CASE op.
    WHEN ‘I‘."插入数据
      INSERT ztab_employee.
      IF sy-subrc = 0.
        MESSAGE s016(rp) WITH ‘One record inserted.‘.
      ELSE.
        MESSAGE e016(rp) WITH ‘No record inserted,ID existed.‘.
      ENDIF.
    WHEN ‘U‘."更新数据
      UPDATE ztab_employee.
      IF sy-subrc = 0.
        MESSAGE s016(rp) WITH ‘One record updated.‘.
      ELSE.
        MESSAGE e016(rp) WITH ‘No record update,ID not existed.‘.
      ENDIF.
    WHEN ‘V‘."显示数据
      SELECT SINGLE * FROM ztab_employee WHERE id = ztab_employee-id.
      IF sy-subrc = 0.
        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函数添加以下源码:

FUNCTION zbapi_get_employee_list.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  EXPORTING
*"     VALUE(RETURN) TYPE  BAPIRETURN
*"  TABLES
*"     ZEMP_LIST STRUCTURE  ZBAPIEMPLIST
*"----------------------------------------------------------------------
  CLEAR zemp_list.
  REFRESH zemp_list.
  CLEAR return.
  CLEAR ztab_employee.
  SELECT * FROM ztab_employee INTO  CORRESPONDING FIELDS OF TABLE zemp_list.
  IF sy-subrc <> 0. "如果BAPI函数中数据验证不通过,则对返回具有E类型消息的RETURN消息返回内表,则外部主调程序对RETURN内表进行判断,根据RETURN中的结果来决定是否Commit Work
    CLEAR message.
    message-msgty = ‘E‘.
    message-msgid = ‘RP‘.
    message-msgno = 16.
    message-msgv1 = ‘No Employee is available.‘.
    PERFORM set_return_message USING message CHANGING return.
  ENDIF.
ENDFUNCTION.

BAPIRETURN构造:

FORM set_return_message  USING    p_message LIKE message
                         CHANGING p_return LIKE bapireturn.
  CHECK NOT message IS INITIAL.
  CALL FUNCTION ‘BALW_BAPIRETURN_GET‘
    EXPORTING
      type       = p_message-msgty
      cl         = p_message-msgid
      number     = p_message-msgno
      par1       = p_message-msgv1
      par2       = p_message-msgv2
      par3       = p_message-msgv3
      par4       = p_message-msgv4
    IMPORTING
      bapireturn = p_return
    EXCEPTIONS
      OTHERS     = 1.
ENDFORM.

注:此BAPI函数为实例对象业务方法,所以需要在Import设置与业务对象Key一样的参数,如这里的ID(名称与类型最好都一致)

FUNCTION zbapi_get_employee_detail.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(ID) TYPE  ZTAB_EMPLOYEE-ID
*"  EXPORTING
*"     VALUE(ZEMP_DETAIL) TYPE  ZBAPIEMPDETAIL
*"  TABLES
*"      RETURN STRUCTURE  BAPIRETURN
*"----------------------------------------------------------------------
  CLEAR zemp_detail.
  CLEAR return.
  CLEAR ztab_employee.
  SELECT SINGLE * FROM ztab_employee INTO  CORRESPONDING FIELDS OF zemp_detail WHERE id = id.
  IF sy-subrc <> 0.
    CLEAR message.
    message-msgty = ‘E‘.
    message-msgid = ‘RP‘.
    message-msgno = 16.
    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                     创建会计凭证

时间: 2024-10-17 00:47:58

[SAP ABAP开发技术总结]业务对象和BAPI的相关文章

ABAP开发顾问必备:SAP ABAP开发技术总结

声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4260224.html 该文档是根据我过去多年学习文档与工作文档总结而成,项目开发过程中我都会参考此文档,主要ABAP很多细节上的东西不可能你记得很牢固,或者你记得一时,但过不了几天做别的项目就会

[SAP ABAP开发技术总结]ABAP程序之间数据共享与传递

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 19.             数据共享与传递... 222 19.1.         程序调用.会话.SAP/ABAP内存 关系... 222 19.2.         ABAP Memory数据共享... 224 19.2.1.     EXPORT. 224 19.2.2.     IMPORT. 226 19.2.3.     DELETE. 227 19.3

[SAP ABAP开发技术总结]BAPI调用

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 18.3.2.5.           调用BAPI 199 18.3.2.5.1.       BAPI事务处理... 200 18.3.2.5.2.       外部系统(Java)调用BAPI函数... 201 18.3.2.5.2.1.    直连.连接池... 201 18.3.2.5.2.2.    访问结构... 202 18.3.2.5.2.3.    访

[SAP ABAP开发技术总结]ABAP读取写XML文件

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 20.6.         XML. 236 20.6.1.     生成... 237 20.6.2.     解析... 240 20.6.     XML if_ixml if_ixml_documentif_ixml_node if_ixml_element if_ixml_istream if_ixml_ostream document.element.ATTR

[SAP ABAP开发技术总结]数据输入输出转换、小数位/单位/货币格式化

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 15.             数据格式化.转换... 123 15.1.         数据输入输出转换... 123 15.1.1.     输出时自动转换... 123 15.1.2.     输入时自动转换... 124 15.1.3.     通过转换规则输入输出函数手动转换... 124 15.2.         数量小位数格式化... 125 15.2.

[SAP ABAP开发技术总结]IDoc

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 18.4.         IDoc. 206 18.4.1.     数据段类型和数据段定义(WE31)... 206 18.4.2.     IDoc定义(WE30)... 207 18.4.3.     自定义IDoc发送与接收实例... 208 18.4.3.1.           发送端800(outbound)配置... 208 1.创建segment(WE

[SAP ABAP开发技术总结]客户端文本文件、Excel文件上传下载

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 客户端文本文件或Excel文件导入与导出... 1 TEXT_CONVERT_XLS_TO_SAP. 1 ALSM_EXCEL_TO_INTERNAL_TABLE. 3 SAP_CONVERT_TO_XLS_FORMAT. 5 客户端文本文件或Excel文件导入与导出 TEXT_CONVERT_XLS_TO_SAP TEXT_CONVERT_XLS_TO_SAP函数可以将

[SAP ABAP开发技术总结]ABAP调优——Open SQL优化

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 11.1.     数据库编程方面优化 1.   不要使用 SELECT * ...,选择需要的字段, SELECT * 既浪费CPU,又浪费网络带宽资源,还需占用大量的ABAP内存 2.   不要使用SELECT DISTINCT ...,会绕过缓存,可使用 SORT BY + DELETE ADJACENT DUPLICATES 代替 3.   少用相关子查询,因为子

[SAP ABAP开发技术总结]选择屏幕——SELECT-OPTIONS

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 12.4.         SELECT-OPTIONS. 89 12.4.1.     输入ABAP程序默认值时,需要加上“=”. 89 12.4.2.     选择条件内表多条件组合规则... 89 12.4.3.     使用SELECT-OPTIONS替代PARAMETERS. 90 12.4.     SELECT-OPTIONS SELECT-OPTIONS