Определите возвращаемый тип как упакованный номер для метода

Я изучаю объекты ABAP. Я хотел бы иметь метод объекта, возвращающий упакованный тип числа. Я наконец-то заработал, но я не знаю, правильный ли это путь, и мне нужны дальнейшие объяснения, которые я не могу найти в Интернете.

Для целых чисел, это прекрасно работает:

METHODS: getamount RETURNING VALUE(r) TYPE i,

Для упакованного номера это не так:

METHODS: getamount RETURNING VALUE(r) TYPE p,

Ошибка: тип параметра RETURNING должен быть полностью указан

METHODS: getamount RETURNING VALUE(r) TYPE p LENGTH 10 DECIMALS 3,

Ошибка: тип параметра RETURNING должен быть полностью указан

(1) Есть ли способ заставить его работать с p тип?

Я сделал это с помощью dec5_2:

getamount RETURNING VALUE(r) TYPE dec5_2

(2) это правильная альтернатива? Есть ли список похожих типов?

Кроме того, я нашел это решение, но оно не работает для меня:

CLASS lcl_rowinvoice DEFINITION.
  PUBLIC SECTION.
    METHODS:
      getamount RETURNING VALUE(r) TYPE typeprice,  
  PRIVATE SECTION.
    TYPES:
      typeprice TYPE p LENGTH 10 DECIMALS 2,

Неизвестный тип "TYPEPRICE".

(3) Есть ли способ заставить это решение работать?

2 ответа

Решение

Возвращаемые параметры должны быть полностью напечатаны, p является универсальным типом, поэтому у вас есть три варианта:

  1. Используйте предварительно определенный элемент данных из словаря данных (SE11 => Элементы данных)

 METHODS getamount RETURNING value(r) TYPE netwr.
  1. Используйте тип, который определен в разделе PUBLIC локального класса.

TYPES: lty_p TYPE p LENGTH 15 DECIMALS 2.
METHODS getamount RETURNING value(r) TYPE lty_p.
  1. Используйте полностью предопределенный тип (decfloat16 или decfloat34)

METHODS getamount RETURNING value(r) TYPE decfloat16.

Это очень интересный вопрос, который вы подняли здесь.

В ABAP распространено правило, что объявление типов и объектов действует только со строки, в которой они были объявлены:

Определенный тип данных можно просматривать в текущем контексте с этой позиции.

Но! Но здесь у нас есть интересное столкновение с синтаксисом определения класса ABAP Objects

CLASS class DEFINITION [class_options]. 
  [PUBLIC SECTION. 
    [components]] 
  [PROTECTED SECTION. 
    [components]] 
  [PRIVATE SECTION. 
    [components]] 
ENDCLASS. 

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

Хотя это не противоречит концепции видимости ABAP, технически невозможно объявить тип в закрытом разделе и использовать его в открытом доступе. Позиция объявления этого типа будет ниже открытого раздела и, таким образом, фактически невидима для него.

Но если вы измените порядок объявления / использования частей, все будет скомпилировано нормально.

CLASS lcl_rowinvoice DEFINITION.

PUBLIC SECTION.
   TYPES: typeprice TYPE p LENGTH 10 DECIMALS 2.

PRIVATE SECTION.
   METHODS: getamount RETURNING VALUE(r) TYPE typeprice.

ENDCLASS.  
Другие вопросы по тегам