Algorithm 具有组合id的所有可能组合的表
下面是一个小小的ABAP挑战: 对于ABAP项目,我必须从一个包含2列的内部表(示例1)构建另一个包含所有可能组合的表(示例2)。 “X”列表示参数。“Y”表示参数值 例1: X(参数) Y(值) a1 a2 a3 B b1 B b2 C c1 C c2 在结果表中(示例2): 我们必须获得具有数字id的所有组合(在3列上)。 新的“z”列表示组合id。对于每个组合,有许多行与dictionct参数的数量相等(在我们的示例中,a、B和C为3行)。 “x”列仍然表示参数,“y”列表示关联值 例2: z(组合数) x(参数) 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 另一个注意事项是,参数的数量和每个参数的值的数量不是固定的(初始内部表可能会发生很多变化,因此组合是可能的)Algorithm 具有组合id的所有可能组合的表,algorithm,abap,internal-tables,Algorithm,Abap,Internal Tables,下面是一个小小的ABAP挑战: 对于ABAP项目,我必须从一个包含2列的内部表(示例1)构建另一个包含所有可能组合的表(示例2)。 “X”列表示参数。“Y”表示参数值 例1: X(参数) Y(值) a1 a2 a3 B b1 B b2 C c1 C c2 在结果表中(示例2): 我们必须获得具有数字id的所有组合(在3列上)。 新的“z”列表示组合id。对于每个组合,有许多行与dictionct参数的数量相等(在我们的示例中,a、B和C为3行)。 “x”列仍然表示参数,“y”列表示关联值 例2:
我们可能需要递归,但我不确定。这里有一种非递归的方法,您可能需要重写使用新740语法的部分。这个想法非常简单,首先将数据转换成一个内部表,每个参数有一个条目,其中包含一个可能值的表,即循环。从这里开始,只需遍历所有组合并将它们添加到另一个内部表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.
报告z_算法。
类型:ty_参数类型char1,
ty_值类型char2,
结构的开始,
x型ty_参数,
y型ty_值,
结构的末尾,
泰康比之始,
z型i,
s型ty_结构,
泰库比的尽头。
类型:ty_param_struct的开头,
x型ty_参数,
带有默认键的ty_值的ys类型标准表,
九、第一类,
ty_param_结构的结尾。
数据:ty_结构的制表符类型标准表,
ty_param_struct的参数类型标准表,
完成类型abap_bool值abap_false,
z类型i值为0,
溢出类型abap_布尔值abap_false,
ty_combi的combis型标准表。
开始选择。
附加值:#(x='A'y='a1')到选项卡,
#(x='A'y='a2')到制表符,
#(x='A'y='a3')到制表符,
#(x='B'y='b1')到制表符,
#(x='B'y='b2')到制表符,
#(x='C'y='c1')到制表符,
#(x='C'y='c2')到制表符。
在选项卡处循环指定字段-SYMBOL()。
读取表参数,键为x=-x,指定字段-SYMBOL()。
如果sy subrc NE为0。
将初始行附加到参数赋值。
-x=-x。
-ix=1。
恩迪夫。
将-y附加到-ys。
结束循环。
当完成时,EQ abap_错误。
将1添加到z。
溢出=abap_真。
完成=abap_为真。
在参数赋值时循环。
读取表-ys INDEX-ix赋值字段-SYMBOL()。
将值#(z=zs-x=-xs-y=)附加到combis。
如果溢出EQ abap_为真。
将1添加到-ix。
恩迪夫。
IF-ix燃气轮机管路(-ys)。
溢出=abap_真。
-ix=1。
其他的
溢出=abap_错误。
完成=abap_错误。
恩迪夫。
结束循环。
结束时。
您想要解决方案还是如何解决的指导?您熟悉循环内“At New”块的排序和使用吗?@TheG:解决方案将不胜感激。我已经知道什么是排序方式,循环和在新的。我也知道我必须使用它,但我不知道如何使用-uu-好吧,让我试试。进一步观察,出现了一种模式,但我发现它并不像表面看起来那么简单:)@TheG:我已经尝试了一些方法。。。例如,首先计算组合的总数,或者使用每个参数的值创建一个表。每次我出错或头痛^^^;也许有一种方法可以避免递归,我仍在尝试。我投票将这个问题作为离题题来结束,因为它看起来像是一个家庭作业,海报上没有明显的尝试来解决它……我印象深刻!我把它翻译成abap的旧版本,效果很好。你改变了输出表,在其中添加了一个结构,这有点作弊,但与我以前的atempts相比,它太短了。真不错!(我编辑了你的帖子以添加旧的abap版本)。