声明变量时,通常要指定它的类型。
如果不指定内联声明变量的类型,会发生什么?它是根据它收到的值分配的吗?
例如:
例1这里我们通过传入的值获得字符串类型?
DATA(lv_name) = 'Testing Value'.
例2在这里我们得到lt_mara
作为类型表的mara?
SELECT * FROM mara
INTO TABLE @DATA(lt_mara) UP TO 10 ROWS.
我对这个问题理解正确吗?
是的,类型在激活时根据您分配的类型自动派生。DATA(lv_name) = 'Testing Value'
会产生TYPE c LENGTH 13
,因为这是你分配的字符的长度。如果您想要TYPE string
,请使用字符串模板语法分配它:DATA(lv_name) = |Testing Value|
。
如果你想强制一个特定的类型,那么你可以将它与CONV
操作符结合使用。这对于数字类型非常有用,因为除了TYPE i
之外,没有任何数字类型的专用文字。例如:
DATA(lv_num) = CONV decfloat16( '12.5' ).
这将导致TYPE decfloat16
变量的值为12.5
。
TYPE p LENGTH x DECIMALS y
类型有一个轻微的特性。例如,这行不通:
DATA(lv_num) = CONV p LENGTH 10 DECIMALS 2( '12.5' ). "<- Syntax error!
但是如果您事先定义了命名类型,则可以将CONV
-操作符与TYPE p
一起使用:
TYPES type_my_decimal TYPE p LENGTH 10 DECIMALS 2.
DATA(lv_num) = CONV type_my_decimal( '12.5' ).
(这当然也适用于字典类型)。
当您在SELECT * FROM mara
中使用内联声明时,从技术上讲,生成的结构将不是字典类型MARA,而是具有与MARA完全相同列的类型。因此,对于大多数意图和目的来说,它是相同的。当您使用而不是时,SELECT
的内联声明最有用。只做一个SELECT *
,但当你指定你想要的字段列表。使用内联声明意味着你不需要定义一个自定义的数据结构,当你改变SELECT
的列列表时,你需要手动保持同步。