我有一个允许多个ID的输入。可以这样输入:
[ 1000, 1001, 1050-1060, 1100 ]
从此输入字符串中,我想获取所有单个ID。我已经发现每个之后都可以拆分,
,因此具有1000、1001的部分已经可以使用。
data : itab TYPE TABLE OF string,
SPLIT l_bukrs_string AT ';' INTO TABLE itab.
我的问题是自建范围。知道如何将其与上面的情况结合起来以将1050-1060拆分为单个值吗?
我要1050 | 1051 | 1052 | ... | 1060。
感谢所有提示:)非常感谢!
最简单的解决方案是改为对用户(?)输入使用实际范围/选择选项。然后,您将使用该范围从数据库表中选择每个值。
如果您不能使用实际范围/选择选项,则可以将字符串转换为一个,如下所示。
DATA: bukrs_string TYPE string,
split_bukrs TYPE TABLE OF string,
bukrs TYPE bukrs,
bukrs_between TYPE TABLE OF bukrs,
bukrs_range TYPE RANGE OF bukrs,
bukrs_rline LIKE LINE OF bukrs_range,
bukrs_table TYPE TABLE OF bukrs.
FIELD-SYMBOLS: <string> TYPE string,
<bukrs> TYPE bukrs,
<bukrs_from> TYPE bukrs,
<bukrs_to> TYPE bukrs.
bukrs_string = '1000, 1001, 1050-1060, 1100'.
CONDENSE bukrs_string NO-GAPS.
SPLIT bukrs_string AT ',' INTO TABLE split_bukrs.
LOOP AT split_bukrs ASSIGNING <string>.
bukrs_rline-sign = 'I'.
IF <string> CA '-'.
SPLIT <string> AT '-' INTO TABLE bukrs_between.
bukrs_rline-option = 'BT'.
READ TABLE bukrs_between INDEX 1 ASSIGNING <bukrs_from>.
bukrs_rline-low = <bukrs_from>.
READ TABLE bukrs_between INDEX 2 ASSIGNING <bukrs_to>.
bukrs_rline-high = <bukrs_to>.
ELSE.
bukrs_rline-option = 'EQ'.
bukrs = <string>.
bukrs_rline-low = bukrs.
ENDIF.
APPEND bukrs_rline TO bukrs_range.
CLEAR bukrs_rline.
ENDLOOP.
SELECT bukrs
FROM t001
INTO TABLE bukrs_table
WHERE bukrs IN bukrs_range.
在分割字符串之前,请先将其压缩以删除所有空格。然后,您将遍历结果部分,并检查其是否包含任何“-”。如果是这种情况,请再次拆分它并在您的范围内创建一个BETWEEN条目(考虑是否可能需要进行其他检查,以查看后者的数字是否实际上更高)。如果没有“-”,则只需创建一个EQUAL条目。
拥有实际范围后,就可以使用它来从数据库中进行选择。这是因为并非该范围内的每个骗子都必须存在。例如,您可能只有1000、1050、1055和1060。
编辑:之所以没有命令,功能模块或类来将范围转换为单个值,是因为需要执行的操作根据范围所针对的数据以及是否/需要验证多少值而发生重大变化。如果您有整数范围,那么您要做的就是取起始值并将其加1直到达到目标值。一系列二进制浮点数呢?各种颜色呢?那么您的公司代码范围又如何呢?这就是为什么必须手动完成转换的原因。
优秀的!太完美了,非常感谢!范围输入也不应该是一个问题(代码会更短吗?),但我担心它不允许多个范围?
这取决于您使用的程序类型。如果它是带有选择屏幕的报告,那么那根本没问题。您只需使用
SELECT-OPTIONS s_bukrs FOR t001-bukrs
而不是即可PARAMETERS p_bukrs TYPE string
。在选择选项中,您可以存储任意数量的输入,单个值或范围(包括或不包括)。然后,获取每个单个值所需的代码仅包含SELECT
。但是,如果您使用的是dynpro或WebDynpro程序,则必须跳过一些箍以包括选择选项。我也一定会检查一下!我只是从ABAP开始,因此许多选择对我来说都是新的。恕我直言,这种语言绝对不适合初学者,而且过于way肿。非常感谢你的帮助!如果您不介意,当需要帮助时,我会发表另一条评论。