从某种程度上来说,用户是可爱的,因为TA给了你前进的方向。
BPS从内容控制上来说,权限没有任何问题,可以完全照搬BW的,但是涉及到某个Layout允许谁谁谁修改时,没有明确的方案,至少我没有看到。 Dataslice 只能是全盘锁,而我们的要求是对有的人开发,有的人关闭。 这个可以理解为功能权限。
我最初的想法是,通过Navigation Page的跳转,每个Layout设置成两个Page,一个是可编辑的另一个是不可编辑的,然后,通过Javascript去做动态开关,当然是按照权限的要求。 但是因为我们要做年度月度,Bottom-Up,Top-Down,Final 三个版本,以及六个层级的分配,累不死铁人,但是我不是铁人。 虽然我几乎已经着手开始做了,但是非常不情愿。 “不满是向上的车轮”,多好的一句话呀。 这个时候因为正在看SAP BPS的帮助文档,看到Web Interface ,发现有Enhancement 章节。 好了,有切入点了。
其实之前我也一直在考虑是否可以通过Javascript来切换Layout的是否可编辑(其实是可以实现的,只要把Input干掉),但是我最想实现的是不希望没有顶层(公司层)权限的人,进入系统后把整个树都锁死了。 我只希望他们树枝的干活。 但是Javascript只是对HTML层的锁,骗得了操作者却骗不了系统。
所以如果能够实现Layout的是否可编辑在系统层开或闭就可以实现权限的控制,因为Layout在Web Interface设计时是可以选择只作显示的,所以在某种程度上来说,这个是可配置的,有路!!!
绕了点话题,那么在SAP 的 帮助文档中,关于Enhancement出现一句振奋人心的消息(就只是振我而已),
“Example: Setting a layout in display mode.”, 感觉这句话是写给我看的,先谢过了。 其实Web Interface设计的东西最终都会变成BSP(不是BPS),而这个生成过程,是通过Class:CL_UPWB_BSP_APPL来实现的。 而这个Class有很多Method,比如Load,Dispatch,Initialization.....。 那么Load的功能是做一些初始化之前的准备,比如对Component进行一些设定。比如“Setting a layout in display mode。”
所以如果要进行增强,只要继承CL_UPWB_BSP_APPL,并Redefine Method就可以了,然后在Web Interface创建的Application属性中,重新定义生成CLASS为你所以继承后的类名,就搭好架子了。
接下来,就看你的ABAP了。
比如,我是要对Layout进行操作,按照用户的权限来设定Layout的是否可编辑。 因为BW权限的控制是内容控制,所以类型是“有什么”。 就是定义你有什么权限就加什么权限,没定义则代表没有。 所以我们在对Web进行控制的时候,必须先把所有的东西都定义为“disabled”,即有权限再打开。
顺便把我在Load中重新定义的部分记录下来。
*TRY.
CALL METHOD super->load
EXPORTING
application_name = application_name
* storage_type =
RECEIVING
application = application
.
*ENDTRY.
CONSTANTS:
c_layout TYPE string VALUE 'LAYOUT_CUST_MAT'. “第六层Layout
DATA:
l_subrc LIKE sy-subrc,
lt_cha TYPE STANDARD TABLE OF upc_ys_cha,
lto_varsel_all TYPE upc_yto_charsel,
lto_varsel TYPE upc_yto_charsel,
lto_var TYPE upc_yto_charsel,
lto_chanm TYPE upc_yto_cha,
ls_varsel_all TYPE upc_ys_api_varsel,
lt_varsel_all TYPE STANDARD TABLE OF upc_ys_api_varsel.
DATA: ls_varsel TYPE upc_ys_charsel,
l_comp(4) TYPE c,
l_entries TYPE i.
** conditions to filter the approbiate component
DATA: l_layout TYPE REF TO if_upwb_c_layout2,
l_button TYPE REF TO if_upwb_c_button,
l_class TYPE string.
DATA:
lr_component TYPE REF TO if_upwb_c_component,
l_web_comp TYPE string,
lr_tabstrp TYPE REF TO if_upwb_c_tab_strip.
*
*
DATA: BEGIN OF wa_layout ,
version(2),
layout(22),
END OF wa_layout.
DATA: it_layout LIKE TABLE OF wa_layout.
DATA: l_ver(2).
DATA: it TYPE TABLE OF zsave,
wa LIKE LINE OF it.
DATA: l_line TYPE d.
DATA:l_flag(1) VALUE 'X'. "是否第六层有权限
***我把Layout的权限定义到BPS的变量中,这样好取值
CALL FUNCTION 'API_SEMBPS_VARIABLE_GETDETAIL'
EXPORTING
i_area = 'ZBSPLN01'
i_variable = 'ZTAB' "AUTHORIZATION VARIABLE
IMPORTING
e_subrc = l_subrc
TABLES
etk_cha = lt_cha
etk_varsel_all = lt_varsel_all.
l_ver = application_name+8(2). ”Application 的命名规则,是后两位代表版本
TRANSLATE l_ver TO UPPER CASE.
LOOP AT lt_varsel_all INTO ls_varsel_all.
wa_layout-version = ls_varsel_all-low+0(2).
IF wa_layout-version EQ l_ver. “只取当前版本的权限
wa_layout-layout = ls_varsel_all-low+0(15).
REPLACE FIRST OCCURRENCE OF
wa_layout-version
IN wa_layout-layout WITH ''.
*
CONDENSE wa_layout-layout.
CONCATENATE 'LAYOUT' wa_layout-layout INTO l_web_comp.
*
lr_component = cl_upwb=>get_component( is_id = l_web_comp ).
l_layout ?= lr_component.
* 设置只读,注意否是用”-“,而不是”“
TRY.
CALL METHOD l_layout->set_read_only
EXPORTING
i_value = '-'.
ENDTRY.
IF l_web_comp EQ c_layout .
l_flag = '-'.
TRY.
*同时还要允许新增行
CALL METHOD l_layout->set_allow_new_lines
EXPORTING
i_value = 'X'.
ENDTRY.
ENDIF.
ENDIF.
ENDLOOP.
******如果第六层有权限, 还需要把upload的权限给予
if sy-subrc ne 0.
lr_component = cl_upwb=>get_component( is_id = 'BT_SAVE' ).
l_button ?= lr_component.
TRY.
CALL METHOD l_button->set_disabled
EXPORTING
i_value = 'X'.
ENDTRY.
endif.
lr_component = cl_upwb=>get_component( is_id = 'FB_UPLOAD' ).
l_button ?= lr_component.
TRY.
CALL METHOD l_button->set_disabled
EXPORTING
i_value = l_flag.
ENDTRY.
以上。
Robin Lei
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/554557/viewspace-697650/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/554557/viewspace-697650/
本文介绍如何使用SAP BPS实现不同用户对特定布局的编辑权限控制。通过继承CL_UPWB_BSP_APPL类并重定义Load方法,可以根据用户权限动态设置布局为可编辑或只读状态。
1864

被折叠的 条评论
为什么被折叠?



