您的位置:首页 > 其它

SAP BOR -- …

2016-02-15 18:35 351 查看
原文地址: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

未完待续

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: