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)
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
这里我们用Object type, 而不是interface, 好比我们要建个class, 而不是class
interface一样。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
Program: 每个BO背后的代码都对应一个program
Application: Z (Customer branch)
好了, 这样系统产生了一个最初的BO框架:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
接下来, 我们会一个一个实现这个Business Ojbect的各项内容:
2. 定义Key Fields: 也就是Object的Key,是唯一用来区别Object的键值。 大家都知道对于sales
order对应的表是VBAK和VBAP。 VBAK-VBELN是Sale Document ID, 它是区别sales
order的key。
我们新建一个Key Field:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
选yes, 因为我们要从VBAK表中选取。选中系统自动列示的key。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
采用默认值, 新建保存。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
现在你新建了Key Fields, 系统会自动产生相对应Key field的代码,在BO Builder中点Program:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
系统自动产生以下代码:
***** 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:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
注意release Object Type 和Object Type Component的区别, 现在我们只需要relase
Object Type,等以后添加了Attributes时, 你需要release Object Type
Component。
等release 和
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
generate完毕,我们可以第一次测试,你可以发现Tool
bar中有了可执行按钮:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
执行BO, 选中一个现有的Sales Order:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
执行结果, 但这时我们只能够看到key field的显示。 下面我们来取其他feilds。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
3. 定义Attribute, 我们来取sales document date。
新建Attribute: Create with ABAP Dictionary field proposals。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
采取默认Text。
现在我们新建了一个Attribute, 但我们需要系统自动为我们产生背后的代码, 这时你可以点 Check:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
系统提示自动产生代码:选择Yes
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
系统自动产生读取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。测试方法和以前相同。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
这次我们取到了sales document date。
4. 这次我们定义一个attribute, 而这个Attribute映射到另一个BO。 我们显示sale order的Sold
to party, 这个Sold-to-party 映射到Customer 主数据。
新建Attribute: Create with ABAP Dictionary field proposals。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
选择Sold-to party。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
将Sold-to Party关联另一个BO, Customer BO。
我们看看效果:这时取到了Sold-to party ID
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
我们双击这个Sold-to party ID, 可以取到关联的Customer BO
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
以上的Attribute都是从数据库表中直接获得, 接下来我们看一下如何定义间接获得的Attribute,也就是virtual
attribute
5. 定义virtual attribute。 我们要把Sales document number + Sales
document date合并成字符串显示。
新建Attribute: Create with ABAP Dictionary field
proposals,这次选No
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
我们需要给这个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。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
这次我们要release object type component
测试结果:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
6. 建一个有映射的virtual attribute。 我们建一个带映射的Sales group
新建Attribute: Create with ABAP Dictionary field proposals,选No
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
我们需要改代码实现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.
测试结果:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
关联的BO:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
7. Multiline virtual attribute: 我们用它来显示 Order item
我们知道order item是在VBAP表中
新建Attribute: Create with ABAP Dictionary field proposals,选No
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
因为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.
测试结果:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
双击其中一条item
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
8. 接下来我们看看Method, 对于sales order, 我们需要create, display sales
order等等
在实现method之前, 我们先看看 Object Type Interface
新建interface: 我们建3个interface: IFCREATE, IFEDIT, IFFIND
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
对应的method会自动继承Interface
我们首先使用
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
redefine
Edit 方法
然后双击Edit方法
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
由于我们Edit方法将调用T-Code: VA02界面, 所以我们选用Dialog和Synchronous,
Synchronous指执行的方法没有返回值。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
你需要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 方法
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
系统将调用VA02:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
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
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
测试:输入不存在的Sales Order number:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
系统报错:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
10. 现在我们创建带参数的method, 我们的入参是Sales Order Type, 也就是根据输入的sales order
type创建order
redefine create method, 调用VA01
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
创建parameter: 选中create method并点击:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
创建入参, 我们的入参: sales order type 存在VBAK中, 所以我们选 Yes
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
选择: sales order type
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
Parameter已添加
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
系统自动产生代码:
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
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
11. Event
未完待续
我们用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)
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
这里我们用Object type, 而不是interface, 好比我们要建个class, 而不是class
interface一样。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
Program: 每个BO背后的代码都对应一个program
Application: Z (Customer branch)
好了, 这样系统产生了一个最初的BO框架:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
接下来, 我们会一个一个实现这个Business Ojbect的各项内容:
2. 定义Key Fields: 也就是Object的Key,是唯一用来区别Object的键值。 大家都知道对于sales
order对应的表是VBAK和VBAP。 VBAK-VBELN是Sale Document ID, 它是区别sales
order的key。
我们新建一个Key Field:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
选yes, 因为我们要从VBAK表中选取。选中系统自动列示的key。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
采用默认值, 新建保存。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
现在你新建了Key Fields, 系统会自动产生相对应Key field的代码,在BO Builder中点Program:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
系统自动产生以下代码:
***** 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:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
注意release Object Type 和Object Type Component的区别, 现在我们只需要relase
Object Type,等以后添加了Attributes时, 你需要release Object Type
Component。
等release 和
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
generate完毕,我们可以第一次测试,你可以发现Tool
bar中有了可执行按钮:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
执行BO, 选中一个现有的Sales Order:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
执行结果, 但这时我们只能够看到key field的显示。 下面我们来取其他feilds。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
3. 定义Attribute, 我们来取sales document date。
新建Attribute: Create with ABAP Dictionary field proposals。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
采取默认Text。
现在我们新建了一个Attribute, 但我们需要系统自动为我们产生背后的代码, 这时你可以点 Check:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
系统提示自动产生代码:选择Yes
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
系统自动产生读取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。测试方法和以前相同。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
这次我们取到了sales document date。
4. 这次我们定义一个attribute, 而这个Attribute映射到另一个BO。 我们显示sale order的Sold
to party, 这个Sold-to-party 映射到Customer 主数据。
新建Attribute: Create with ABAP Dictionary field proposals。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
选择Sold-to party。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
将Sold-to Party关联另一个BO, Customer BO。
我们看看效果:这时取到了Sold-to party ID
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
我们双击这个Sold-to party ID, 可以取到关联的Customer BO
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
以上的Attribute都是从数据库表中直接获得, 接下来我们看一下如何定义间接获得的Attribute,也就是virtual
attribute
5. 定义virtual attribute。 我们要把Sales document number + Sales
document date合并成字符串显示。
新建Attribute: Create with ABAP Dictionary field
proposals,这次选No
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
我们需要给这个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。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
这次我们要release object type component
测试结果:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
6. 建一个有映射的virtual attribute。 我们建一个带映射的Sales group
新建Attribute: Create with ABAP Dictionary field proposals,选No
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
我们需要改代码实现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.
测试结果:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
关联的BO:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
7. Multiline virtual attribute: 我们用它来显示 Order item
我们知道order item是在VBAP表中
新建Attribute: Create with ABAP Dictionary field proposals,选No
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
因为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.
测试结果:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
双击其中一条item
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
8. 接下来我们看看Method, 对于sales order, 我们需要create, display sales
order等等
在实现method之前, 我们先看看 Object Type Interface
新建interface: 我们建3个interface: IFCREATE, IFEDIT, IFFIND
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
对应的method会自动继承Interface
我们首先使用
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
redefine
Edit 方法
然后双击Edit方法
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
由于我们Edit方法将调用T-Code: VA02界面, 所以我们选用Dialog和Synchronous,
Synchronous指执行的方法没有返回值。
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
你需要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 方法
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
系统将调用VA02:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
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
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
测试:输入不存在的Sales Order number:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
系统报错:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
10. 现在我们创建带参数的method, 我们的入参是Sales Order Type, 也就是根据输入的sales order
type创建order
redefine create method, 调用VA01
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
创建parameter: 选中create method并点击:
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
创建入参, 我们的入参: sales order type 存在VBAK中, 所以我们选 Yes
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
选择: sales order type
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
Parameter已添加
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
系统自动产生代码:
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
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
11. Event
未完待续
相关文章推荐
- jQuery插件开发--(转)
- 173. Binary Search Tree Iterator LeetCode
- Ionic开发Android环境搭建
- jQuery插件开发精品教程,让你的jQuery提升一个台阶
- 白话空间统计二十:相似性搜索(三)
- UDP编程应用探讨一
- 求斐波那契数列的第n个数(递归、非递归)
- 基于AngularJs的上传控件-angular-file-upload
- java实现定时任务的三种方法
- 红包与有意义的事
- nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器
- 51Nod 1432 独木舟(贪心)
- 聊聊分布式事务
- Hadoop - Azkaban 作业调度
- 【小白的CFD之旅】11 敲门实例【续】
- EJB-MDB消息驱动Bean
- Android manifest中actvity下的android:allowTaskReparenting等配置
- 分布式日志分析系统构建实战(四)——Storm
- Symfony
- 数据类型转换错误