Внутреннее соединение только с декларацией TABLES - PullRequest
0 голосов
/ 04 июля 2018

Мне нужно написать программу ABAP, используя внутреннее соединение таблиц mara и makt. Я понимаю идею использования объявлений данных следующим образом:

data: imatnr type mara-matnr,
      ematnr type makt-matnr.

select mara~matnr makt~matnr into (imatnr, ematnr) from mara left join makt on mara~matnr = makt~matnr.
  write: / imatnr, ematnr.
endselect.

В своих экзаменах я должен написать программу ABAP без внутренних таблиц, символов поля ПРОСТО ДЕКЛАРАЦИИ ТАБЛИЦ . Я сделал несколько попыток сделать это, но я не нашел ответа. Я пробовал что-то вроде этого:

tables: mara, makt.


select * from mara inner join makt on mara~matnr = makt~matnr.
  write: / mara-matnr, makt-matnr.
endselect.

Консоль говорит, что я должен использовать INTO, если я хочу использовать JOIN в операторе select * from.

Итак, мой вопрос: возможно ли создать JOIN только с TABLES или мне нужно DATA: в любом случае?

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Пожалуйста, старайтесь не использовать Select *. Получить только необходимые имена полей из таблицы БД.

Ниже приведен пример объединения двух таблиц.

SELECT t1~mandt t1~bname t1~datfm t1~dcpfm t1~langu t1~timefm t2~erdat
      FROM usr01 AS t1
      INNER JOIN usr02 AS t2
        ON t1~bname = t2~bname
        AND t2~ustyp = 'A'
      INTO CORRESPONDING FIELDS OF TABLE gt_usr01_v1
0 голосов
/ 05 июля 2018

Итак, мой вопрос:

Можно ли создать JOIN только с таблицами: mara, makt.

Нет. Таблица представляет собой рабочую область, известную как плоская структура, ключевое слово flat . Вы не можете выбрать несколько строк только с помощью TABLES и не можете присоединиться к рабочим областям TABLES.

КСТАТИ, ТАБЛИЦЫ справки четко говорит

Нет рабочих областей стола, кроме классических dynpros

так что забудьте об этом устаревшем материале.

Если ваши экзамены и учебные курсы требуют, чтобы вы использовали только TABLES, убегайте от этих курсов и этих школ. Пожалуйста, убегайте.

P.S. Единственный способ выполнить ваши неприятные требования - это вложенные SELECT:

TABLES: mara, makt.

SELECT * FROM mara
  INTO mara.
  WRITE: / `MARA selected: `, mara-matnr.
  SELECT *
    INTO makt
    FROM makt WHERE matnr = mara-matnr.
    WRITE: / `MAKT selected: `, makt-matnr.
  ENDSELECT.
ENDSELECT.

Но это отвратительно.

0 голосов
/ 05 июля 2018

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

Общий оператор выбора (без какого-либо определенного типа) выглядит следующим образом.

Select * from [table] where [field] = [value]

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


into table

into table выбирает одну или несколько записей во внутренней таблице . может использоваться только тогда, когда ваше предложение select (список полей) идентично структуре вашей внутренней таблицы.

   data: lt_ekko type table of ekko,
         ls_ekko type table of ekko,
   select * from ekko into table @lt_ekko.
   loop at lt_ekko into ls_ekko.
      write: / ls_ekko-ebeln.
   endloop.

into

into означает, что вы выбираете переменную (если вы выбираете 1 столбец) или структуру (если вы выбираете более 1). Это важно, потому что структуры могут только и переменные могут хранить только 1 значение или строку, что означает, что вы должны указать, что вы выбираете single строку или использовать операторы select / endselect для выполнения цикла выберите.

  data: ls_ekko type ekko.
  select single * from ekko into @ls_ekko where ebeln = [some number]
  write: / ls_ekko-ebeln.

OR

    select * from ekko into @ls_ekko where ebeln = [some number].
       write: / ls_ekko-ebeln. "will print one for each row
    endselect.

into corresponding fields of (table)

into corresponding fields ofinto corresponding fields of table) выбирает записи одинаково into и into internal table. Разница в том, что ваша структура или внутренняя таблица не должны совпадать с выбранным списком полей. Выбранные поля будут сохранены в полях таблицы / структуры с такими же именами.

  data: ls_ekko type ekko.
  select single ebeln, bukrs from ekko into @ls_ekko where ebeln = [some number].
  write: / ls_ekko-ebeln.

нет into пункт

нет into предложение аналогично into [структура], поскольку он может выбрать только 1 запись. Это означает, что вы должны указать, что вы выбрали single запись. Примечание: Таблицы, из которых вы выбираете, должны быть объявлены в программе, чтобы использовать этот тип выбора.

  select single * from ekko where ebeln = [some number].
  write: / ekko-ebeln.

Поскольку вы не используете предложение into, вы используете последний тип, а это означает, что вы должны использовать select single

...