Как сгенерировать декартово произведение двух внутренних таблиц? - PullRequest
0 голосов
/ 11 июня 2019

У меня на самом деле есть простое требование. Даны две таблицы:

enter image description here

Какой самый эффективный способ получить третью таблицу со всеми возможными комбинациями значений из этих таблиц, начиная со значений из первой таблицы? Ну, как 1A, 1B, 1C, 2A ..... и т. Д.

Есть ли какие-нибудь стандартные рамки, которые я мог бы использовать для этого?

Ответы [ 3 ]

0 голосов
/ 12 июня 2019

Похоже, вам нужен декартово произведение из двух таблиц. В этом случае используйте CROSS JOIN, как описано здесь

Цитата из статьи:

REPORT ZZZ.

SELECT t000~mandt, t000~mtext, t100~*
       FROM t000 CROSS JOIN t100
       WHERE t100~arbgb = 'SABAPDEMOS'
       ORDER BY t000~mandt, t100~sprsl, t100~msgnr
       INTO TABLE @DATA(itab).

BREAK-POINT.
0 голосов
/ 20 июня 2019

Это самая короткая однострочная строка, которую я могу себе представить

TYPES: tt     TYPE TABLE OF c WITH EMPTY KEY,
       tt_res TYPE TABLE OF char2 WITH EMPTY KEY.

DATA(t1) = VALUE tt( ( '1' ) ( '2' ) ( '3' ) ).
DATA(t2) = VALUE tt( ( 'A' ) ( 'B' ) ( 'C' ) ).
DATA(l2) = lines( t2 ).

DATA(result) = VALUE tt_res(  ).

DO lines( t1 ) * l2 TIMES.
  result = VALUE #( BASE result ( t1[ ( sy-index + l2 - 1 ) DIV l2 ] && VALUE #( t2[ sy-index MOD l2 ] DEFAULT t2[ l2 ] ) ) ).
ENDDO.

Хотя она использует цикл, но не вложенный цикл.Это обозначение не очень читабельно, но, тем не менее, короткое.Я уверен, что есть также способ сделать это с VALUE..FOR, но я считаю, что это будет более многословно.

Конечно, вы должны настроить типы для ваших реальных таблиц и проверить набор данных большего размера.

0 голосов
/ 12 июня 2019

Вы можете загрузить все значения во внутренние таблицы, а затем сделать вложенный цикл для заполнения новой внутренней таблицы столбцами со сцеплением.

...