首页 > 解决方案 > 将字符串混合输入拆分为单个值的范围

问题描述

我有一个允许多个 ID 的输入。它们可以像这样输入:

[  1000, 1001, 1050-1060, 1100  ]              

我想从这个输入字符串中获取所有单个 ID。我已经发现这个在 each 之后拆分,,所以 1000, 1001 的部分已经可以工作了。

data : itab TYPE TABLE OF string,
SPLIT l_bukrs_string AT ';' INTO TABLE itab.

我的问题是自建范围。知道如何将其与上述情况结合起来将 1050-1060 拆分为单个值吗?

我要1050 | 1051 | 1052 | ... | 1060出它。

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

标签: stringrangeabap

解决方案


最简单的解决方案是对用户(?)输入使用真正的范围/选择选项。然后,您将使用该范围从数据库表中选择每个值。

如果您不能使用真正的范围/选择选项,那么您可以将字符串转换为一个,如下所示。

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

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

编辑:没有命令、功能模块或类将范围转换为单个值的原因是因为需要做的事情会根据范围的数据以及是否/需要验证多少值而发生很大变化。如果您有一个整数范围,那么您需要做的就是获取起始值并将其加 1 直到达到起始值。一系列二进制浮点数呢?一系列颜色呢?您的公司代码范围如何,并非所有代码都必须存在?这就是必须手动完成转换的原因。


推荐阅读