原文地址:SAP BOR -- Business Object Repository作者:周睿的Blog

这两天研究Workflow时, 需要用到BOR, 一直没有深入的理解,趁现在正好研究一下。

我们用T-Code: SWO1 显示现有的BOR:

BOR将业务封装成object, 它通过Object Oriented的方式来看待每个业务。 比如sales order, customer, business partner...都是object。

每个object有它的method,可以通过call T-Code, call BAPI或call Function Module实现,例如SalesOrder->create, SalesOrder->display......

每个object有它的attribute, 类似于Class的attribute, 它用来存储每个object instance的值, 比如你query了一个 business object: business partner, 你可以将query后的result放在object attribute中以待后用。

每个object有它的event, 比如create event, change event, 在business object执行完某项操作时触发, 他作为后续操作的触发点。 例如, 当Business partner被创建时, 触发create event, 由这个event我们可以触发我们自己的后续工作, 比如与其他系统同步主数据, 或者这个create event可作为workflow的触发点等等...

SAP 提供了一个非常好的example, 我按照它做了一遍, SAP workflow programming

练习的目的: 创建一个新的Business Object

1. 创建Business Object  (T-Code: SWO1)


这里我们用Object type, 而不是interface, 好比我们要建个class, 而不是class interface一样。


Program: 每个BO背后的代码都对应一个program
Application: Z (Customer branch)

好了, 这样系统产生了一个最初的BO框架:

接下来, 我们会一个一个实现这个Business Ojbect的各项内容:

2. 定义Key Fields: 也就是Object的Key,是唯一用来区别Object的键值。 大家都知道对于sales order对应的表是VBAK和VBAP。 VBAK-VBELN是Sale Document ID, 它是区别sales order的key。

我们新建一个Key Field:


选yes, 因为我们要从VBAK表中选取。选中系统自动列示的key。

采用默认值, 新建保存。

现在你新建了Key Fields, 系统会自动产生相对应Key field的代码,在BO Builder中点Program:

系统自动产生以下代码:

*****           Implementation of object type Z_OR_001             *****
INCLUDE <OBJECT>.
BEGIN_DATA OBJECT. " Do not change.. DATA is generated
* only private members may be inserted into structure private
DATA:
" begin of private,
"   to declare private attributes remove comments and
"   insert private attributes here ...
" end of private,
  BEGIN OF KEY,
      SALESDOCUMENT LIKE VBAK-VBELN,
  END OF KEY.
END_DATA OBJECT. " Do not change.. DATA is generated

为了能测试BO, 你需要release BO 和 generate BO:

注意release Object Type 和Object Type Component的区别, 现在我们只需要relase Object Type,等以后添加了Attributes时, 你需要release Object Type Component。

等release 和  generate完毕,我们可以第一次测试,你可以发现Tool bar中有了可执行按钮:

执行BO, 选中一个现有的Sales Order:

执行结果, 但这时我们只能够看到key field的显示。 下面我们来取其他feilds。

3. 定义Attribute, 我们来取sales document date。
新建Attribute: Create with ABAP Dictionary field proposals。


采取默认Text。

现在我们新建了一个Attribute, 但我们需要系统自动为我们产生背后的代码, 这时你可以点 Check:

系统提示自动产生代码:选择Yes

系统自动产生读取VBAK的代码, 我们的AUDAT存在于VBAK中, 所以我们取到了VBAK, AUDAT的值就会自动获取到。

TABLES VBAK.
*
GET_TABLE_PROPERTY VBAK.
DATA SUBRC LIKE SY-SUBRC.
* Fill TABLES VBAK to enable Object Manager Access to Table Properties
  PERFORM SELECT_TABLE_VBAK USING SUBRC.
  IF SUBRC NE 0.
    EXIT_OBJECT_NOT_FOUND.
  ENDIF.
END_PROPERTY.
*
* Use Form also for other(virtual) Properties to fill TABLES VBAK
FORM SELECT_TABLE_VBAK USING SUBRC LIKE SY-SUBRC.
* Select single * from VBAK, if OBJECT-_VBAK is initial
  IF OBJECT-_VBAK-MANDT IS INITIAL
  AND OBJECT-_VBAK-VBELN IS INITIAL.
    SELECT SINGLE * FROM VBAK CLIENT SPECIFIED
        WHERE MANDT = SY-MANDT
        AND VBELN = OBJECT-KEY-SALESDOCUMENT.
    SUBRC = SY-SUBRC.
    IF SUBRC NE 0. EXIT. ENDIF.
    OBJECT-_VBAK = VBAK.
  ELSE.
    SUBRC = 0.
    VBAK = OBJECT-_VBAK.
  ENDIF.
ENDFORM.

我们再测试一下BO, 测试前先要Regenerate 一下BO。测试方法和以前相同。


这次我们取到了sales document date。

4. 这次我们定义一个attribute, 而这个Attribute映射到另一个BO。 我们显示sale order的Sold to party, 这个Sold-to-party 映射到Customer 主数据。

新建Attribute: Create with ABAP Dictionary field proposals。


选择Sold-to party。


将Sold-to Party关联另一个BO, Customer BO。

我们看看效果:这时取到了Sold-to party ID


我们双击这个Sold-to party ID, 可以取到关联的Customer BO

以上的Attribute都是从数据库表中直接获得, 接下来我们看一下如何定义间接获得的Attribute,也就是virtual attribute

5. 定义virtual attribute。 我们要把Sales document number + Sales document date合并成字符串显示。

新建Attribute: Create with ABAP Dictionary field proposals,这次选No


我们需要给这个virtual attribute定义一个类型, 这里用系统类型。

我们需要写代码来实现这个字符串合并, 还是点"Check"先自动产生代码。然后更改代码:

GET_PROPERTY TEXTWITHDOCUMENTNO CHANGING CONTAINER.
DATA: SALESDOCUMENT LIKE VBAK-VBELN,
      DOCUMENTDATE  LIKE VBAK-AUDAT.
SWC_GET_PROPERTY SELF 'SalesDocument' SALESDOCUMENT.
SWC_GET_PROPERTY SELF 'DocumentDate' DOCUMENTDATE.
CONCATENATE 'sales order' SALESDOCUMENT 'of' DOCUMENTDATE INTO OBJECT-TEXTWITHDOCUMENTNO SEPARATED BY SPACE.
SWC_SET_ELEMENT CONTAINER 'TextWithDocumentNo' OBJECT-TEXTWITHDOCUMENTNO.
END_PROPERTY.

以上代码将数据库表中的sales document number 和 sales document date 合并。

在测试前, 我们先要release 这个virtual attribute。


这次我们要release object type component

测试结果:

6. 建一个有映射的virtual attribute。 我们建一个带映射的Sales group

新建Attribute: Create with ABAP Dictionary field proposals,选No


我们需要改代码实现sales group的实现

GET_PROPERTY SALESGROUP CHANGING CONTAINER.
SELECT SINGLE * FROM VBAK WHERE VBELN = OBJECT-KEY-SALESDOCUMENT.
SWC_CREATE_OBJECT OBJECT-SALESGROUP 'TVKGR' VBAK-VKGRP.
SWC_SET_ELEMENT CONTAINER 'SalesGroup' OBJECT-SALESGROUP.
END_PROPERTY.

测试结果:


关联的BO:

7. Multiline virtual attribute: 我们用它来显示 Order item

我们知道order item是在VBAP表中

新建Attribute: Create with ABAP Dictionary field proposals,选No


因为order item是多条记录, 我们选择Multiline

当然我们要写代码实现items的读取

GET_PROPERTY ITEMS CHANGING CONTAINER.
TABLES VBAP.
REFRESH OBJECT-ITEMS.
DATA ITEM TYPE SWC_OBJECT.
DATA:
  BEGIN OF VBAP_KEY,
    VBELN LIKE VBAP-VBELN,
    POSNR LIKE VBAP-POSNR,
  END OF VBAP_KEY.
DATA BEGIN OF VBAP_TAB OCCURS 0.
        INCLUDE STRUCTURE VBAP.
DATA END OF VBAP_TAB.

* Select data
SELECT * FROM VBAP INTO TABLE VBAP_TAB
WHERE VBELN = OBJECT-KEY-SALESDOCUMENT.

VBAP_KEY-VBELN = OBJECT-KEY-SALESDOCUMENT.

* Create object reference
LOOP AT VBAP_TAB.
  VBAP_KEY-POSNR = VBAP_TAB-POSNR.
  SWC_CREATE_OBJECT ITEM 'VBAP' VBAP_KEY.
  APPEND ITEM TO OBJECT-ITEMS.
ENDLOOP.

* Assign object reference to container element
SWC_SET_TABLE CONTAINER 'Items' OBJECT-ITEMS.

END_PROPERTY.

测试结果:


双击其中一条item

8. 接下来我们看看Method, 对于sales order, 我们需要create, display sales order等等

在实现method之前, 我们先看看 Object Type Interface

新建interface: 我们建3个interface: IFCREATE, IFEDIT, IFFIND


对应的method会自动继承Interface

我们首先使用  redefine Edit 方法

然后双击Edit方法


由于我们Edit方法将调用T-Code: VA02界面, 所以我们选用Dialog和Synchronous, Synchronous指执行的方法没有返回值。


你需要release object type component

在系统自动产生的代码里稍微更改一下:

BEGIN_METHOD EDIT CHANGING CONTAINER.
  SET PARAMETER ID 'AUN' FIELD OBJECT-KEY-SALESDOCUMENT.
  CALL TRANSACTION 'VA02' AND SKIP FIRST SCREEN.
  SWC_REFRESH_OBJECT SELF. "清空buffer
END_METHOD.

AUN是跑VA02的参数, 从key field中获得

测试:执行Edit 方法

系统将调用VA02:

9: 看看BOR怎么进行exception处理:

我们实现现有方法: ExistenceCheck, 当Sales Order不存在时报错

Redefine ExistenceCheck 方法, 不需要更改方法的设置 (没有Dialog)

实现代码:

BEGIN_METHOD EXISTENCECHECK CHANGING CONTAINER.
SELECT SINGLE * FROM VBAK WHERE VBELN = OBJECT-KEY-SALESDOCUMENT.
IF SY-SUBRC NE 0.
EXIT_RETURN 0001 SPACE SPACE SPACE SPACE.
ENDIF.
END_METHOD.

error message 0001是BOR存在的message, 可点击Exception看现有的message

测试:输入不存在的Sales Order number:


系统报错:

10. 现在我们创建带参数的method, 我们的入参是Sales Order Type, 也就是根据输入的sales order type创建order

redefine create method, 调用VA01

创建parameter: 选中create method并点击:

创建入参, 我们的入参: sales order type 存在VBAK中, 所以我们选 Yes

选择: sales order type


Parameter已添加

系统自动产生代码:

BEGIN_METHOD CREATE CHANGING CONTAINER.
DATA:
      SALESDOCUMENTTYPE TYPE VBAK-AUART.
  SWC_GET_ELEMENT CONTAINER 'SalesDocumentType' SALESDOCUMENTTYPE.
  SET PARAMETER ID 'AAT' FIELD SALESDOCUMENTTYPE.
  CALL TRANSACTION 'VA01' AND SKIP FIRST SCREEN.
  GET PARAMETER ID 'AUN' FIELD OBJECT-KEY-SALESDOCUMENT.
END_METHOD.

测试:

输入sales order type, 系统根据order type调用order screen

11. Event

未完待续

SAPnbsp;BORnbsp;--nbsp;…相关推荐

  1. SAPnbsp;PAnbsp;共享nbsp;免费下载

    为了感谢朋友的光临和sap的学习交流, 我上传了部分SAP资料,供免费下载, 仅供学习交流,不做任何商业用途, 如果损害了任何人的利益可以直接给我留言, 我将根据反应的情况进行合理的处理,谢谢! 地址 ...

  2. SAPnbsp;标准教材和自学方法

    SAP 的标准课程一直是大家关心的问题,下面这个链接就是 SAP 现有全部标准课程的清单: http://www.sap.com/services/education/catalog/coursein ...

最新文章

  1. SQLServer过期的解决方案
  2. 用Python更改IP地址(转)
  3. POJ 2115 C Looooops(扩展欧几里得)
  4. Java 将byte转换kb_【Java】把字节数B转化为KB、MB、GB的方法
  5. MobileNetV1
  6. js进阶 14-6 $.ajax()方法如何使用
  7. etcd工作原理和部署指南
  8. FreeMarker(一)初识
  9. 侯捷——STL源码剖析 笔记
  10. 小程序发布上线流程_小程序如何发布?微信小程序发布流程很简单
  11. Scrapy实践:爬取斗鱼TV主播的头像(重写ImagesPipeline实现图片爬取)
  12. 小技巧分享:电脑屏幕亮度怎么调?
  13. 爬取京东收件地址下得所有数据
  14. 2014年值得关注的10个开源项目 下
  15. cartographer探秘第三章之对比实验
  16. win中使用labelImg标注图片
  17. 《软技能》读书笔记——职业篇
  18. unity 回合制_用Unity E3 Goodness制成
  19. 区块链技术如何赋能公共资源招采管理服务?
  20. 【智能商务】海量商品查找利器—苏宁搜索系统

热门文章

  1. arduino硬件虚拟键盘中对应键盘上的按键整理
  2. 数据格式化 string.format()
  3. 985研究生在华为年薪30万,室友同学在美国亚马逊,一晒收入,蒙了!
  4. Android对控件进行隐藏
  5. confluence权限管理
  6. Tarjan算法附图详解(SCC)
  7. 本地网络出现了一个意外的情况,不能完成所有你在设置中所要求的更改?
  8. c语言 绝对值比较大小,c语言-求绝对值最大值
  9. Anomaly Detection with partially Observed Anomalies论文笔记
  10. 二、什么是asp网站