ABAP数据类型总结

  • ABAP:Advanced Business Application programming 高级商务应用编程语言。
  • ABAP程序中有数据类型和数据变量:
    • 数据类型(Data Type):定义程序中可以使用的数据类型
      数据类型在ABAP程序中用于定义变量类型。数据类型和数据对象是单独声明的,数据对象则参照数据类型定义。在程序中利用TYPES语句声明数据类型,这种数据类型只能在该程序中使用,因此也称为本地数据类型。
      本地数据类型参照已有的ABAP数据类型进行声明。从数据类型层面考虑,ABAP程序的特点是可以参照ABAP数据字典自身的数据类型定义变量,这种特征便于开发者编程。
    • 数据变量(Data Variable):参照数据类型定义的、可以存储值的变量。
      数据变量(Data variable)是在程序中参照数据类型定义的值。在ABAP程序中最常用的方法是用Data语句定义变量,变量名包括“_”,最长可以定义30位。

数据对象:前面所定义的变量实际是指数据对象,所谓的数据对象只有在程序执行期间占用内存物理地址。ABAP语句首先利用数据对象名称确认地址,然后根据参照数据类型的字段长度及小数位等信息解析内容。数据对象里存在没有固定名称的类型。

ABAP程序包含三种数据类型:

数据类型层次结构

1. 标准数据类型

ABAP基本数据类型是系统内部定义的数据类型,可以分为完整的和非完整的

a. 完整的数据类型
  • 完整的数据类型指它包含了与类型相关的固定长度的信息。
    • D:日期类型,格式为YYYYMMDD,长度为8。
    • T:时间类型,格式为HHMMSS,长度为6。
      日期和时间,分属不同类型,分别是 D 和 T ,然后在显示时,字符间中间不带任何格式符;
      例如,日期:20140224,时间:120535。
    • I:整数类型,长度为4。
      只支持整数类型,非整数型数据会进行四舍五入(Round)。
      用于计算行数,,条目数,索引值等。
    • F:浮点类型,长度为8 。
      用于定义指数(exponent),因此需要调用“FLTP_CHAR_CONVERSION”函数把其类型转换成其他数据类型后才可以输出。
      数值较大或者不需要进行四舍五入时可以使用类型F。
    • string:变长字符串类型。
    • xstring:变长字节序列类型
b. 非完整的数据类型
  • 非完整的数据类型指他所对应的变量长度是在数据对象定义时指定的。
    • N:数字字符串类型,定义变量时指定数值字符个数。

    • C:字符串类型,定义变量时指定字符个数
      C 和 N 为字符类型,C用于定义文字、数字、特殊文字,
      N用于显示C类型数字,以字符串形式显示整数。

    • X:字节序列类型,定义变量时指定字节数。

    • P:组合数值类型,定义变量时指定长度和小数点后位数。
      P的精确度比 F 高,用 P 类型频率会比 F 类型高。
      P类型可用长度为1~16,小数位最大长度为14位

类型F、I更接近于机器代码,因此执行演算时类型F、I比P速度块(差异不明显)
字符串类型分为4中:C、N、D、T
C:默认大小(1),初始值(space)
N:默认大小(1),初始值('00…0')
P:默认大小(8),初始值(0)
F:默认大小(8),初始值(0)
I:默认大小(4),初始值(0)
D:默认大小(8),初始值('00000000')
string:默认大小(变长),初始值('')

2. 本地数据类型

  • 本地数据类型(局部数据类型):存在于程序内部
  • 在ABAP程序中,用ABAP基本数据类型定义局部数据类型。另外,还可以定义包含多个ABAP基本数据类型的结构体类型,但是他们只能作为当前程序的增强,这些定义用types语句来实现。
TYPES: BEGIN OF STU,
       NAME(10) TYPE C,
       AGE TYPE I,
       SEX TYPR C,
       END OF STU.
DATA: LISI TYPE STU.
LISI-NAME = '李四'.
LISI-AGE = 20.
LISI-SEX = 'BOY'.
WRITE:/ LISI.

3. 全局数据类型

  • ABAP数据字典数据类型:在ABAP字典中定义的类型,可以在整个SAP系统中使用。系统定义的数据对象无需声明,可在程序中直接使用。
  • 系统中有定义一些专有名词,如:
    • SY-SUBRC:系统执行传回值,0表示成功
    • SY-UNAME:当前系统登录的登录名
    • ST-TCODE: 当前事务
    • SY-DATUM:当前系统日期
    • SY-UZEIT:当前系统时间
    • SY-REPID:当前程序名
    • SY-COLNO:当前列
    • SY-LINNO:当前行
    • SPACE:空白字符串

更多系统数据参见数据表SYST
全局数据类型详细内容:https://www.jianshu.com/p/402f9c79f64f

4. DATA语句

  • DATA语句用于定义数据变量。变量名包括“_”,最长可以定义30位。
TYPE type
  • 定义变量的数据类型。ABAP基本数据类型、局部数据类型、全局数据类型都可以用于TYPE语句后
DATA:gv_num  TYPE i.

多次执行相同命令时使用冒号可以避免反复使用相同命令的现象。如下:

DATA gv_num1 TYPEⅠ,               DATA:gv_num1 TYPEⅠ,
DATA gv_num2 TYPEⅠ.                      gv_num2 TYPEⅠ.
LIKE num
  • 定义与前一个变量gv_num1相同类型的变量时使用该语句。num可以是任何一种数据类型变量(字段、参数、结构体、系统变量等)。
DATA:gv_num3 LIKE gv_num1.
VALUE int
  • 所有数据类型都存在初始值。DATA语句中可以使用VALUE选项设置初始值int。如果使用VALUE IS INITIAL语句,则变量的初始值为所参照的数据类型的初始值(此语句可以省略,其结果相同),但是定义固定值时一定要使用VALUE语句定义其初始值。
DATA:gv_num    TYPE i        VALUE123
      gv_flag                 VALUE 'X'
      gv_val                  VALUE IS INITIAL,
      gv_idx   LIKE sy-tabix  VAlUE 45
LENGTN n
  • LENGTH n用于指定字段长度,但只能适用于C、N、P、X类型即非完整性数据类型。
DATA:gv_num   TYPE n   LENGTH 2.
DECIMALS n
  • DECIMALS n用于指定1~14位小数,只适用于数据类型P。
DATA:gv_num  TYPE p  DECIMALS 3.

5. 变量

  • 通常用data语句来定义数据对象。
  • 数据对象的类型可以是基本类型,本地类型或全局类型。
  • 实际开发中更多的是参考现有的数据对象(LIKE)
  • 如果DATA语句没有指定TYPE,则默认为C类型
  • 如果非完整类型没有指定长度,则使用默认长度
    例:DATA myvar TYPE n. 定义一个长度为1的数字串类型变量
定义全局变量
  • 全局变量(Global Variable):是指在一个程序或函数内可以访问的数据类型。在程序内部的所有领域里都可以参照并修改,因此没有局限性。在程序激活状态下全局变量一直占用着内存地址。定义全局变量时变量名以G开头
定义全局变量
定义局部变量
  • 局部变量(Local Variable):只有在程序模块内部有效的变量。
  • 模块:指函数、子程序等为了实现单位功能集合成块的代码。局部变量定义方法如下:


    局部变量定义

6. 赋值

a. 给变量赋值

  • 在ABAP/4中定义变量或处理实际数据时会给变量赋值。定义变量时可以通过VALUE语句赋初始值,实际处理数据的程序中使用MOVE num1 TO num2 或 WRITE num1 TO num2 (变量2只能是字符串:N,C,D,T)语句给变量赋值。
MOVE var1 TO var2. 将var1的值存至变量var2,也可以写成下列方式
var2 = var1.
如果var1和var2的数据类型不同,就存在类型冲突的可能性,这时候如果存在转换规则,则会进行自动类型转换。

MOVE-CORRESPONDING<STRING1>TO<STRING2>.
WRITE<f1>TO<f2>[<option>].
*CORRESPONDING:相当的,相应的,一致的
  1. MOVE TO语句与<f2> = <f1>.中的Equal(=)语句相同。
  2. 复制字符串字段值时可以使用MOVE-CORRESPONDING语句,这时<string1>和<string2>的字段名可以不相同。
    MOVE-CORRESPONDING语句还经常用于不同结构体之间赋值,其特点是找到名字相同的字段名进行赋值。
  3. 当字段名及顺序不同的结构体之间相互赋值时,如果用MOVE语句,则会按顺序进行赋值,因此要使用MOVE-CORRESPONDING语句。
  4. MOVE语句还可以用于类型转换,即<f1>的数据类型会转换成<f2>类型。
  5. 在ABAP语言中除了类型D(Date)与类型T(Time)外都可以互相转换类型,一共有64种形态可以互相转换。
  6. WRITE语句主要有两种用法,一种是输出报表,另一种是变量赋值。
  7. 变量赋值时一般用WRITE TO语句,将数据对象<f1>的值转换成类型C后赋值给<f2>。前提条件是<f1>类型是可以转换成C类型的字段,否则会发生Syntax或runtime error的错误。
  8. 后面<option>里可以使用除了UNDER和NO-GAP以外的所有编辑格式选项。关于<option>具体参数可以在HELP中查询。

b. 利用Offset进行赋值

利用Offsets and Lengths 可以给部分字段赋值
从f1字段的p1+1位开始截取长度位11的字符串赋值给f2字段的从p2+1位开始截取长度位12的字符串的写法。
MOVE<f1>[+<p1>][(<11>)]TO<f2>[+<p2>][(<12>)].

c. 结构体之间的计算操作

结构体之间赋值用MOVE-CORRESPONDING语句,利用下面语句可以进行结构体之间的计算操作。

ADD-CORRESPONDING
SUBTRACT-CORRESPONDING
MULTIPLY-CORRESPONDING
DIVIDE-CORRESPONDING

CLEAR语句根据类型清除数据对象,恢复成默认值。

7. 运算符及函数

a. 算术符号

ABAP程序中,数学表达式可以进行任意多层嵌套
(20 + 10) * 10 + 10 / 2.

  • 二元操作符包括:
    • +:加法
    • -:减法
    • *:乘法
    • /:除法
    • **:乘幂
    • DIV:整除忽略余数
    • MOD:取模 (求余函数)
  • 圆括号和操作符都是关键字,需要跟操作数之间至少一个空格分开

b. 数值函数

  • ABS(N):传回数值N的绝对值
  • SIGN(N):1 (N > 0 时);0(N = 0 时);-1(N < 0 时)
  • CEIL(N):传回大于数值N的最小整数
例:WRITE CEIL(-5.65)  =》-5.00
    WRITE CEIL(4.54)   =》 5.00
  • FLOOR(N):传回小于数值N的最大整数
例:WRITE CEIL(-5.65)  =》-6.00
    WRITE CEIL(4.54)   =》 4.00
  • TRUNC(N):传回数值N的整数部分
    WRITE TRUNC(5.65) =》 5.00
  • FRAC(N):传回数值N的小数部分
    WRITE FRAC(5.65) =》 0.65
  • FRAC(N):取得小数部分
    WRITE FRAC(‘2.9’)=》0.9
  • COS(A),SIN(A),TAN(A):三角函数cosA,sinA,tanA的值,A为弧度值。

c. Floating-Point 函数:

Floating Point函数

8. 其他变量的定义

https://www.jianshu.com/p/191030c21ffc

  • 固定数据对象有一个固定值,在运行时不能改变。文字和常数都属于固定数据对象。
  • 文字是在程序里面写的固定值,可以分为数值文字(不使用单引号)和字符文字(用单引号括起来)。
数值文字:123、-123、……
字符文字:‘Hello’、‘123.234’、‘123.13E02’
  • 可以使用constants语句来定义常数,TYPE的指定方法跟基本数据对象一致,而VALUE则是必须的,用来赋值。
    CONSTANTS myvar1 TYPE tname VALUE{文字 | IS INITIAL}
  • 如果可能的话,尽量减少使用文字,而多用常数,这样可以给程序维护带来很大的便利。

附:

1. 命名程序规则

  • 使用至少 1 个但不超过 8 个字符。
  • SAP规定创建ABAP数据字典的程序及数据对象后命名时,要以Z或Y开头且不能使用关键字。ABAP程序中允许定义的变量名最大长度为30位,其中包含”_“符号

2. 数据类型和对象

数据类型和对象主要特征的概述:

  • 数据类型(基本的或结构化的)
    • 数据类型是纯粹的说明。
    • 没有与数据类型相关联的内存。
    • 数据类型描述数据对象的技术属性。
    • 数据类型是数据对象的属性并与数据对象联系紧密。
  • 数据对象(文字、变量、常量等):
    • 数据对象是程序在运行时使用的物理单元。
    • 每个数据对象都有分配给它的特定数据类型。
    • 每个数据对象占据一些内存空间。
    • ABAP/4 根据数据对象的数据类型处理数据对象。

3. 单引号 ' 和 grave ` 的去别

  • grave `:能够识别字符串中包含的所有空格。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,714评论 2 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,068评论 1 32
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,286评论 0 2
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 4,999评论 0 9
  • 《皮囊》这本书,忘了第一次见到是在书店,还是当当或亚马逊的首页上,书名让人印象深刻,但作者的名字是陌生的,我...
    9a3a0077a8bf阅读 447评论 0 1