Как обновить внутреннюю таблицу другой внутренней таблицей? - PullRequest
1 голос
/ 30 мая 2020

У меня есть эта таблица, и вы заметите, что столбец VKBUR пуст:

Главный стол

Как лучше всего заполнить этот столбец записями из другой таблицы, используя столбец VKGRP в качестве ключа?

Таким образом, я хотел бы заполнить столбец VKBUR, используя данные из L_T_ZCUSTSL04 в качестве источника. Их ключ VKGRP из обеих таблиц:

Справочная таблица

Используя эту таблицу поиска, я хочу передать значения из VKBUR в приведенную выше таблицу.

Большое спасибо за вашу помощь и хороших выходных.

Ответы [ 2 ]

1 голос
/ 01 июня 2020

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

TYPES: BEGIN OF ty_mara,
             matnr TYPE matnr,
             matkl TYPE matkl,
             maktx TYPE maktx,
           END OF ty_mara,
           BEGIN OF ty_text,
             matnr TYPE matnr,
             maktx TYPE maktx,
         END OF ty_text.

 DATA: gt_text TYPE STANDARD TABLE OF ty_text.
 DATA: gt_mara TYPE STANDARD TABLE OF ty_mara.
TYPES: tty_empty TYPE STANDARD TABLE OF ty_mara WITH EMPTY KEY.

SELECT matnr, matkl UP TO 10 ROWS
  FROM mara
  INTO TABLE @gt_mara.

SELECT matnr, maktx
  INTO TABLE @gt_text
  FROM makt
   FOR ALL ENTRIES IN @gt_mara
 WHERE matnr = @gt_mara-matnr.

  DATA(gt_result) = VALUE tty_empty( FOR wa IN gt_mara ( matnr = wa-matnr matkl = wa-matkl maktx = VALUE maktx( gt_text[ matnr = wa-matnr ]-maktx OPTIONAL ) ) ).

Однако у этого способа есть несколько недостатков по сравнению со способом Дэна, потому что для этого требуется объявление таблицы stati c, и он создает новый itab вместо изменения существующего. Поэтому я рекомендую придерживаться пути Дэна.

Конечно, построения новой таблицы можно избежать с помощью старого доброго l oop и табличного выражения:

LOOP AT gt_mara ASSIGNING FIELD-SYMBOL(<fs_mara>).
  maktx = VALUE maktx( gt_text[ matnr = <fs_mara>-matnr ]-maktx OPTIONAL ).
ENDLOOP.
1 голос
/ 30 мая 2020

Если вы работаете с версией 7.4 или новее, рассмотрите следующий пример, основанный на операторе конструктора CORRESPONDING.

TYPES: BEGIN OF gs_report,
         equnr TYPE equnr,
         eqtyp TYPE eqtyp,
        anlage TYPE anlage,
         sernr TYPE serge,
       END OF gs_report.

DATA: gt_msrpoint TYPE SORTED TABLE OF gs_report WITH NON-UNIQUE key anlage.

SELECT equi~equnr, equi~eqtyp, eanl~anlage, sernr UP TO 50 rows
  INTO TABLE @gt_msrpoint
  FROM eanl
  JOIN eastl ON eastl~anlage     = eanl~anlage
  JOIN egerh ON egerh~logiknr    = eastl~logiknr
  LEFT JOIN equi ON  egerh~equnr = equi~equnr.

SELECT equi~matnr, equi~objnr, eanl~anlage, serge AS sernr UP TO 50 rows
  INTO TABLE @DATA(gt_msrpoint1)
  FROM eanl
  JOIN eastl ON  eastl~anlage    = eanl~anlage
  JOIN egerh ON  egerh~logiknr   = eastl~logiknr
  LEFT JOIN equi ON  egerh~equnr = equi~equnr.

gt_msrpoint1 = CORRESPONDING #( gt_msrpoint1 FROM gt_msrpoint USING anlage = anlage  ).

Протестировано и работает.

...