得瑟一把:SAP BPS的权限控制 - 改或不能改的权限设计

本文介绍如何使用SAP BPS实现不同用户对特定布局的编辑权限控制。通过继承CL_UPWB_BSP_APPL类并重定义Load方法,可以根据用户权限动态设置布局为可编辑或只读状态。

     从某种程度上来说,用户是可爱的,因为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/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值