ABAP:从get_auth_values()结果到SQL查询

时间:2018-12-10 14:32:08

标签: sap abap opensql

我使用get_auth_values()的结果。这是us335类型的结构。

此结果可以包含单个值或成对的低-高值。

我想使用这些类似于us335的结果并执行SQL查询。将条目与AND组合。

我看到了解决此问题的方法:

  • 使用`WHERE COL IN(value1,value2,...)AND COL <= value3和col> = value4 ...
  • 创建一个SQL查询
  • 使用我自己的代码(使用RANGE),使用特定于OpenSQL的IN seltab创建SQL查询
  • 使用特定于OpenSQL的IN seltab和内置方法(目前尚不知道)来创建SQL查询

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

最可行的方法是什么?

2 个答案:

答案 0 :(得分:1)

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

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

构建WHERE子句时,请注意以下详细信息:

  • 授权中的字段名称可能与您从中选择的列名称不同。您可能需要映射它们。

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

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

  • 类似字符串的字段要求将值括在引号中以确保正确的SQL语法,同时必须包含非字符串值(例如整数 )以使选择正确。确保为列的类型选择正确的附件。

  • 我不确定代码检查器是否认为功能模块的组合是否安全。动态WHERE子句是SQL注入的潜在入侵点。 Code Inspector通常拒绝将子句汇编委托给其他某个类的控制流。您可能需要使用类cl_abap_dyn_prg的方法添加转义。

答案 1 :(得分:1)

正如弗洛里安所说,您在这里没有太多选择。如果要查询自定义结构表,则仅dynamic where clause会帮助您或构造多个seltab(范围),但是如果表键非常复杂,则后者可能无法正常工作。

尽管如此,这里的功能要比技术解决方案更强大。如果您要使用来自get_auth_values() FM的身份验证数据查询自定义表,我建议使用辅助数据库表:

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.

在这里,我们根据表agr_1251的权限选择用户,该表的结构与FM输出结构完全相似。这样会为您提供用户名+授权,您可以在以后的选择中使用它。