1

这是一个小小的 ABAP 挑战:

对于 ABAP 项目,我必须从具有 2 列的内部表(示例 1)构建另一个包含所有可能组合的表(示例 2)。“X”列代表参数。“Y”代表参数值。

示例1:

X(参数) Y(值)

一个a1

一个a2

一个a3

乙b1

乙b2

Cc1

C c2

在结果表(example2)中:我们必须得到所有带有数字 id 的组合(在 3 列上)。新的“z”列表示组合 ID。对于每个组合,行数等于字典参数的数量(在我们的例子中,A、B 和 C 为 3 行)。“x”列仍然代表参数,“y”列代表相关值。

示例2:

z(组合数) x(参数) y(值)

1个a1

1 B B1

1 C C1

2 A a1

2 乙 b1

2 C C2

3 A a1

3 B B2

3 C C1

4 A a1

4 乙 b2

4 C C2

等等……等等……等等……

12 一个 a3

12 乙 b2

12 C C2

另一个要注意的是参数的数量和每个参数的值的数量不是固定的(初始内部表可以演变很多,因此组合可能)。

我们可能需要递归,但我不确定。

4

1 回答 1

3

这是一种非递归的方法,您可能必须重写使用新的 740 语法的部分。这个想法非常简单,首先将数据转换为一个内部表,每个参数一个条目,其中包含一个带有可能值的表,即 LOOP 循环。从那里可以很简单地完成所有组合并将它们添加到另一个内部表,即 WHILE 循环。

REPORT z_algorithm.

TYPES: ty_param TYPE char1,
       ty_value TYPE char2,
       BEGIN OF ty_struct,
         x TYPE ty_param,
         y TYPE ty_value,
       END OF ty_struct,
       BEGIN OF ty_combi,
         z TYPE i,
         s TYPE ty_struct,
       END OF ty_combi.
TYPES: BEGIN OF ty_param_struct,
         x  TYPE ty_param,
         ys TYPE STANDARD TABLE OF ty_value WITH DEFAULT KEY,
         ix TYPE i,
       END OF ty_param_struct.


DATA: tab      TYPE STANDARD TABLE OF ty_struct,
      params   TYPE STANDARD TABLE OF ty_param_struct,
      done     TYPE abap_bool VALUE abap_false,
      z        TYPE i VALUE 0,
      overflow TYPE abap_bool VALUE abap_false,
      combis   TYPE STANDARD TABLE OF ty_combi.

START-OF-SELECTION.
  APPEND VALUE: #( x = 'A' y = 'a1' ) TO tab,
                #( x = 'A' y = 'a2' ) TO tab,
                #( x = 'A' y = 'a3' ) TO tab,
                #( x = 'B' y = 'b1' ) TO tab,
                #( x = 'B' y = 'b2' ) TO tab,
                #( x = 'C' y = 'c1' ) TO tab,
                #( x = 'C' y = 'c2' ) TO tab.

  LOOP AT tab ASSIGNING FIELD-SYMBOL(<tab>).
    READ TABLE params WITH KEY x = <tab>-x ASSIGNING FIELD-SYMBOL(<param>).
    IF sy-subrc NE 0.
      APPEND INITIAL LINE TO params ASSIGNING <param>.
      <param>-x = <tab>-x.
      <param>-ix = 1.
    ENDIF.
    APPEND <tab>-y TO <param>-ys.
  ENDLOOP.

  WHILE done EQ abap_false.

    ADD 1 TO z.
    overflow = abap_true.
    done = abap_true.

    LOOP AT params ASSIGNING <param>.

      READ TABLE <param>-ys INDEX <param>-ix ASSIGNING FIELD-SYMBOL(<y>).
      APPEND VALUE #( z = z s-x = <param>-x s-y = <y> ) TO combis.

      IF overflow EQ abap_true.
        ADD 1 TO <param>-ix.
      ENDIF.

      IF <param>-ix GT lines( <param>-ys ).
        overflow = abap_true.
        <param>-ix = 1.
      ELSE.
        overflow = abap_false.
        done = abap_false.
      ENDIF.

    ENDLOOP.

  ENDWHILE.
于 2015-10-22T18:37:20.470 回答