Table 个可能的组合 ID
Table of all combinations possible with combination id
ABAP 小挑战来了:
对于 ABAP 项目,我必须从一个包含 2 列的内部 table(示例 1)构建另一个 table,其中包含所有可能的组合(示例 2)。
"X" 列代表参数。 "Y"表示参数值。
示例 1:
X(参数)
Y(值)
一个a1
一个a2
一个a3
B b1
B b2
C c1
C c2
在结果 table 中(示例 2):
我们必须获得所有具有数字 ID 的组合(在 3 列上)。
新的 "z" 列表示组合 ID。对于每个组合,有许多行等于 dictinct 参数的数量(在我们的例子中,A、B 和 C 为 3 行)。
"x" 列仍然表示参数,"y" 列表示关联值。
示例 2:
z(组合数)
x(参数)
y(值)
1个a1
1 B b1
1 C c1
2个a1
2 B b1
2 C c2
3个a1
3 B b2
3 C c1
4个a1
4 B b2
4 C c2
等...
ETC...
等...
12个a3
12 B b2
12 C c2
另一个注意事项是参数的数量和每个参数的值的数量是不固定的(最初的内部 table 可以进化很多,因此组合也是可能的)。
我们可能需要递归,但我不确定。
这是一种非递归的方法,您可能需要重写使用新 740 语法的部分。这个想法很简单,首先将数据转换为内部 table,每个参数一个条目包含一个 table 和可能的值,即 LOOP 循环。从那里开始,通过所有组合并将它们添加到另一个内部 table,即 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.
ABAP 小挑战来了:
对于 ABAP 项目,我必须从一个包含 2 列的内部 table(示例 1)构建另一个 table,其中包含所有可能的组合(示例 2)。 "X" 列代表参数。 "Y"表示参数值。
示例 1:
X(参数) Y(值)
一个a1
一个a2
一个a3
B b1
B b2
C c1
C c2
在结果 table 中(示例 2): 我们必须获得所有具有数字 ID 的组合(在 3 列上)。 新的 "z" 列表示组合 ID。对于每个组合,有许多行等于 dictinct 参数的数量(在我们的例子中,A、B 和 C 为 3 行)。 "x" 列仍然表示参数,"y" 列表示关联值。
示例 2:
z(组合数) x(参数) y(值)
1个a1
1 B b1
1 C c1
2个a1
2 B b1
2 C c2
3个a1
3 B b2
3 C c1
4个a1
4 B b2
4 C c2
等... ETC... 等...
12个a3
12 B b2
12 C c2
另一个注意事项是参数的数量和每个参数的值的数量是不固定的(最初的内部 table 可以进化很多,因此组合也是可能的)。
我们可能需要递归,但我不确定。
这是一种非递归的方法,您可能需要重写使用新 740 语法的部分。这个想法很简单,首先将数据转换为内部 table,每个参数一个条目包含一个 table 和可能的值,即 LOOP 循环。从那里开始,通过所有组合并将它们添加到另一个内部 table,即 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.