1

ちょっとした ABAP の課題があります。

ABAP プロジェクトの場合、2 つの列 (例 1) を持つ内部テーブルから、可能なすべての組み合わせを含む別のテーブル (例 2) を作成する必要があります。「X」列はパラメータを表します。「Y」はパラメータ値を表します。

例1:

X(パラメータ) Y(値)

Aa1

Aa2

Aa3

Bb1

B b2

Cc1

Cc2

結果テーブル (example2): 数値 ID (3 列) を持つすべての組み合わせを取得する必要があります。新しい「z」列は組み合わせ ID を表します。各組み合わせには、dictinct パラメーターの数に等しい数の行があります (この場合、A、B、および C に対して 3 行)。「x」列は引き続きパラメーターを表し、「y」列は関連する値を表します。

例 2:

z(組み合わせ数) x(パラメーター) y(値)

1Aa1

1Bb1

1C c1

2Aa1

2Bb1

2C c2

3Aa1

3Bb2

3C c1

4Aa1

4Bb2

4C c2

など...など...など...

12Aa3

12Bb2

12C c2

もう 1 つの注意点は、パラメーターの数とパラメーターごとの値の数が固定されていないことです (最初の内部テーブルは大幅に進化する可能性があるため、組み合わせが可能になります)。

再帰が必要かもしれませんが、よくわかりません。

4

1 に答える 1

3

これは非再帰的な方法です。新しい 740 構文を使用する部分を書き直す必要があるかもしれません。アイデアは非常に単純です。最初にデータを内部テーブルに変換し、パラメータごとに 1 つのエントリを持ち、可能な値を持つテーブルを含む 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 に答える