我正在学习ABAP对象。我想要一个返回打包数字类型的对象方法。我终于让它工作了,但我不知道这是否是正确的方法,我需要一些我在网上找不到的进一步解释。
对于整数,它可以正常工作:
METHODS: getamount RETURNING VALUE(r) TYPE i,
对于包装号码,它不会:
METHODS: getamount RETURNING VALUE(r) TYPE p,
错误:必须完全指定返回参数的类型
METHODS: getamount RETURNING VALUE(r) TYPE p LENGTH 10 DECIMALS 3,
错误:必须完全指定返回参数的类型
(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,
未知类型"类型价格"。
(3(有没有办法使这个解决方案起作用?
返回的参数必须是完全类型的,p 是泛型类型,因此您有三个选项:
- 使用数据字典中的预定义数据元素 (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.
这是你在这里提出的一个非常有趣的问题。
ABAP 中的常见规则是,声明类型和对象仅从已声明的行开始有效:
可以从此位置在当前上下文中查看定义的数据类型。
但!但是在这里,我们与ABAP对象类定义语法发生了有趣的冲突。
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.