zoukankan      html  css  js  c++  java
  • [SAP ABAP开发技术总结]业务对象和BAPI

    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(物料):

    image278

    18.3.1.2.       业务对象(BO)设计

    18.3.1.2.1.              创建业务表

    业务对象代表具体的业务数据,因此业务对象类型都有相对应的数据字典结构对应:

    image279

    18.3.1.2.2.              创建业务对象类型

    image280

    image281image282

    系统已自动引用SAP标准接口IFSAP,并从中继承了一些默认的属性和方法

    18.3.1.2.3.              添加(继承)接口

    创建业务对象类型时,除自动默认继承的接口IFSAP外:

    image283

    还可以为业务对象添加(或叫实现吧)其他的SAP接口,业务对象将从接口中自动继承接口里的属性或方法,其中大多方法需要在业务对象中重新实现。将光标放在Interfaces位置,点击按钮image284,添加IFCREATE接口

    注:这些接口类型也是通过SWO1创建的,只是在初始界面选择的是“Interface type(相当于接口)”,而不是“Object type(相当于类)

    同理添加IFEDIT接口,最后结构如下:

    image285

    通过查看继承过来的方法属性,发现只有Create方法是静态的,与实例无关

    18.3.1.2.4.              添加关键字段Key

    关键字段代表着一个业务对象类型的实例,由它来区分各个业务对象,实例业务对象需要此Key

    将鼠标放在“Key fields”所在位置上,点击新建按钮image284[1],系统将提示是否参照ABAP字典中的表结构创建关键字段,本例中的业务对象基于数据库表ZTAB_EMPLOYEE

    image286

    image287

    生成的程序代码:

    image288

    18.3.1.2.5.              添加属性

    将光标置于Attributes所在行,点击新建按钮image284[2]功能,系统将提示是否参照ABAP字典中的表结构创建关键字段:

    image289

    并为每一个属性输入名称之后,各字段将出现在Attributes列表中:

    image290

    image291

    image292

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

    现以报表程序的方式,来重新实现业务对象类型继承过来原有方法(CreateEditDisplay等),业务对象的这些方法将通过提交到该报表的方式来实现这些方法的功能:

    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.         重定义接口与方法实现

    在没有进行重定义之前,这些继承而来的方法名称显示为深红色。将光标置于方法名上,点击image293(即方法的重定义)按钮,每个方法都经过该操作后,底色会变为白色:

    image294

    将光标置于Display方法名上,点击“Program”按钮,提示方法还未进行代码实现:

    image295

    YES后,进行程序代码实现界面,在业务对象的实现程序中添加以下代码:

    image296

    ExistenceCheck方法用于检查对象实现是否存在,如在对象测试界面中,需要选择“Instance”按钮来测试实例相关的一些方法时,如果未实现该方法,则如果输入一个不存在的ID,系统将仍进入实例测试界面,但实例相关的测试功能不可用。正确实现ExistenceCheck方法后,如果指定关键字段的对象不存在,系统将给出消息提示:Object does not exist

     

    其中object变量为前面自动生成的变量,相关代码如下:

    image297

    注:在每次修改程序后,都需要保存并重新生成image298业务对象类型,才能进行测试

    18.3.1.2.6.3.         测试

    image299

    注:测试界面上的屏幕参数就是 Report 程序选择屏幕

    image300 image301

    image302 image303

    18.3.1.2.7.              通过BAPI函数来实现业务对象方法

    本小节将在前面章节的基础上,为业务对象类型添加两个BAPI方法:ZEMPLOYEE_obj.GetList(读取职员列表)和ZEMPLOYEE_obj.GetDetail(读取职员详细信息)。

    BAPI方法与上节中所添加的普通方法是不同的,那些借助于报表程序来实现的CreateEdit等方法,仅可在SAP系统内部使用,但BAPI不同的是可以供非SAP系统对业务对象进行访问

    18.3.1.2.7.1.         创建BAPI参数结构

    BAPI方法ZEMPLOYEE_obj.GetList需要用到的结构类型BAPI自定义结构类型需要以ZBAPI开头——其实BAPI函数、BAPI函数的Group、以及BAPI函数参数参照的结构名称中都需要包含BAPI名称串,另外,BAPI函数参数所参照的表结构类型只能被一个BAPI使用,因为释放BAPI后相应结构会被冻结):

    image304

    BAPI方法ZEMPLOYEE_obj.GetDetail需要用到的结构类型:

    image305

    18.3.1.2.7.2.         创建BAPI函数、BAPI调用返回RETURN结果处理

    先创建函数组 ZEMP,并激活:

    image306

     

    现创建BAPI方法需要调用的两个RFM远程函数:ZBAPI_GET_EMPLOYEE_LISTZBAPI_GET_EMPLOYEE_DETAILZEMPLOYEE_obj.GetListZEMPLOYEE_obj.GetDetail两个BAPI业务方法将借助于这两个BAPI函数来实现。

    image307

    注:BAPI函数中Export必须有return返回参数(约定俗成), BAPI调用成功与否一般通过RETURN参数返回,该参数的数据结构可以参照数据字典结构BAPIRETURN,其重要的字段有:

    l  TYPE              消息类型,如SEWI

    l  ID                            消息类型

    l  NUMBER      消息编号

    l  MESSAGE     消息文本

    l  MESSAGE_V1MESSAGE_V2MESSAGE_V3MESSAGE_V4,消息变量

    image308

     

    在函数组ZEMP LZEMPTOP顶层包含文件中定义全局的数据变量:

    image309

    并为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.   

     

    image310

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

    image311

    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函数创建好后,还需要将该函数绑定到业务对象类型中:

    image312

    创建BAPI的最后一步就是为业务对象类型添加BAPI方法,并将上面创建BAPI函数分配给这些BAPI方法:

    image313

    image314

    image315

    由于BAPI函数中定义了关键字段作为输入参数,当在添加该方法时就默认此方法为实例方法,所以不能选中Instance-independent选项

    点击image316按钮进行下一步操作,设置待加BAPI方法的参数,一般使用建议,与BAPI函数参数相对应:

    image317

    image318

    绿色image319表示为BAPI方法

    image320

    通过相同的方法,创建List BAPI方法,并将ZBAPI_GET_EMPLOYEE_LIST BAPI函数分配给它,由于List为静态方法,所以钩上Instance-independent

    image321

     

    业务对象方法如果是通过BAPI方法来实现的,则实现方式要选择API function,另外还需要指定对应到的BAPI功能模块:

    image322

    18.3.2.           BAPI

    BAPIBusiness Application Process Interface(业务应用编辑接口),它实质上就是一种特殊的RFC函数

     

    BAPI函数及函数参数参考的结构类型名,都要以ZBAPI

    BAPI函数参数只能是传值,不能有ChangeException参数

    BAPI函数需要有Return返回参数

    18.3.2.1.       BAPI浏览器

    image323

     

    image324

     

    image325

    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对象列表:

    image326

    image327

    image328

    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                     创建会计凭证

  • 相关阅读:
    使用IDEA新建Maven项目没有完整的项目结构(src文件夹等等)
    MyBatis:SQL语句中的foreach标签的详细介绍
    嵌入式tomcat例子
    springboot项目创建(myeclipse2017)
    使用javafxpackager将java项目打包成exe
    Spring Boot异常
    myeclipse设置新建菜单file-new选项
    myeclilpse打开文件所在位置的图标消失后的找回方法
    mybatis使用接口方式报错
    SSH中的Dao类继承HibernateDaoSupport后出现异常
  • 原文地址:https://www.cnblogs.com/jiangzhengjun/p/4265534.html
Copyright © 2011-2022 走看看