从 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
.
组合
我看到了这些解决方法:
- 使用 `WHERE COL IN (value1, value2, ...) AND COL <=value3 and col >=value4 ...
创建一个 SQL 查询
- 使用 OpenSQL 特定 IN seltab 和我自己的代码(使用 RANGE)创建一个 SQL 查询
- 使用 OpenSQL 特定
IN seltab
和内置方法(我现在还不知道)创建一个 SQL 查询
我想还有更多的方法可以解决这个问题。
最可行的方法是什么?
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 中使用它们。
我用的是get_auth_values() whic has structure type us335的结果。
此结果可以包含单个值或成对的低-高值。我想使用这些类似 us335 的结果并执行 SQL 查询。将条目与 AND
.
我看到了这些解决方法:
- 使用 `WHERE COL IN (value1, value2, ...) AND COL <=value3 and col >=value4 ... 创建一个 SQL 查询
- 使用 OpenSQL 特定 IN seltab 和我自己的代码(使用 RANGE)创建一个 SQL 查询
- 使用 OpenSQL 特定
IN seltab
和内置方法(我现在还不知道)创建一个 SQL 查询
我想还有更多的方法可以解决这个问题。
最可行的方法是什么?
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 中使用它们。