将字符串混合输入拆分为单个值的范围

Split string mixed input into range of single values

我有一个允许多个 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个出来

感谢每一个提示 :) 非常感谢!

最简单的解决方案是使用真实的 range/select-option 作为用户 (?) 输入的代替。然后,您将使用该范围 select 数据库中的每个值 table.

如果您不能使用真正的 range/select-option,那么您可以将字符串转换为如下所示的字符串。

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 条目。

获得真实射程后,您可以使用它从数据库中 select。 这是因为并非该范围内的每个 bukrs 都必须存在。例如,您可能只有 1000、1050、1055 和 1060。

Edit:没有命令、功能模块或 class 将范围转换为单个值的原因是因为需要做的事情在很大程度上取决于范围是什么数据,if/how 很多值需要验证。 如果您有一个整数范围,那么您需要做的就是获取起始值并向其加 1 直到达到终止值。一系列二进制浮点数呢?各种颜色怎么样?您的公司代码范围如何(并非所有代码都必然存在)?这就是必须手动完成转换的原因。

如果给你的是一个包含混合值列表的字符串,单个和区间 BUKRS 值均以破折号分隔,并且此列表以逗号+space分隔,则

DATA: input   TYPE string VALUE '1000, 1001, 1050-1060, 1100, 1300-1340',
      itab    TYPE TABLE OF char10,
      r_bukrs TYPE RANGE OF bukrs.

SPLIT input AT `, ` INTO TABLE itab.

r_bukrs = VALUE #( FOR GROUPS bukrs OF <bukrs> IN itab WHERE ( table_line+4(1) NE '-' ) GROUP BY <bukrs> WITHOUT MEMBERS ( sign = 'I' option = 'EQ' low = bukrs ) ).
DATA(ranges) = VALUE ddtest_ttyp_char( FOR GROUPS bukrs OF <bukrs> IN itab WHERE ( table_line+4(1) EQ '-' ) GROUP BY <bukrs> WITHOUT MEMBERS ( bukrs ) ).

LOOP AT ranges ASSIGNING FIELD-SYMBOL(<range>).
  r_bukrs = VALUE #( BASE r_bukrs FOR j = CONV i( <range>(4) ) UNTIL j = CONV i( <range>+5(4) ) + 1 ( sign = 'I' option = 'EQ' low = j ) ).
ENDLOOP.

第一个 table 表达式(第 7 行)用初始 table 字符串中的唯一值填充 r_bukrs

第二个 table 表达式(第 8 行)用初始 table 字符串、1050-1060 和 [=14] 中的破折号范围填充 ranges table =] 在我们的案例中。

rangestable的循环中,<range>(4)是区间的左极值,<range>+5(4)是右极值,例如13001340 对应最后一个值区间。