我使用get_auth_values()的结果。这是us335类型的结构。
此结果可以包含单个值或成对的低-高值。
我想使用这些类似于us335的结果并执行SQL查询。将条目与AND
组合。
我看到了解决此问题的方法:
IN seltab
和内置方法(目前尚不知道)来创建SQL查询我想还有更多方法可以解决这个问题。
最可行的方法是什么?
答案 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输出结构完全相似。这样会为您提供用户名+授权,您可以在以后的选择中使用它。