SAPnbsp;BORnbsp;--nbsp;…
这两天研究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:
为了能测试BO, 你需要release BO 和 generate BO:
等release 和 generate完毕,我们可以第一次测试,你可以发现Tool bar中有了可执行按钮:
执行结果, 但这时我们只能够看到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;…相关推荐
- SAPnbsp;PAnbsp;共享nbsp;免费下载
为了感谢朋友的光临和sap的学习交流, 我上传了部分SAP资料,供免费下载, 仅供学习交流,不做任何商业用途, 如果损害了任何人的利益可以直接给我留言, 我将根据反应的情况进行合理的处理,谢谢! 地址 ...
- SAPnbsp;标准教材和自学方法
SAP 的标准课程一直是大家关心的问题,下面这个链接就是 SAP 现有全部标准课程的清单: http://www.sap.com/services/education/catalog/coursein ...
最新文章
- SQLServer过期的解决方案
- 用Python更改IP地址(转)
- POJ 2115 C Looooops(扩展欧几里得)
- Java 将byte转换kb_【Java】把字节数B转化为KB、MB、GB的方法
- MobileNetV1
- js进阶 14-6 $.ajax()方法如何使用
- etcd工作原理和部署指南
- FreeMarker(一)初识
- 侯捷——STL源码剖析 笔记
- 小程序发布上线流程_小程序如何发布?微信小程序发布流程很简单
- Scrapy实践:爬取斗鱼TV主播的头像(重写ImagesPipeline实现图片爬取)
- 小技巧分享:电脑屏幕亮度怎么调?
- 爬取京东收件地址下得所有数据
- 2014年值得关注的10个开源项目 下
- cartographer探秘第三章之对比实验
- win中使用labelImg标注图片
- 《软技能》读书笔记——职业篇
- unity 回合制_用Unity E3 Goodness制成
- 区块链技术如何赋能公共资源招采管理服务?
- 【智能商务】海量商品查找利器—苏宁搜索系统