使用基本数据对象和数据类型

学习目标

  • 声明数据对象。

  • 分配值。

ABAP 中的数据对象

ABAP 程序中的数据对象表示程序内存的预留部分。

ABAP 知道三种类型的数据对象:变量、常量和文字。

变量

变量是具有可在运行时更改的内容的数据对象。变量由名称标识。该名称还用于在运行时寻址数据对象。ABAP 变量的起始值始终是明确定义的。

常量

常量与变量类似。但与变量相比,该值在源代码中硬编码,在运行时不得更改。与变量一样,常量具有可用于重用它们的名称。

文字

文字的值也在源代码中硬编码。与常量相反,文字没有名称。因此,您无法重用文字。仅使用文字指定常量的值和变量的起始值。

始终键入 ABAP 数据对象:每个数据对象都基于数据类型,该数据类型确定其可包含的信息类型。ABAP 数据对象的数据类型在整个程序执行过程中保持不变。

变量声明

ABAP 程序中的变量使用关键字 DATA 声明。

DATA 语句由三部分组成。下面,我们来详细了解一下每个部分。

DATA

关键字 DATA 后跟变量的名称。变量名称的长度最多可达 30 个字符。它可以包含字符 A-Z、数字 0-9 和下划线字符。名称必须以字母或下划线开头。

类型

在附加项 TYPE 后指定变量的类型。在此示例中,使用内置类型 i(用于整数)和字符串(具有可变长度的字符串)。

VALUE

附加 VALUE 是可选的,您可以使用它来指定变量的起始值。如果缺少 VALUE,则使用取决于变量技术类型的初始值创建变量。

ABAP 数据类型的源

ABAP 提供以下数据类型源:

ABAP 内置

ABAP 为简单数字、字符和二进制数据对象设置了 14 种预定义数据类型。

TYPES 语句

语句 TYPES 允许您定义数据类型并在不同的位置重用它们,具体取决于定义的位置。

ABAP 字典

ABAP 字典是 ABAP 资源库的一部分。此外,它还管理整个系统中可用的全局数据类型。ABAP 字典类型不仅定义技术属性,还会添加语义信息,例如标签。实施用户界面时,ABAP 字典类型特别有用。

试用:预定义的 ABAP 类型

  1. 与本课程的第一个练习一样,创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类。

  2. 将以下代码片段复制到方法 if_oo_adt_classrun~main() 的实施部分:

* Data Objects with Built-in Types
**********************************************************************
" comment/uncomment the following declarations and check the output
DATA variable TYPE string.
*    DATA variable TYPE i.
*    DATA variable TYPE d.
*    DATA variable TYPE c LENGTH 10.
*    DATA variable TYPE n LENGTH 10.
*    DATA variable TYPE p LENGTH 8 DECIMALS 2.
* Output
**********************************************************************
out->write(  'Result with Initial Value)' ).
out->write(   variable ).
out->write(  '---------' ).
variable = '19891109'.
out->write(  'Result with Value 19891109' ).
out->write(   variable ).
out->write(  '---------' ).
  1. 按 CTRL + F3 激活类,按 F9 将其作为控制台应用执行。

  2. 分析控制台输出。取消注释 变量 的不同声明。尝试您自己的声明以熟悉概念。

常量和文字

常量声明

常量是具有硬编码值的数据对象,在运行时期间不得更改。对常量的任何写入访问都会导致语法错误。

在 ABAP 中,使用关键字 CONSTANTS 声明常量。CONSTANT 语句包含与 DATA 语句相同的部分。唯一的区别是 VALUE 附加为必填项。

如果常量的值应为类型特定的初始值,则可以在特殊形式 VALUE IS INITIAL 中使用 VALUE 附加。

ABAP 中的文字

文字是具有硬编码值的匿名数据对象。文字通常用于定义常量的非初始值和变量的非初始起始值。

从技术上讲,您可以在代码中的任何位置使用文字。为支持可读性和可维护性,建议定义并使用常量。

ABAP 知道三种类型的文字:

  • 数字文字是带或不带符号的整数。数字文字通常具有数据类型 I。仅当数据类型 I 的值过大时,才会使用类型 P,长度足够且没有小数位。

  • 文本文字是用简单引号括起来的字符串。文本文字的类型为 C。长度派生自引号中的内容。忽略尾随空格。

  • 字符串文字是一对反引号 (`) 中的字符串。字符串文字的类型为 STRING。它们应该用于为字符串类型化的数据对象提供值。

试用:数据对象

  1. 与本课程的第一个练习一样,创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类。

  2. 将以下代码片段复制到方法 if_oo_adt_classrun~main() 的实施部分:

* Example 1: Local Types
**********************************************************************
* Comment/Uncomment the following lines to change the type of my_var
TYPES my_type TYPE p LENGTH 3 DECIMALS 2.
*    TYPES my_type TYPE i .
*    TYPES my_type TYPE string.
*    TYPES my_type TYPE n length 10.
* Variable based on local type
DATA my_variable TYPE my_type.
out->write(  `my_variable (TYPE MY_TYPE)` ).
out->write(   my_variable ).
* Example 2: Global Types
**********************************************************************
* Variable based on global type .
" Place cursor on variable and press F2 or F3
DATA airport TYPE /dmo/airport_id VALUE 'FRA'.
out->write(  `airport (TYPE /DMO/AIRPORT_ID )` ).
out->write(   airport ).
* Example 3: Constants
**********************************************************************
CONSTANTS c_text   TYPE string VALUE `Hello World`.
CONSTANTS c_number TYPE i      VALUE 12345.
"Uncomment this line to see syntax error ( VALUE is mandatory)
*  constants c_text2   type string.
out->write(  `c_text (TYPE STRING)` ).
out->write(   c_text ).
out->write(  '---------' ).
out->write(  `c_number (TYPE I )` ).
out->write(   c_number ).
out->write(  `---------` ).
* Example 4: Literals
**********************************************************************
out->write(  '12345               ' ).    "Text Literal   (Type C)
out->write(  `12345               ` ).    "String Literal (Type STRING)
out->write(  12345                  ).    "Number Literal (Type I)
"uncomment this line to see syntax error (no number literal with digits)
*    out->write(  12345.67                  ).
  1. 按 CTRL + F3 激活类,按 F9 将其作为控制台应用执行。

  2. 浏览源代码以熟悉概念。

  • 取消注释 my_type 的不同声明,然后使用 F2 和 F3 分析变量 my_variable 的定义。

  • 使用 F2 和 F3 分析可变 机场 的定义。

  • 取消注释常量 c_text2 的定义以查看语法错误。

  • 取消注释最后一个代码行以查看语法错误。

  • ...

到数据对象的值分配

使用值赋值来更改变量的值。

观看此视频,了解如何操作。

视频:本节含 SAP 官方视频(视频 ID 1_6ei6t5pz),需在 learning.sap.com 在线观看。

隐式类型转换

尽管 ABAP 是一种类型化的编程语言,但在值赋值中,源表达式类型和目标变量的类型可以不同。如果是这种情况,运行时会尝试进行类型转换。

如图所示,如果可能,请尝试避免类型转换,原因如下:

  • 附加运行时消耗:类型转换的值比具有相同类型的值分配需要更多的运行时。

  • 潜在运行时错误:源类型和目标类型的某些组合可能会导致运行时错误。例如,如果目标变量具有数字类型 l,并且源表达式具有类似类型的字符,则运行时如果无法将文本转换为数字,则会引发错误。

  • 潜在信息丢失:源类型和目标类型的某些组合不会导致运行时错误,但可能会导致数据丢失。例如,如果源和目标都属于 C 类型,但目标变量的类型较短。然后,运行时只是截断源的值。

重置变量

语句 CLEAR 是一种特殊的值分配。用于将变量重置为其类型特定的初始值。

注意

CLEAR 语句忽略 VALUE 附加中的起始值。CLEAR 后,变量始终包含类型特定的初始值。

值分配中的内嵌声明

观看此视频,以了解内联声明及其在值分配中的工作方式。

视频:本节含 SAP 官方视频(视频 ID 1_9ig9t2qc),需在 learning.sap.com 在线观看。