将返回类型定义为方法的压缩数字

Define returning type as packed number for method

我正在学习 ABAP 对象。我想要一个返回压缩数字类型的对象方法。我终于成功了,但我不知道这是否是正确的方法,我需要一些我在网上找不到的进一步解释。

对于整数,它工作正常:

METHODS: getamount RETURNING VALUE(r) TYPE i,

对于压缩号码,它没有:

METHODS: getamount RETURNING VALUE(r) TYPE p,

Error: The type of RETURNING parameter must be fully specified

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

Error: The type of RETURNING parameter must be fully specified

(1) 有没有办法让它与 p 类型一起工作?

我使用 dec5_2:

让它工作
getamount RETURNING VALUE(r) TYPE dec5_2

(2) 这是正确的选择吗?有类似类型的列表吗?

此外,我找到了 this solution,但它对我不起作用:

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

Unknown type "TYPEPRICE".

(3) 有没有办法使这个解决方案起作用?

你在这里提出的问题很有趣。

It is common rule 在 ABAP 中,声明类型和对象仅在声明它们的行中有效:

The defined data type can be viewed within the current context from this position.

但是!但是这里我们与 ABAP 对象发生了有趣的碰撞 class definition syntax

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

定义时可见区域的相互位置是固定的,不能随意更改。

虽然它并不与 ABAP 可见性概念相矛盾,但从技术上讲,不可能在私有部分声明类型并在 public 中使用它。此类型的声明位置将在 public 部分下方,因此实际上对其不可见。

但是如果你改变 declaration/use 部分的顺序,所有的都可以正常编译。

CLASS lcl_rowinvoice DEFINITION.

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

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

ENDCLASS.  

返回参数必须完全类型化,p 是泛型类型,因此您有以下三种选择:

  1. 使用数据字典中的预定义数据元素(SE11 => 数据 元素)

 METHODS getamount RETURNING value(r) TYPE netwr.
  1. 使用在本地 class
  2. 的 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.