Abap 允许当前用户查看的BUKR列表

Abap 允许当前用户查看的BUKR列表,abap,opensql,Abap,Opensql,是否有方法获取当前用户可以看到的所有BUKR的列表 我想在OpenSQL中将此列表用作筛选器。假设我搜索的方法的结果将结果存储在bk\u列表中。然后我可以像这样使用bk\u列表: SELECT * FROM some_table WHERE bukrs IN bk_list 恐怕你只能一个接一个地做。大致: SELECT bukrs INTO TABLE @DATA(lt_t001) FROM t001 WHERE ... . "Selection c

是否有方法获取当前用户可以看到的所有BUKR的列表

我想在OpenSQL中将此列表用作筛选器。假设我搜索的方法的结果将结果存储在
bk\u列表中
。然后我可以像这样使用
bk\u列表

SELECT * FROM some_table WHERE bukrs IN bk_list

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

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.
选择bukrs
进入表@数据(lt_t001)
从t001开始
哪里“选择标准,如有必要
lt_t001处的回路
正在分配字段-SYMBOL()。
数据(lv_tabix)=sy tabix。
权限检查对象“F_BKPF_BUK”
ID“BUKRS”字段-BUKRS
ID'ACTVT'字段'03'。“这里需要正确的活动(显示'03'/更改'02'/等)
如果sy subrc为0。“身份验证检查失败
删除lt_t001索引lv_表。
恩迪夫。
结束循环。

最后,lt_t001只包含用户有权访问的公司代码。

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

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).

如果CDS是备选方案,则有内置授权。否则,您需要知道授权对象(每个SAP ERP模块都有一个)使用
AUTHORITY-CHECK
自己建立列表。好的,这应该可以。如果我理解正确,那么你检查每个BUKR,如果AUTHORITY-CHECK成功,然后将BKUR添加到允许的BUKR列表中。这有点像“暴力攻击”“,但它是有效的。谢谢您的回答。这是另一种方式:首先选择所有公司代码,然后检查每个代码的自动化。如果验证检查失败,公司代码将从列表中删除。另一方面,是的,这是蛮力,但据我所知,只能检查单个值的授权,而不能检查范围/质量值。