业务对象(BO)设计

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

业务对象(BO)设计... 111

创建数据结构(SE11)... 111

创建业务对象类型(SWO1)... 111

新建业务对象类型... 111

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

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

查看业务对象的实现代码... 112

添加接口... 113

添加关键字段Key. 114

添加属性... 116

设置默认属性和方法... 117

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

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

重定义接口方法... 119

实现方法... 119

测试业务对象... 120

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

创建BAPI参数的数据结构... 121

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

创建函数组 ZEMP. 122

创建功能模块ZBAPI_GET_EMPLOYEE_LIST. 122

创建功能模块ZBAPI_GET_EMPLOYEE_DETAIL. 125

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

测试BAPI方法

业务对象(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等),业务对象的这些方法将通过提交到该报表的方式来实现这些方法的功能:

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.

重定义接口方法

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

对这三个从接口继承过来的方法进行重定义后,再次选择“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函数添加以下源码:

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

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

FORMset_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.

测试函数:

创建功能模块ZBAPI_GET_EMPLOYEE_DETAIL

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

FUNCTIONzbapi_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.

测试:

将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中测试的结果完全相同:

时间: 2024-10-11 07:21:41

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

设计模式的原则 抽要理解

[参阅]http://www.cnblogs.com/jiangzhengjun/p/4260969.html 单一职责原则( SRP )——内聚性 定义 单一职责原则的定义: 就一个类页言,应该仅有一个引起它变化的原因 ( There should never be more than one reason for a class to change ). 单一职责原则要求一个接口或类只有一个原因引起变化,也就是 一个接口或类只有一个职责,它就是负责一件事情 . 内聚性:一个模块的组成元素之间

XSuperMES

众所周知,降本增效是每个企业所追求的长远目标,在如何实现降本增效这一目标上相信每个企业都会花费相当大的人力物力财力. 就下料车间管理这一块来说,如何制定和维护企业的切割生产计划,以计算机信息化管理手段提升企业现代化切割生产的管理水平,提高切割生产效率和板材利用率,有效控制生产成本,对实现降本增效有着深远意义.好在我们有XSuperMES SuperMES是南京学思信息技术自主研发的顶级下料车间管理软件.已经使用这一系统的均为行业内的领军者,如:柳工股份及中船重工武汉船用机械厂.XSuperMES

DDD~概念中的DDD(转)

概念中的DDD DDD: 领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略和类型划分.领域模型是领域驱动的核心 ,采用DDD的设计思想,业务逻辑不再集中在几个大型的类上,而是在大量相对小的领域对象上,这些类具有自己的状态和行为,每个类都是完成的独立的,并与现实领域的业务对象形成一种映射.基于DDD的架构设计,保证了系统的可维护性,扩展性和敏捷性,在处理复杂业务逻辑方面有着

[XAF] Llamachant Framework Modules

Llamachant Framework Modules 最近更新 2018-08-22 *变更:我们从所需的模块列表中删除了审计跟踪模块.如果要在应用程序中使用Audit Trail功能,请将Audit Trail模块添加到.Module项目*- 新功能:添加审计跟踪恢复(实验)- 更新了IAuditTrailUser接口 2018-06-15次要修复- 已解决的问题,当使用Web 2018-06-14中的上一个和下一个对象操作时,标签上的计数不清除- 次要修复- 已解决的问题,当使用上一个和

Swing程序最佳架构设计—以业务对象为中心的MVC模式(转)

前言: 我打算写一系列关于Swing程序开发的文章.这是由于最近我在做一个Swing产品的开发.长期做JavaEE程序,让我有些麻木了.Swing是设计模式的典范,是一件优雅的艺术品,是一件超越时代的产品! 有机会作Swing软件的开发,让我非常有感觉! 呵呵,希望有机会能够用Java3D编写软件,那种感觉一定更棒! Java和Swing都是杰作.我这个人对别人一向很挑剔的,能够得到我由衷地赞誉,可想而知它们有多优秀了.奇怪的是,它们居然一直都无法占领桌面市场.有人说这是技术的原因.我认为这应该

在线捉鬼游戏开发之二 - 设计业务对象与对象职责划分(3)

“回忆总是残酷的”——在“设计业务对象与对象职责划分(2)”中,对旧版本的代码进行了剖析,也发现了不少臭味道,本篇将记录我是如何建设新版的业务对象职责划分. 一.复习设计模式 当初自学设计模式的路径是:从<大话设计模式>开始(做了笔记),到Gof的<设计模式>,再到辛勤网友们的各篇总结日志(只看C#的可能会有些局限~).此后,每当我有需要更新代码的时候,或者觉得不太记得清23种经典设计模式的时候,我就会回翻我的笔记,主要看:模式目的.应用场景,以最快速度在脑子里回放.在复习的同时,

软件架构设计系列总结

架构引用维基百科:软件体系结构是构建计算机软件实践的基础.与建筑师设定建筑项目的设计原则和目标,作为绘图员画图的基础一样,一个软件架构师或者系统架构师陈述软件构架以作为满足不同客户需求的实际系统设计方案的基础.从和目的.主题.材料和结构的联系上来说,软件架构可以和建筑物的架构相比拟.一个软件架构师需要有广泛的软件理论知识和相应的经验来实施和管理软件产品的高级设计.软件架构师定义和设计软件的模块化,模块之间的交互,用户界面风格,对外接口方法,创新的设计特性,以及高层事物的对象操作.逻辑和流程.软件

关于VO、PO的理解——java的(PO,VO,TO,BO,DAO,POJO)解释

O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据. 在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO. VO,值对象(Value Object),PO,持久对象(Persisent Object),它们是由一组属性和属性的get和set方法组成.从结构上看,它们并没有什么不同的地方.但从其意义和本质上来看是完全不同的. 1.VO是用new关键字创建,由

java的(PO,VO,TO,BO,DAO,POJO)解释

java的(PO,VO,TO,BO,DAO,POJO)解释  O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO. VO,值对象(Value Object),PO,持久对象(Persisent Object),它们是由一组属性和属性的get和set方法组成.从结构上看,它们并没有什么不同的地方.但从其意义