2

我正在学习 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) 有没有办法使这个解决方案起作用?

4

2 回答 2

3

返回参数必须是全类型的,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.
于 2018-06-05T09:50:01.917 回答
1

这是你在这里提出的一个非常有趣的问题。

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.  
于 2018-06-05T09:33:16.437 回答