这里有一个小小的ABAP挑战:
对于ABAP项目,我必须从包含2列(example1)的内部表构建另一个包含所有可能组合的表(example2)。 “X”列表示参数。 “Y”代表参数值。
例1:
X(PARAM) Y(值)
A a1
A a2
A a3
B b1
B b2
C c1
C c2
在结果表(example2)中: 我们必须使用数字id(在3列上)获得所有组合。 新的“z”列表示组合ID。对于每个组合,有许多行等于dictinct参数的数量(在我们的例子中,A,B和C为3行)。 “x”列仍代表参数,“y”列代表相关值。
例2:
z(组合号) X(PARAM) Y(值)
1 A a1
1 B b1
1 C c1
2 A a1
2 B b1
2 C c2
3 A a1
3 B b2
3 C c1
4 A a1
4 B b2
4 C c2
...等 等等... 等...
12 A a3
12 B b2
12 C c2
另一个注意事项是参数的数量和每个参数的值的数量是不固定的(初始内部表可以演变很多,因此组合可能)。
我们可能需要递归,但我不确定。
答案 0 :(得分: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.