从 GET_AUTH_VALUES FM 输出构造 SQL 查询

Construct SQL query from GET_AUTH_VALUES FM output

我用的是get_auth_values() whic has structure type us335的结果。

此结果可以包含单个值或成对的低-高值。我想使用这些类似 us335 的结果并执行 SQL 查询。将条目与 AND.

组合

我看到了这些解决方法:

我想还有更多的方法可以解决这个问题。

最可行的方法是什么?

Assemble 动态 WHERE 子句。从功能模块 RH_DYNAMIC_WHERE_BUILD 开始。如果不合适,请编写自己的字符串生成器。

您还可以为动态 IN 子句构建范围,但这会更难。字段类型各不相同,并且由于范围是特定于类型的 (TYPE RANGE OF <type>),您最终会得到很多过于动态的代码,这不是编程的乐趣。

构建WHERE子句时注意以下细节:

  • 授权中的字段名称可能与您 select 来自的列名称不同。您可能需要映射它们。

  • 授权值可能包含占位符 *。确保将其转换为 ABAP 运算符 CP 或 SQL 运算符 LIKE。如果该值只是一个星号,您可以忽略该条件,因为它不会限制任何内容。

  • 功能模块接受的值最长为 20 个字符,而授权值最长可达 40 个字符。如果需要全长,功能模块不足

  • 类似字符串的字段需要将值括在引号中以实现正确的 SQL 语法,而非字符串值(例如整数 不得 封闭以使 selection 正常工作。确保为列的类型选择正确的封闭。

  • 我不确定代码检查器是否认为该功能模块组合是安全的。动态 WHERE 子句是 SQL 注入的潜在入侵点。 Code Inspector 通常会拒绝将子句组装委托给其他 class 的控制流。您可能需要使用 class cl_abap_dyn_prg.

  • 的方法添加转义

正如弗洛里安所说,您在这里没有太多选择。如果你想查询你的自定义结构 table 只有 dynamic where clause 会帮助你或构建多个 seltabs(范围),但如果 table 键非常复杂,后者可能不起作用。

这里比技术解决方案更实用,但仍然如此。如果你想用来自get_auth_values() FM的授权数据查询你的自定义table,我建议使用辅助数据库table:

DATA: lt_tab TYPE TABLE OF us335.
CALL FUNCTION 'GET_AUTH_VALUES'
  EXPORTING
    object1 = 'B_USERSTAT'
    user    = sy-uname
    tcode   = 'SPRO'
  TABLES
    values  = lt_tab.

SELECT agr_users~uname, agr_1251~auth, agr_users~agr_name
  FROM agr_1251
  JOIN agr_users
    ON agr_users~agr_name = agr_1251~agr_name
  INTO TABLE @DATA(lt_agr)
  FOR ALL ENTRIES IN @lt_tab
  WHERE object   = 'B_USERSTAT'
    AND auth     = @lt_tab-auth
    AND low      = @lt_tab-lowval
    AND high     = @lt_tab-highval.

在这里,我们 select 用户在 table agr_1251 的帮助下获得授权,其结构完全类似于 FM 输出结构。这为您提供了用户名 + 授权,您可以在下一个 selections 中使用它们。