ABAP 声明变量的几种方式和区别

458 阅读9分钟

每一个 ABAP 程序都使用下面的语句进行数据类型的定义

ABAP 声明变量 TYPES 和 DATA 的区别:

TYPES 是用来自定义某种类(型)的,需(用DATA语句)实例化以后才可以使用

DATA 是用来声明基本类型数据对象(实例变量)的,对于用DATA直接定义的结构体对象(不参照其它结构类型)

  1. 参照自定义类型生成新数据语法格式如下:
TYPES | DATA ...... TYPE type1 ....... " type1 代表程序内部类型

例如:

DATA: gt_sflight TYPE TABLE OF sflight,  
      gs_sflight TYPE sflight.
      
DATA: price TYPE sflight-price,
  1. 并使用语句声明自己的变量或类的实例属性,参照程序中已经声明的数据对象生成新数据语法格式如下:
TYPES | DATA ...... LIKE dobj ...... " dobj代表数据对象

简单的说就是:Type 用于定义系统存在的元素,LIKE 用于定义已经存在的变量。

在程序或类中,你也可以在程序中定义局部数据类型和变量。程序中的局部变量会掩盖主程序或类中相同命名的变量。

在创建数据类型和数据对象时,有一些命名规则也适用于其他本地程序的定义,如程序。这些在关键词文档中都有详细描述。

采用 LIKE 定义变量

声明变量时,可以使用关键字 TYPE 来指定变量的类型。同时, ABAP 也可以根据已经存在的变量来参考定义变量的类型,即使用 LIKE 关键字,参照 ABAP 中已经存在的变量或者某一数据字典中的元素(Data Element)来定义新的变量,基本语法如下:

DATA: lv_index LIKE sy-tabix.
DATA: gv_matnr LIKE mara-matnr.
DATA: lv_matnr TYPE matnr.

DATA:
 gt_return LIKE STANDARD TABLE OF bapiret2 WITH HEADER LINE,
 gs_return TYPE bapiret2.

对于对象变量,可以通过 LIKE 来定义类对象 go_object_1,即 LIKE 后面接一个已经定义过的对象 go_object,这样就可以通过 LIKE 定义使得两个对象具有相同的类型,代码如下:

DATA: go_object TYPE REF TO obejct.
DATA: go_object_1 LIKE go_object.

CREATE OBJECT go_object.
CRETE OBJECT go_object_1.

TYPE 和 LIKE 的各种用法

TYPE type 和 LIKE dobj 这些用法被用于各种 ABAP 程序的语句中。根据语法和上下文的不同,这些用法可以有不同的含义:

  • 在一个程序中定义局部类型

  • 数据对象的声明

  • 数据对象的动态创建

  • 在子程序中指定形式参数的类型

  • 指定方法中形式参数的类型

  • 规范字段符号的类型

在 TYPES、DATA、CONSTANTS 和 STATICS 语句中,TYPE 补充允许你构建新的数据类型。在 TYPES 语句中,这些是程序中的本地数据类型。在其他语句中,它们是新数据对象的属性,意味着新定义的数据类型不是独立的。相反,它们被链接到数据库对象上。这意味着你可以使用 LIKE 添加来引用它们,但不能使用 TYPE。

为了构造新的数据类型,TYPE 可以和以下类型构造器一起使用:

  • 引用类型的构造 REF TO type|dobj
  • 结构化数据类型的构造
BEGIN of struc_type.
    ...
    ...
END OF struc_type.

  • 表格类型的构造
tabkind OF linetype [WITH KEY]

TYPE 与 LIKE 的区别

  • TYPE 后面要跟随的是一个类型,TYPE 后面可以接通用类型 data,但不能接类的对象
  • LIKE 后面要跟随的是一个已经定义过了的变量和对象,或者是数据字典中已经定义过了的数据元素。当需要声明一个新的数据变量或对象变量,且其与已经定义过了的变量或者对象具有同样类型时,才使用 LIKE

DATA、TYPES 与 LIKE 的区别

  • DATA 用来直接声明实际的变量,可以指定变量类型是预定义类型或者自定义类型
  • TYPES 后面跟随的只能是自定义的某种类型,定义的是类型而不是变量,需要再使用 DATA 语句来实例化变量
  • LIKE 后面可以跟实例对象
  • 参照结构体对象生成内表时只能用 LIKE,不能用 TYPE,因为结构体对象不是类型,只是一种实例对象
  • 参照结构类型生成内表时可以用 LIKE 也可以用 TYPE
  • 其中通过 LIKE 定义的内表直接拥有参照结构类型的元素结构,而通过 TYPE 定义的内表只能间接拥有被参照结构类型的元素结构,结构类型不能作为内表的工作区,只有结构体对象才可以.

简单理解:

TYPES 就是一个类型,一个框架。

DATA 则是对这个 types 的东西进行了初始化,即分配内存和初始值。

LIKE 就是定义新的跟原来对象相同类型的对象

采用 REF TO 定义变量

ABAP 可以使用 REF TO 来进行变量的定义,称为引用变量(reference variable),通过引用变量的静态类型指定变量的数据类型或类类型。

定义的语法如下:

DATA ref { {TYPE REF TO type} | {LIKE REF TO dobj} }
         [VALUE IS INITIAL]
         [READ-ONLY].

引用变量包含两种类型:数据引用变量和对象引用变量,其定义格式分别如下:

  • 引用数据引用变量,称为数据引用:DATA gv_ref TYPE REF TO i.
  • 定义对象引用变量,称为对象引用:DATA go_object TYPE REF TO object.

什么是已知的数据类型或数据对象

使用 TYPES 语句中的添加 TYPE 或 LIKE,程序中的本地数据类型可以被引用到已知的数据类型或数据对象。这主要适用于用户定义的基本数据类型。

如果你用 TYPE 类型或 LIKE dobj 与语句 DATA 来声明变量,在声明之前,var 的数据类型已经被完全定义。

被引用的已知类型或数据必须在声明数据类型或变量的时候可见。

一个已知的数据类型可以是以下的任何一种:

  • 一个预定义的 ABAP 类型,您可以使用 TYPE 添加来引用它
  • 一个现有的本地数据类型,在程序中您使用 TYPE 加法来引用它
  • 您使用 LIKE 语句引用的程序中的一个本地数据对象的数据类型
  • 在 ABAP 字典中的一个数据类型,您使用 TYPE 语句对其进行引用。为了确保与早期版本的兼容性,仍然可以使用LIKE 来引用 ABAP 字典中的数据库表和结构。

Ps:应该在新程序中使用新语法 TYPE 语句。

LIKE 从一个可见的数据对象中获取其技术属性。作为一项规则,你可以使用 LIKE 来引用任何已经使用 DATA 或类似语句声明的对象,并且在当前上下文中是可见的。 数据对象只需要被声明。当你进行 LIKE 引用时,数据对象是否已经存在于内存中并不重要。

原则上,同一程序中的本地数据对象是可见的。与本地数据类型一样,程序中的本地数据对象与全局数据对象之间也有区别。程序中定义的数据对象掩盖了在程序全局声明中声明的其他同名对象。

您也可以参考其他可见 ABAP 程序的数据对象。例如,这些可能是类池中全局类的可见属性。如果一个全局类cl_lobal 有一个公共实例属性或静态属性 attr,你可以在任何 ABAP 程序中如下引用它:

DATA: f1 LIKE cl_global=>attr,
      f2 LIKE dref->attr.

你可以使用类的名称和一个引用变量来访问实例属性的技术属性,而不必先创建一个对象。一个类的属性不是针对实例的,属于该类的静态属性。

TYPES: BEGIN OF struct,
         number_1 TYPE i,
         number_2 TYPE p DECIMALS 2,
       END OF struct.

DATA: wa_struct TYPE struct,
         number LIKE wa_struct-number_2,
         date LIKE sy-datum,
         time TYPE t,
         text TYPE string,
         company TYPE s_carr_id.

这个例子声明了变量,参考了程序中的内部类型 STRUCT,现有数据对象 wa_struct 的一个组成部分,预定义数据对象 SY-DATUM ,预定义 ABAP 类型 tSTRING ,以及 ABAP 字典中的数据元素 S_CARR_ID

引用基本数据类型

如果您在 TYPES或 DATA 语句中引用固定长度的通用预定义 ABAP 类型之一(c,n,p,x),您必须指定未定义的技术属性。

TYPES|DATA var[(length)] TYPE type [DECIMALS dec]...
TYPES|DATA var TYPE type [LENGTH len] [DECIMALS dec]...

例如,这个例子创建了三个字段长度分别为 1、2、3 字节的字符变量,以及一个字段长度为 8 字节、有两个小数位的打包数字变量。如果属性 Fixed point arithmetic 被设置,pack 的值是 1.23 。:

DATA: text1,
      text2 LENGTH 2,
      text3 TYPE c LENGTH 3,
      pack TYPE p DECIMALS 2 VALUE '1.225'.

下面的例子显示了如何参照预定义的 ABAP 类型来声明基本数据对象。

PROGRAM demo_elementary_data_objects.

DATA text1 TYPE c LENGTH 20.
DATA text2 TYPE string.
DATA number TYPE i.

text1 = 'The number'.

number = 100.

text2 = 'is an integer.'.

WRITE: text1, number, text2.

这个程序在屏幕上产生以下输出:

图片.png

在这个例子中,数据对象 text1,text2 和 number 是用DATA语句声明的。技术属性是通过参考预定义的 ABAP 类型 c、string 和 I 来确定的。来自未命名字词的值被分配给数据对象。命名的数据对象的内容显示在列表中。

指定初始值

当您声明一个固定长度的基本变量时,DATA 语句会自动用预定义 ABAP 类型部分的表格中列出的特定类型初始值来填充它。 但是,您也可以使用 DATA statement 中的 VALUE 语句来指定固定长度基本变量的起始值(也在结构声明中)。

DATA var ... VALUE val|{IS INITIAL}.

DATA: counter TYPE p VALUE 1,  
      date    TYPE d VALUE '19980601',  
      flag    TYPE n VALUE IS INITIAL.

在这个数据声明之后,字符串 flag 包含其特定类型的初始值 '0'

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 18 天,点击查看活动详情