TYPES、DATA、TYPE、LIKE、CONSTANTS、STATICS、TABLES

时间:2022-04-28 00:34:05

TYPESDATATYPELIKE. 42

TYPESDATATYPELIKE

TYPES语句是定义数据类型,而DATA语句声明变量。

TYPES:定义数据类型

-       数据类型是纯粹的说明。

-       没有与数据类型相关联的内存。

-       数据类型描述数据对象的技术属性。

-       数据类型是数据对象的属性并与数据对象联系紧密。

DATA:声明数据对象(变量、常量)

-       数据对象是程序在运行时使用的物理单元。

-       每个数据对象都有分配给它的特定数据类型。

-       每个数据对象占据一些内存空间。

-       ABAP/4 根据数据对象的数据类型处理数据对象。

 

TYPES定义的类型需要用来声明一个变量(DATA)来使用,即TYPES定义的类型是供DATA语句来声明一个变量来使用的。

 

使用自定义的类型使用TYPE,引用其他变量所属类型要使用LIKE

TYPES znumtype TYPE i.
TYPES num1 TYPE znumtype."
只能使用TYPE关键字来使用自定义类型znumtype
DATA num2 TYPE
znumtype.

DATA znumobj TYPE i
.
TYPES num5 LIKE znumobj."
只能使用LIKE关键字来使用自定义变量znumobj
DATA num6 LIKE
znumobj.

TYPES : BEGIN OF
address1,
  street(
20) TYPE c
,
  city(
20) TYPE c
,
 
END OF
address1.
TYPES type1 TYPE address1-city."
只能使用TYPE关键字来使用自定义结构体类型或其中的组件类型
DATA obj1 TYPE address1-city.
TYPES type2 TYPE
address1.
DATA obj2 TYPE
address1.

DATA : BEGIN OF
zaddress2,
  street(
20) TYPE c
,
  city(
20) TYPE c
,
 
END OF
zaddress2.
TYPES type3 LIKE zaddress2-city."
只能使用LIKE关键字来使用自定义结构体变量或其中的组件变量
DATA obj3 LIKE zaddress2-city.
TYPES type4 LIKE
zaddress2.
DATA obj5 LIKE
zaddress2.

 

透明表即可看作是一种类型,也可看作是对象,所以即可使用TYPE,也可以使用LIKE

TYPES type6 TYPE mara-matnr.
TYPES type7 LIKE
mara-matnr.
DATA obj6 TYPE
mara-matnr.
DATA obj7 LIKE
mara-matnr.

 

注:定义的变量名千万别与词典中的类型相同,否则表面上即可使用TYPE也可使用LIKE,就会出现这两个关键字(TypeLike)都可用的奇怪现像下面是定义一个变量时与词典中的结构同名的后果(导致)

DATA : BEGIN OF address2,
  street(
20) TYPE c
,
  city(
20) TYPE c
,
 
END OF
address2.
DATA obj4 TYPE STANDARD TABLE OF address2."
这里使用的实质上是词典中的类型address2
DATA obj5 LIKE STANDARD TABLE OF address2."
这里使用是的上面定义的变量
address2

上面程序编译通过,按理obj4定义是通过不过的(只能使用LIKE来引用另一定义变量的类型,TYPE是不可以的),但由于address2是数字词典中定义的结构类型,所以obj4使用的是数字词典中的结构类型,而obj5使用的是LIKE,所以使用的是address2变量的类型。注:结构(Structure)类型也只能使用TYPE,而不能使用LIKE

 

数据类型和数据对象是有不同的命名空间的,即同一程序中可以出现同名的数据类型和对象,但程序中的同名局部数据类型将覆盖数据字典中定义的同名类型。

 

如果使用的是数据词典中的类型,则即可以使用Like 也可使用 Type
"SFLIGHT为表类型
DATA plane LIKE sflight-planetype.
DATA plane2 TYPE
sflight-planetype.
DATA plane3 LIKE
sflight.
DATA plane4 TYPE
sflight.
"syst
为结构类型
DATA sy1 TYPE syst.
DATA sy2 LIKE
syst.
DATA sy3 TYPE syst-index
.
DATA sy4 LIKE syst-index
.

创建数据类型与变量

数据对象和数据类型有独立的名称空间。这意味着一个名称既可以是数据类型名,同时又可以是数据对象名,如:

DATA c .
TYPES c.

在程序中,可以使用数据声明语句静态地定义数据对象,或者利用操作语句动态地创建数据对象。ABAP/4 包括下列用于静态地创建数据对象和数据类型的关键字:

 

DATA 语句

用于创建变量

CONSTANTS 语句

用于创建常量

STATICS语句

用于创建变量这些变量在程序运行期间一直存在但仅在过程中可见

TABLES语句

用于创建表工作区

TYPES 语句

用于创建用户定义的数据类型

 

TYPES 语句

基本类型

TYPES { {dtype[(len)] TYPE abap_type [DECIMALS dec]}
      | {dtype
TYPE abap_type [LENGTH len] [DECIMALS dec]} }
.

TYPES: c,
       text10
TYPE c LENGTH 10,
       result
TYPE p LENGTH 8 DECIMALS 2. 

参照已存在的类型

TYPES dtype { {TYPE [LINE OF] type}
            | {
LIKE [LINE OF] dobj}  }
.

TYPES itab_typ TYPE TABLE OF string.
DATA itab TYPE itab_typ.
TYPES: wa_itab1 TYPE LINE OF itab_typ,
       wa_itab2
LIKE LINE OF itab.

引用类型:

TYPES dtype { {TYPE REF TO type}
            | {
LIKE REF TO dobj} }
.

INTERFACE i1.
...
ENDINTERFACE.

CLASS c1 DEFINITION.
 
PUBLIC SECTION.
   
INTERFACES i1.
ENDCLASS.

TYPES: iref TYPE REF TO i1,
       cref
TYPE REF TO c1,
       dref
TYPE REF TO iref.

结构类型:

TYPES BEGIN OF struc_type.
 
...
 
TYPES comp ...
  TYPES
 comp TYPE struc_type BOXED.
 
INCLUDE { {TYPE struc_type} | {STRUCTURE struc} }
        [
AS name [RENAMING WITH SUFFIX suffix]].

 
...
TYPES END OF struc_type.

TYPES: BEGIN OF street_type,
         name
TYPE c LENGTH 40,
        
no   TYPE c LENGTH 4,
      
END OF street_type.
TYPES
: BEGIN OF address_type,
         name
TYPE c LENGTH 30,
         street
TYPE street_type,

       
 
BEGIN OF city,
           zipcode
TYPE n LENGTH 5,
           name
TYPE c LENGTH 40,

        
END OF city,
     
END OF address_type.
TYPES zipcode_type TYPE address_type-city-zipcode.

INCLUDE { {TYPE struc_type} | {STRUCTURE struc} }
        [
AS name [RENAMING WITH SUFFIX suffix]]
.

该语句只能用在定义结构的BEGIN OF and END OF之间。作用是将结构类型struc_type与结构变量struc的所有组件字段拷贝到当前结构定义的指定位置,INCLUDE就是将可以重复使用的东西先做好,再包含进来。

AS name:给包含进来的结构类型(或结构变量)取一个别名,这样就可以通过结构组件符(-)来选取这个结构类型(或结构变量)

RENAMING WITH SUFFIX suffix:如果include进来的结构类型(或结构变量)的组件字段与现有的重复,则可以使用此选项重命名include进来的结构类型(或结构变量)的各组件字段名,具体做法只是在原来组件名后加上了指定的后缀suffix

TYPES: BEGIN OF t_day,
        
work TYPE c LENGTH 8,
        
free TYPE c LENGTH 16,
      
END OF t_day.
DATA BEGIN OF week.
       
INCLUDE TYPE t_day AS monday    RENAMING WITH SUFFIX _mon.
       
INCLUDE TYPE t_day AS tuesday   RENAMING WITH SUFFIX _tue.
       
INCLUDE TYPE t_day AS wednesday RENAMING WITH SUFFIX _wed.
...
DATA END OF week.

可以通下面的方式来访问week结构变量:

直接看作是week结构变量组件:week-work_mon, week-free_mon, week-work_tue

由于使用as别名,所以还可以这样访问:week-monday-work, week-monday-free, week-tuesday-work

内表类型

Ranges Table Types 条件内表类型

TYPES dtype {TYPE RANGE OF type}|{LIKE RANGE OF dobj}
            [
INITIAL SIZE n]
.

 

定义了以下相同行结构的内表:

TYPES: BEGIN OF linetype,
        
sign   TYPE c LENGTH 1,
        
option TYPE c LENGTH 2,
        
low    {TYPE type}|{LIKE dobj},
        
high   {TYPE type}|{LIKE dobj},
      
END OF linetype.

 

DATA 语句

预定义类型

DATA { {var[(len)] TYPE abap_type [DECIMALS dec]}
     | {var [
TYPE abap_type [LENGTH len] [DECIMALS
dec]]} }
     [
VALUE  val|{IS INITIAL}]
 

DATA p LENGTH 2 TYPE p VALUE '1.1' DECIMALS 1.

DATAp(2)TYPEpVALUE'1.1'DECIMALS1.

DATA p(2) TYPE p VALUE IS INITIAL DECIMALS 1.

 

DATA: text_buffer TYPE string VALUE `Text`,
     
count TYPE i VALUE 1,
      price
TYPE p LENGTH 8 DECIMALS 2 VALUE '1.99'.

参照已存在类型

DATA var { {TYPE [LINE OF] type}
           | {
LIKE [LINE OF
] dobj} }
           [
VALUE  val|{IS INITIAL
}]

 

DATA: spfli_wa1 TYPE spfli,
      spfli_wa2
LIKE spfli_wa1
.
DATA <f> LIKE LINE OF <itab>.

在这种情况下,<itab>必须是某个内表数据对象。

 

ABAP中,定义内存变量时,除了可以参照标准的ABAP的数据类型与词典中的表(或表字段)、结构(或表字段)、视图(或视图字段))外,还可以直接参考词典中的Data Element,但不能直接引用Domain。以下是两句等效:

DATA mycarrid2 TYPE spfli-carrid."参照数据库表字段
DATA mycarrid TYPE s_carr_id."直接参照
Data Element

TYPES、DATA、TYPE、LIKE、CONSTANTS、STATICS、TABLES

 

如果要定义一个屏幕字段时,最好是参照结构体中的一个字段或透明表中的一个字段,或直接采用一个Data Element,这样屏幕字段会自动带有应Data Element上语文上以及技术上的属性,即该输入域将自动带有F1 HelpF4 Help

引用类型

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

 

"因为没有定义方法,所以这里不需要 C1 Implements
CLASS c1 DEFINITION.
 
PUBLIC SECTION.
   
DATA a1 TYPE i VALUE 1.
ENDCLASS.

DATA: oref  TYPE REF TO c1,
      dref1
LIKE REF TO oref,
      dref2
TYPE REF TO i.

CREATE OBJECT oref.
" dref1 也指向 oref 所指向的对象
GET REFERENCE OF oref INTO dref1.

CREATE DATA dref2.
"ref->* 的作用就是求地址,与C语言中的 & 符号一样,求地址所对应的对象或变量
dref2
->* = dref1->*->a1.

WRITE: dref2->*." 1

结构类型

DATA BEGIN OF struc .
 
...
 
DATA comp ...
 
INCLUDE { {TYPE struc_type} | {STRUCTURE struc} }
     [
AS name [RENAMING WITH SUFFIX suffix]].

 
...
DATA END OF struc
.

RENAMING WITH SUFFIX具体用法请参照前面的TYPES语句中的结构定义

内表

条件内表类型:

DATA rtab {TYPE RANGE OF type}|{LIKE RANGE OF dobj}
          [
INITIAL SIZE
n]
          [
VALUE IS INITIAL
]

或者:

RANGES: s_ebeln1 FOR ekko-ebeln.

 

DATA: spfli_wa TYPE spfli,
      r_carrid
TYPE RANGE OF spfli-carrid,
      r_carrid_line
LIKE LINE OF r_carrid.

r_carrid_line
-sign   = 'I'.
r_carrid_line
-option = 'BT'.
r_carrid_line
-low    = 'AA'.
r_carrid_line
-high   = 'LH'.
APPEND r_carrid_line TO r_carrid.

SELECT *
      
FROM
spfli
      
INTO
spfli_wa
      
WHERE carrid IN r_carrid.

 
...
ENDSELECT.

CONSTANTS 语句

语法

CONSTANTS<c>[<length>] <type>[<decimals>]<value>.

要将结构定义为常量,请写:

CONSTANTS: BEGIN OF <fstring>,
<component declaration>,

..............

END OF <fstring>.

利用<value>参数指定的初始值,在程序的执行期间不能更改。

TYPES、DATA、TYPE、LIKE、CONSTANTS、STATICS、TABLES

STATICS 语句

如果要在过程的运行时间之外仍保留某变量的数值,可以在该过程中利用 STATICS 语句定义该变量。

 

语法

STATICS <s>[<length>] <type> [<value>] [<decimals>].

要在过程中将结构定义为静态有效,请写:

STATICS: BEGIN OF <fstring>,
<component declaration>,
..............

END OF <fstring>.

如果在程序中多次调用某过程,对于利用 STATICS 定义的变量,过程总是使用该变量的最新(近)值,但不能从过程外部来访问静态局部变量。

TABLES 语句

利用 TABLES 语句,可以创建称为表工作区的内存变量。表工作区是参考 ABAP/4 词典对象的结构。语法如下:

TABLES <structure_type>.

TABLES <transparent table_type>.

TABLES <view>.

 

<dbtab> ABAP/4 词典对象的名称,同时也是创建的内存变量名。可以用来参照的的有效 ABAP/4 词典对象是

2 结构

2 视图

2  数据库表(透明表)

表工作区提供一个接口,通过该接口可以将数据从数据库表加载到程序,或利用OPEN SQL 语句修改数据库表的内容。

 

TABLES: SPFLI.
SELECT * FROM SPFLI.
  
WRITE: SPFLI-MANDT, SPFLI-CARRID, SPFLI-CONNID, ......
ENDSELECT.

示例中,TABLES 语句创建表工作区 SPFLISPFLI  ABAP/4 词典中声明的数据库表 SPFLI 结构相同。在 SELECT 循环中,用属于数据库表 SPFLI 的行填充表工作区 SPFLI,并且不用在查询语句中可以省略into spfli选项

 

TABLES: spfli.

DATA spfli TYPE spfli.

以上两个语句等价。即在定义内存变量时,可以将透明表当做结构体来使用

 

另外在屏幕对话屏幕、选择屏幕如果需要引入数据中的表字段需要使用TABLES语句定义一个接口工作区进行屏幕和程序间的数据交换PARAMERTS可以不需要SLECTION-OPTION需要