【问题标题】:List of BUKRS which the current user is allowed to see当前用户可以查看的BUKRS列表
【发布时间】:2018-11-19 13:19:07
【问题描述】:

有没有办法获取当前用户可以查看的所有 BUKRS 列表?

我想将此列表用作打开 sql 中的过滤器。想象一下我搜索的方法的结果将结果存储在bk_list 中。然后我可以像这样使用bk_list

SELECT * FROM some_table WHERE bukrs IN bk_list

【问题讨论】:

  • 如果 CDS 是替代方案,则有内置授权。否则,您需要知道授权对象(每个 SAP ERP 模块都有一个)并使用AUTHORITY-CHECK 自己构建列表。

标签: abap opensql


【解决方案1】:

另一种方法,基于类CL_AUTH_OBJECTS_TO_SQL(官方支持,从ABAP 7.50开始,如AUTHORITY-CHECK的文档中所述),这里程序从读取授权的航空公司读取航班:

DATA(authsql) = cl_auth_objects_to_sql=>create_for_open_sql( ).

authsql->add_authorization_object( EXPORTING
    iv_authorization_object = 'S_CARRID'
    it_activities = VALUE #( ( auth_field = 'ACTVT' value = '03' ) )
    it_field_mapping = VALUE #(
      ( auth_field = 'CARRID'
        view_field = VALUE #( table_ddic_name = 'SFLIGHT' field_name = 'CARRID' ) ) ) ).

DATA(where) = authsql->get_sql_condition( ).

SELECT * FROM sflight INTO TABLE @data(sflights) WHERE (where).

【讨论】:

    【解决方案2】:

    恐怕你只能一个一个地做。大致:

    SELECT bukrs
           INTO TABLE @DATA(lt_t001)
           FROM t001
           WHERE ... . "Selection critera, if necessary
    
    LOOP AT lt_t001
         ASSIGNING FIELD-SYMBOL(<ls_t001>).
      DATA(lv_tabix) = sy-tabix.
      AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
               ID 'BUKRS' FIELD <ls_t001>-bukrs
               ID 'ACTVT' FIELD '03'. "Here you need the proper activity (display '03' /change '02' / etc.)
      IF sy-subrc <> 0. "Auth check failed
        DELETE lt_t001 INDEX lv_tabix.
      ENDIF.
    ENDLOOP.
    

    最后 lt_t001 仅包含公司代码,用户有权使用该代码。

    【讨论】:

    • 好的,这应该可以。如果我理解正确,那么您检查每个 BUKR,如果 AUTHORITY-CHECK 成功,则将 BKUR 添加到允许的 BUKRS 列表中。这有点像“蛮力攻击”,但它确实有效。谢谢你的回答。
    • 反之亦然:首先选择所有公司代码,然后检查每个公司代码的自动化。如果身份验证检查失败,则从列表中删除公司代码。另一方面,是的,这是蛮力,但据我所知,只能检查单个值的授权,而不能检查范围/质量值。
    猜你喜欢
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多