内联声明变量中的类型确定?

Aba*_*ito 0 abap variable-types inline declaration

当我们通常声明一个变量时,我们会指定它的类型。

如果我们不指定内联声明变量的类型,会发生什么情况?是根据收到的值来分配的吗?

例如:

Ex.1 这里我们通过传入的值来获取字符串类型?

DATA(lv_name) = 'Testing Value'.
Run Code Online (Sandbox Code Playgroud)

Ex.2 这里我们得到lt_maraTYPE TABLE OF mara?

SELECT * FROM mara 
         INTO TABLE @DATA(lt_mara) UP TO 10 ROWS.
Run Code Online (Sandbox Code Playgroud)

我对这个问题的理解正确吗?

Phi*_*ipp 6

是的,根据您分配的类型,类型会在激活时自动派生。DATA(lv_name) = 'Testing Value'将产生 a TYPE c LENGTH 13,因为这是您分配的字符文字的长度。如果您需要TYPE string,请使用字符串模板语法分配它:DATA(lv_name) = |Testing Value|

如果您想强制使用特定类型,则可以将其与运算CONV结合使用。这对于数字类型最有用,因为除了 之外,它们中的任何一个都没有专用的文字TYPE i。例如:

DATA(lv_num) = CONV decfloat16( '12.5' ).
Run Code Online (Sandbox Code Playgroud)

这将产生一个TYPE decfloat16值为 的变量12.5

类型有一点特殊之处TYPE p LENGTH x DECIMALS y。例如,这不起作用:

DATA(lv_num) = CONV p LENGTH 10 DECIMALS 2( '12.5' ). "<- Syntax error!
Run Code Online (Sandbox Code Playgroud)

但是,如果您事先定义了命名类型,则可以使用CONV- 运算符:TYPE p

TYPES type_my_decimal TYPE p LENGTH 10 DECIMALS 2.
DATA(lv_num) = CONV type_my_decimal( '12.5' ). 
Run Code Online (Sandbox Code Playgroud)

(当然,这对于字典类型也同样有效)。

当您在 a 中使用内联声明时,结果结构在技术上SELECT * FROM mara不会是字典类型 MARA,而是具有与 MARA 完全相同的列的类型。因此,对于大多数意图和目的来说,它是相同的。当您不只执行 a而是指定所需字段列表时,内联声明 with最有用。使用内联声明意味着您不需要定义自定义数据结构,然后每当您更改.SELECTSELECT *SELECT