声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4292120.html

业务对象(BO)设计

创建数据结构(SE11)

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

创建业务对象类型(SWO1)

业务对象类型就相当于Class的概念

新建业务对象类型

系统已自动引用SAP标准接口IFSAP,并从中继承了一些默认的属性和方法。新建的对象类型名称旁边有一个标记,表示对象目前状态为Modeled。

业务对象及组件共有四种状态

l  Modeled:已建模,业务对象和组件已经创建,但没有程序实现其功能

l  Implemented:已实现,业务对象和组件的程序已经创建(生成),但还没有完成

l  Released:已发布,程序代码完成,该对象及组件可以使用

l  Obsolete:已废弃,该对象不应继续使用

将新创建的业务对象状态修改为Implemented

将光标放在业务对象类型名所在行,选择以下菜单:

系统提示:

标记不存在

查看业务对象的实现代码

点击“Program”按钮,则可查看该业务对象类型的程序代码实现部分ZBO_EMPLOYEE:

添加接口

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

)外,还可以为业务对象添加(或叫实现吧)其他的SAP接口,业务对象将从接口中自动继承它里面的属性或方法,其中的方法大多需要在业务对象中重新实现。

将光标放在Interfaces位置,点击新建按钮,添加IFCREATE接口:

注:添加接口时,这些接口都是已经存在的,否则是不能直接在这里输入的。这些接口类型也是通过SWO1创建的,只是在初始界面选择的是“Interface type(相当于接口)”,而不是“Object type(相当于类)”:

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

在添加 IFCREATE接口时,会自动在Methods中将接口中的 Create方法继承过来;同理,IFEDIT接口中的EDIT方法也会继承过来

通过查看继承过来的方法属性,发现只有Create方法是静态的,与实例无关,这是因为在创建业务对象实例时,相当于工厂方法,是用来产生数据的,与具体业务数据无关:

添加关键字段Key

关键字段代表着一个业务对象类型的实例,由它来区分各个业务对象在测试业务对象时,从业务对象类型测试界面切换到业务对象实例界面时,需要输入此Key值。另外,在通过“Utilties->API Methods->Add Method”菜单添加BAPI方法时,分配的BAPI函中如果定义了关键字段作为输入参数,当在添加该方法时就默认此方法为实例方法,所以不能选中Instance-independent选项

将鼠标放在“Key fields”所在位置上,点击新建按钮,系统将提示是否参照ABAP字典中的表结构创建关键字段,本例中的业务对象基于数据库表ZTAB_EMPLOYEE,所以在系统的 Create with Data Dictionary Field Proposals对话框中选择数据表ZTAB_EMPLOYEE

如果以前一些步骤中未将业务对象的状态设置为implemented”,则该字段的旁边也会有一个标记,可以将光标置于该字段后,选择以下菜单,将该组件的状态修改为“implemented”:

将光标置于该关键字段处,点击“Program”按钮,可以查看其代码实现,它参照了数据库表ZTAB_EMPLOYEE的ID字段:

添加属性

这里的属性与上面的关键字段实质上等同于Java类里的属性,因为业务对象类型就是类的概念

将光标置于Attributes所在行,点击新建按钮功能,系统将提示是否参照ABAP字典中的表结构创建关键字段,可以按照与添加关键字段类似的步骤将全部其他数据库表字段作为属性添加到业务对象组件中:

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

同时,选择属性字段后,点击“Program”按钮,可以查看与之相关的实现代码,下面是从数据库表取数据并填充到这些属性字段的过程:

设置默认属性和方法

选择可以在Default选项卡中设定对象的默认属性和方法:

默认属性与方法有什么用???当访问一个业务对象类型实例时(如在显示列表中双击一个实例),则会调用此方法及传递设置的默认属性????

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

业务对象类型中的方法与Java类型的方法实质上是同一个概念,只是真正实现这些方法的方式有很多种,如下:

例如,可以首先创建一个报表程序或者某个事务代码,然后在方法中直接提交此报表程序或调用事务;还可以在函数模块中完成所需要的功能,然后通过借助该功能模块来实现该方法,将业务对象的属性作为输入参数传递给功能模块,并接收功能返回的输出参数。

在没有进行重定义之前,这些继承而来的方法名称显示为深红色:

选中某个方法后,可以点击“Program”按钮来查看原有方法的实现,但绝大多数代码不能直接在当前新的业务对象中使用,需要重新实现。

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

现以报表程序的方式,来重新实现业务对象类型继承过来原有方法(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.

重定义接口方法

将光标置于方法名上,点击(即方法的重定义)按钮,每个方法都经过该操作后,底色会变为白色:

对这三个从接口继承过来的方法进行重定义后,再次选择“Program”功能,将无法看到接口中定义的实现代码,系统将提示该方法尚未通过程序实现。如果在实现这些方法之前点击按钮来生成业务对象类型时,则将现在错误提示信息:

然后可以通过以下菜单来查看具体错误:

实现方法

此小节将以上小节三个重定义方法进行实现。

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

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

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

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

测试业务对象

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

会出现按钮,点击此按钮,进入到测试初始界面,此时对象尚未实例化(即此时只显示那些与业务对象实例无关的方法如Create方法——该方法不需要传递Key值):

点击Create方法后面的按钮,则会提交到zbo_employee_rep报表程序,此报表程序会运行并显示选择屏幕,在选择屏幕中输入要插入的数据,继续运行该报表,即可向数据库表ZTAB_EMPLOYEE插入一条数据(即一个业务对象),录入的数据的选择屏幕如下:

当创建完一条数据后,点击“Instance”,输入一个存在的ID,即可切换到业务对象实例界面,可以继续对非静态方法,如Display、Edit方法进行继续测试:

 

为业务对象(BO)添加BAPI方法(通过BAPI函数来实现业务对象方法)

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

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

BAPI方法支持从当前SAP系统的外部进行访问,并可以就用于工作流、数据对象的ALE、批量传输等过程

创建BAPI参数的数据结构

BAPI方法ZEMPLOYEE_obj.GetList需要用到的结构类型(BAPI自定义结构类型需要以ZBAPI开头):

这里只需返回员工ID与Name。

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

创建具有RFC功能的BAPI函数(RFM)

BAPI函数是可通过远程调用RFC的函数

现创建BAPI方法需要调用的两个RFM远程函数:ZBAPI_GET_EMPLOYEE_LIST和ZBAPI_GET_EMPLOYEE_DETAIL,ZEMPLOYEE_obj.GetList、ZEMPLOYEE_obj.GetDetail两个BAPI方法将借助于这两个BAPI函数来实现。

创建函数组 ZEMP

创建功能模块ZBAPI_GET_EMPLOYEE_LIST

BAPI函数名须以Zbapi开头

注:BAPI函数中Export必须有return返回参数(约定俗成)

由于函数组ZEMP是新创建的,所以在激活刚创建ZBAPI_GET_EMPLOYEE_LIST时,不能只单独对它进行激活,而是应该点击按钮,切换到SE80后,对函数组整体激活,否则激活时出错:

The main program of the function "ZBAPI_GET_EMPLOYEE_LIST" does notbegin with "FUNCTION-POOL".

点Goto->Global Data菜单,或者LZEMPTOP顶层包含文件:LZEMPTOP,在此包含文件中定义全局的数据变量

并为ZBAPI_GET_EMPLOYEE_LIST函数添加以下源码:

.
    message-msgv1 = 'No Employee is available.'.
    PERFORM set_return_message USING message CHANGING return.
  ENDIF.
ENDFUNCTION.

并双击set_return_message方法,创建LZEMPF01包含文件,并在此Include文件中添加此Form方法:

.
ENDFORM.

测试函数:

创建功能模块ZBAPI_GET_EMPLOYEE_DETAIL

注:如果此RFM函数将用实例化业务对象,则需要在Import设置与业务对象Key一样的参数,如这里的ID(名称与类型最好都一致)

.
    message-msgv1 = 'Employee does not exist.'.
    PERFORM set_return_message USING message CHANGING return.
  ENDIF.
ENDFUNCTION.

测试:

将BAPI函数绑定到相应的业务对象方法上

创建BAPI的最后一步就是在业务对象中添加BAPI方法,将上面创建BAPI函数分配给这些BAPI方法,为它们提供实现。

选择以下菜单添加BAPI方法,并给它分配BAPI函数:

注:也可以通过普通方式添加BAPI方法,即将光标置于Methods上后点击新建按钮,此时需要手工设定BAPI支持属性才行。

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

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

点击按钮进行下一步操作完成

选中此方法,点击“Program”按钮,可以看到其实现代码。系统调用BAPI函数ZBAPI_GET_EMPLOYEE_DETAIL,并通过宏定义SWC_SET_ELEMENT 设定工作流系统相关的容器元素:

创建完后,可以双击方法,弹出属性框,在ABAP标签里发现确实是借助于ABAP函数ZBAPI_GET_EMPLOYEE_DETAIL来实现GetDetail BAPI方法的:

通过相同的方法,创建List BAPI方法,并将ZBAPI_GET_EMPLOYEE_LIST BAPI函数分配给它:

测试BAPI方法

当所有BAPI方法添加完后,点击按钮,重新生成一下,通过之后,会出现按钮。

对创建的的BAPI方法进行测试,其结果就与在SE37中测试的结果完全相同:

业务对象(BO)设计的更多相关文章

  1. Web API核查表:设计、测试、发布API时需思考的43件事[转]

    Web API核查表:设计.测试.发布API时需思考的43件事   当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...

  2. 如何在SAP Cloud for Customer自定义BO中创建访问控制

    文章作者: Yi 已获得Yi的转载许可. 访问控制方式和使用注意事项 1. C4C中的访问控制有两种方式 RelevantForAccessControl AccessControlContext 2 ...

  3. 【java编程】vo、po、dto、bo、pojo、entity、mode如何区分

    Java Bean:一种可重用组件,即“一次编写,任何地方执行,任何地方重用”.满足三个条件 类必须是具体的和公共的 具有无参构造器 提供一致性设计模式的公共方法将内部域或暴露成员属性 VO valu ...

  4. PO,VO,DAO,BO,POJO之间的区别与解释

    VO value object:值对象 通常用于业务层之间的数据传递,由new创建,由GC回收. PO persistant object:持久层对象 对应数据库中表的字段. VO和PO,都是属性加上 ...

  5. Java 中 VO、PO、DTO、BO、POJO、DAO 之间的区别与解释

    转载:https://www.cnblogs.com/hunmeng/p/11298680.html VO value object:值对象 通常用于业务层之间的数据传递,由new创建,由GC回收. ...

  6. DDD~概念中的DDD(转)

    概念中的DDD DDD: 领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略 ...

  7. <四>面向对象分析之UML核心元素之用例

    一:基本概念        --->用例定义了一组用例实例,其中每个实例都是系统所执行一系列操作,这些操作生成特定主角可以观测的值.        --->所谓用例,就是一件事情,要完成这 ...

  8. [XAF] Llamachant Framework Modules

    Llamachant Framework Modules 最近更新 2018-08-22 *变更:我们从所需的模块列表中删除了审计跟踪模块.如果要在应用程序中使用Audit Trail功能,请将Aud ...

  9. 【转载】SAP_ECC6.0_EHP4或SAP_ECC6.0_EHP5_基于Windows_Server_2008R2_和SQL_server_2008下的安装

    其实这是之前Michael_z 5篇文章的集合,但作者做了一些补充 参考重要安装文档:http://www.cnblogs.com/Michael_z/category/322108.html(本博客 ...

  10. SAP ECC6安装系列三:关于SAP,你也许想知道的一些事

    原作者博客 http://www.cnblogs.com/Michael_z/ ======================================== 前段时间刚好赶上 Windows 8 ...

随机推荐

  1. viewpager+fragment+HorizontalScrollView详细版

    XML布局 <HorizontalScrollView            android:id="@+id/hsv"            android:layout_ ...

  2. 查找(顺序表&有序表)

    [1]查找概论 查找表是由同一类型是数据元素(或记录)构成的集合. 关键字是数据元素中某个数据项的值,又称为键值. 若此关键字可以唯一标识一个记录,则称此关键字为主关键字. 查找就是根据给定的某个值, ...

  3. button改变背景与文字颜色

    1.定义/zhsh/res/color/txt_guide_selector.xml <?xml version="1.0" encoding="utf-8&quo ...

  4. 【python cookbook】【字符串与文本】16.以固定的列数重新格式化文本

    问题:重新格式化一些很长的字符串,以指定的列数来显示 解决方案:textwrap模块的fill()方法来实现 # A long string s = "Look into my eyes, ...

  5. iOS 学习笔记 三 (2015.03.05)

    服务和特征都是用UUID来唯一标识的,UUID的概念如果不清楚请自行google,国际蓝牙组织为一些很典型的设备(比如测量心跳和血压的设备)规定了标准的service UUID(特征的UUID比较多, ...

  6. Mysql String Functions

    SUBSTRING_INDEX(str,delim,count) 按标识符截取指定长度的字符串 mysql); -> 'www.mysql' mysql); -> 'mysql.com' ...

  7. iOS开发- 蓝牙后台接收数据(BLE4.0)

    最近在做一个蓝牙相关的项目, 需要在应用进入后台, 或者手机属于锁屏状态的情况下, 仍然保持蓝牙连接, 并且能正常接收数据. 本来以后会很麻烦, 但是学习了下..发现就2步而已.简单的不能再简单了. ...

  8. TEXT、TINYTEXT、MEDIUMTEXT、LONGTEXT选择 和 char varchar varchar2 的区别

    TEXT.TINYTEXT.MEDIUMTEXT.LONGTEXT选择: 储存不区分大小写的字符数据 TINYTEXT 最大长度是 255 (2^8 - 1) 个字符. TEXT 最大长度是 6553 ...

  9. PostgreSQL的 Slony-I 数据同步

    原文--http://www.tuicool.com/articles/mMvARf 先谈谈slony的局限性: 1. DDL动作是不会被复制到: 2. 如果想使用slony来同步数据,表必须是带有主 ...

  10. 清空html代码

    不要使用 $("XXX").html(""); 清空html代码块一般有两种方式: 1)非miniui等组件区块:$("#id").empt ...