Определите возвращаемый тип как упакованный номер для метода - PullRequest
0 голосов
/ 05 июня 2018

Я изучаю объекты 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 ]

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

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

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

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

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

METHODS getamount RETURNING value(r) TYPE decfloat16.
0 голосов
/ 05 июня 2018

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

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

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

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

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.  
...