声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4292833.html

TYPES、DATA、TYPE、LIKE. 42

TYPES、DATA、TYPE、LIKE

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,就会出现这两个关键字(Type、Like)都可用的奇怪现像,下面是定义一个变量时与词典中的结构同名的后果(导致)

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

如果要定义一个屏幕字段时,最好是参照结构体中的一个字段或透明表中的一个字段,或直接采用一个Data Element,这样屏幕字段会自动带有应Data Element上语文上以及技术上的属性,即该输入域将自动带有F1 Help和F4 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>参数指定的初始值,在程序的执行期间不能更改。

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 语句创建表工作区 SPFLI。SPFLI 与 ABAP/4 词典中声明的数据库表 SPFLI 结构相同。在 SELECT 循环中,用属于数据库表 SPFLI 的行填充表工作区 SPFLI,并且不用在查询语句中可以省略into spfli选项

TABLES: spfli.

DATA spfli TYPE spfli.

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

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

TYPES、DATA、TYPE、LIKE、CONSTANTS、STATICS、TABLES的更多相关文章

  1. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(一)

    题外话:本篇是对之前那篇的重排版.并拆分成两篇,免得没了看的兴趣. 前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的 ...

  2. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(二)

    接前一篇 Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 本篇主要内容:Spring Type Conver ...

  3. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion

    本篇太乱,请移步: Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 写了删删了写,反复几次,对自己的描述很不 ...

  4. jQuery源代码解析(1)—— jq基础、data缓存系统

    闲话 jquery 的源代码已经到了1.12.0版本号.据官网说1版本号和2版本号若无意外将不再更新,3版本号将做一个架构上大的调整.但预计能兼容IE6-8的.或许这已经是最后的样子了. 我学习jq的 ...

  5. jQuery中attr()、prop()、data()用法及区别

    .attr(),此方法从jq1.0开始一直存在,官方文档写的作用是读/写DOM的attribute值,其实1.6之前有时候是attribute,有时候又是property..prop(),此方法jq1 ...

  6. jquery中attr、prop、data

    在高版本的jquery中获取标签的属性,可以使用attr().prop().data(),那么这些方法有什么区别呢? 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元 ...

  7. jQuery 选择器 筛选器 样式操作 文本操作 属性操作 文档处理 事件 动画效果 插件 each、data、Ajax

    jQuery jQuery介绍 1.jQuery是一个轻量级的.兼容多浏览器的JavaScript库. 2.jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方 ...

  8. 前端基础-jQuery的最常用的的方法each、data、

    阅读目录 each inArray get index data 一.jQuery中each方法的应用 jQuery中有个很重要的核心方法each,大部分jQuery方法在内部都会调用each,其主要 ...

  9. 静态分析:IDA逆向代码段说明 text、idata、rdata、data

    静态分析:IDA逆向代码段说明 text.idata.rdata.data 通常IDA对一个PE文件逆向出来的代码中, 存在四个最基本的段text.idata.rdata.data, 四个段为PE文件 ...

随机推荐

  1. copyallwaterdata

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[copyallwaterdata]') and OBJECT ...

  2. Terminal的快捷键 for Terminal for Mac OS 10.10, Linux/GNU(Ubuntu, deepin, elementory os,CentOS)

    对于习惯用windows键盘的,突然转成Mac蓝牙键盘真的有点不习惯,尤其是多了⌘这个键,还有Alt键也成了Option 但是对于Windows下熟悉的快捷键,它们真的失效了,还好Ubuntu也常用, ...

  3. WIN7(VISTA)系统无法上网问题排查方法

    WIN7(VISTA)系统无法上网问题排查方法 一.无法通过DHCP自动获取到IP 1. 确认正确配置路由器的DHCP功能 a.一般租期建议设置为1-3小时,推荐设置1小时. b.DHCP地址池不要和 ...

  4. 今天 同一个Nav 左右button 替换不显示的问题 viewDidLoad, viewWillDisappear, viewWillAppear等区别及各自的加载顺序

    viewWillAppear:  Called when the view is about to made visible. Default does nothing视图即将可见时调用.默认情况下不 ...

  5. centos6.5-64bit安装htop

    首先启用 EPEL Repository: yum -y install epel-release 启用 EPEL Repository 後, 可以用 yum 直接安裝 Htop: yum -y in ...

  6. C#:DataTable内容转换为String(XML)

    //DataTable转String方法 public static String DataTable2String(DataTable dt) { string strXML = "< ...

  7. java从命令行接收多个数字,求和之后输出结果

    设计思想:获取输入数的个数,然后将要相加的数字转换成为浮点型进行相加,最后进行输出 源代码: package Add; import java.util.Scanner; // 严羽卿   2015. ...

  8. 【转】JS 和 java 交互

    android中如何获得webView中的内容发表于 2011 年 06 月 13 日 由 admin本文概要:在程序中经常会用到webView来显示网页,但如果能够得到网页中的内容呢,本文将给你一个 ...

  9. MVC模式(Model View Controller)下实现数据库的连接,对数据的删,查操作

    MVC模式(Model View Controller): Model:DAO模型 View:JSP  在页面上填写java代码实现显示 Controller:Servlet 重定向和请求的转发: 若 ...

  10. 如何利用java把文件中的Unicode字符转换为汉字

    有些文件中存在Unicode字符和非Unicode字符,如何利用java快速的把文件中的Unicode字符转换为汉字而不影响文件中的其他字符呢, 我们知道虽然java 在控制台会把Unicode字符直 ...