Algorithm 具有组合id的所有可能组合的表

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:

下面是一个小小的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

另一个注意事项是,参数的数量和每个参数的值的数量不是固定的(初始内部表可能会发生很多变化,因此组合是可能的)


我们可能需要递归,但我不确定。这里有一种非递归的方法,您可能需要重写使用新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版本)。