Почему такое объявление структуры разрешено во встроенном функциональном модуле, но не в новом?

Я работаю над функциональным модулем, который помогает работать с включенным текстом со встроенной логикой. Изучая, как SAP обрабатывает файлы SAPScript и анализирует логику, я обнаружил структуру, которая объявлена ​​так:

DATA BEGIN OF events OCCURS 100.
      INCLUDE STRUCTURE ITCCA.
DATA: command LIKE BOOLEAN,
      template LIKE BOOLEAN,
      mask LIKE BOOLEAN,
     END OF events.

Это, очевидно, работает, поскольку я могу проследить его, пока он запускает программу печати. Поэтому я подумал, что попробую аналогичную структуру в своем собственном коде, но даже когда я скопировал код 1 к 1, как указано выше, я получаю сообщение об ошибке во время активации. Ошибка

"BOOLEAN" must be a flat structure. Internal tables, references, 
strings and structures are forbidden as components.

Может кто-нибудь объяснить мне, почему эта структура действительна в одной программе, а не в моей?


person JRSofty    schedule 10.01.2017    source источник
comment
Где вы нашли исходный код?   -  person vwegert    schedule 10.01.2017
comment
Это часть STXC функциональной группы. Я нашел некоторую информацию об этом после того, как разместил этот вопрос. Кажется, что с LIKE мне пришлось бы самому определять тип BOOLEAN, но если бы я использовал TYPE, то он использовал бы значение словаря для BOOLEAN. Не знаете, почему они решили сами определить это в исходном коде?   -  person JRSofty    schedule 10.01.2017


Ответы (2)


Чтобы объяснить фактический эффект: LIKE обычно относится к объекту данных (фактическая переменная) с правой стороны, не к типу данных. Как вы правильно заметили, после предоставления объекта данных с именем BOOLEAN, который используется для создания типа. Если объект данных с таким именем отсутствует и вы не входите в класс или интерфейс, устаревший вариант оператора LIKE будет активирован, который также учитывает типы данных, но допускает только определенные элементы с правой стороны, а именно только объекты с плоской структурой или их компоненты. LIKE DATATYPE-BOOLEAN должен был работать. Как обычно, сообщение об ошибке не очень полезно.

person vwegert    schedule 10.01.2017
comment
Спасибо за объяснение. Как новичок в SAP и ABAP, я нахожу множество мелких подводных камней в понимании того, как все это работает. - person JRSofty; 10.01.2017
comment
Научитесь жить с этим - это чувство не исчезнет в ближайшее время :-) - person vwegert; 10.01.2017

Похоже, что во время моего первоначального расследования я пропустил объявление для типа BOOLEAN. В группе функций STXC SAP решила объявить свою собственную переменную для логического значения в другом включаемом файле, например:

data: boolean(1) type c.

Первоначально я предполагал, что они делали это с типом, определенным в словаре, который имеет аналогичное имя и представляет собой строку длиной в 1 символ. Я также обнаружил, что если бы я изменил объявление своей структуры следующим образом:

DATA BEGIN OF events OCCURS 100.
  INCLUDE STRUCTURE ITCCA.
DATA: command TYPE BOOLEAN,
  template TYPE BOOLEAN,
  mask TYPE BOOLEAN,
 END OF events.

Мой код будет действительным, потому что тогда он будет использовать значение, определенное в словаре. Так что либо мне нужно добавить объявление для моего собственного определения boolean, чтобы использовать ключевое слово LIKE, либо я должен использовать ключевое слово TYPE, чтобы использовать определение словаря.

person JRSofty    schedule 10.01.2017