ABAP基础2:数据类型

数据类型-Data Type:定义程序中可以使用的数据类型,使用前要先定义

数据变量-Data Variable:参照数据类型定义的、可以存储值的变量,就是变量嘛

数据类型

  • 数据类型在ABAP程序中用于定义变量类型
  • 数据类型和数据对象是单独声明的,数据对象则参照数据类型定义
  • 在程序中利用TYPES语句声明数据类型,只能在该程序中使用,也成为本地数据类型
  • 本地数据类型可以参照ABAP数据类型进行声明

数据变量

  • 数据变量是在程序中参照数据类型定义的值。
  • 常用方法是用Data语句定义变量

注意:变量实际指数据对象,数据对象在程序执行期间占用内存空间

三种数据类型

1.ABAP基本数据类型

  • 系统内部定义的数据类型 https://www.cnblogs.com/zhaorp/p/6925301.html
  • 类型

    允许最大长度(字符数)

    默认长度(省略时采用)

    说明

    初始值

    C

    1~262143个字符

    1 字符

    如果未在 DATA 语句中指定参数<length>和<type>,则创建长度为 1 的字符

    每个位置都是空格

    N

    1~262143个字符

    1 字符

    0到9之间字符组成的数字字符串

     

    如果未在 DATA 语句中指定参数<length>,则创建长度为 1          

    "0"每个位置都是阿拉伯数字0

    D

    8 个字符

     

    日期格式必须为 YYYYMMDD 取值范围:YYYY (year): 0001 to 9999, MM(month): 01 to 12, DD (day): 01 to 31

    "00000000"

    T

    6 个字符

     

    格式为 24-hour的 HHMMSS

    HH:00 to 23

    MM: 00 to 59

    SS: 00 to 59

    "000000"

    I

    4 bytes

     

    -2.147.483.648 to +2.147.483.647(.点号为千分位分隔符,不是小数点,而,逗号则表示是小数点)

    如果运算出现非整型的结果(如小数)则进行四舍五入,而不是截断

    0

    F

    8 bytes

     

    小数位最大可以到17位,即可精确到小数点后17位

    取值范围:-1,7976931348623157EE+308 to -2,2250738585072014EE-308 for the negative area, the value zero, and +2,2250738585072014EE-308 to +1,7976931348623157EE+308 for the positive area.

    如果要求高精度,则不应该使用类型 F 数据。而应代之以类型 P 数据

    F赋值时,会转换为标准形式:<±尾数部分>E±<指数部分>,且尾数部分的小数位最多为17位

    0

     

    如果值是小数,则要将值使用引号引起来

    P

    1 to 16 bytes

    8 bytes

    有效长度为1到16个字节。

    两个数字位压缩后才占一个字节,由于0-9的数字只需要4Bit位,所以一个字节实质上允许存储二位数字,这就是P数据类型为压缩数据类型的由来,因为定义的的数据长度比存储于内存中要长。并借用最后半个字节,即字面上的一位来存储小数点、正号、负号、或者是这三种中间的组合————存储的可能是通过将小数点与正负号经过某种位运算后的结果,因为半个字节不可能存储小数或正负号的所对应的ASCII码(都比15大)

    P类型最多允许14位小数位,即可以精确到小数点后14,再除开小数点与正负号占半个字节,即字面上1位4Bit,此时最大整数位最长可达16*2 = 32 – 1 = 31 -14 = 17位

    Depending on the field length len(len表示定义时P的整个长度) and the number of decimal places dec(dec表示小数位), the following applies for the value area: (-10^(2len -1) +1) / (10^(+dec)) to (+10^(2len -1) -1) /(10^(+dec)) in steps of 10^(-dec). Values in between this range are rounded off.

    在计算过程中如果小数部分过长,则进行四舍五入

    0

     

    若小数部分超过长度,则自动按四舍五入将多余的小数除掉;如果整数部分超过长度,则系统运行出错

     

    如果值是小数,则要将值使用引号引起来

    X

    1~524,287 bytes

    1 byte

    十六进制字符 0-9, A-F具体的范围为:00~FF

    类型X是十六进制类型,可表示内存字节实际内容,使用两个十六制字符表示一个字节中所存储的内容。但直接打印输出时,输出的还是赋值时字面意义上的值,而不是Unicode解码后的字符

    如果未在 DATA 语句中指定参数<length>,则创建长度为 1

    注:如果值是字母,则一定要大写,否则赋值不进

    DATA: x2(2) TYPE x.
    x2 = '3AA'.
    WRITE : / x2."输出赋值时字面上的值:3AA0

    十六进制的00

    string

    不限定

     

    在系统内部,长度可变的内置类型(String、XString)是通过引用实际动态的数据对象的固定内存地址来进行操作,因而这两种内置类型和引用类型一样,属于纵深类型。

    长度为0的空字符串''

    xstring

    不限定

     

    由十六进制字符 0-9, A-F组成字符串。直接打印输出时,输出的还是赋值时字面意义上的值,而不是Unicode解码后的字符串

    注:如果值是字母,则一定要大写,否则赋值不进

    DATA : xs TYPE xstring .
    xs = '303132'."表示字符串 012
    WRITE :/ xs."但输出的还是303132

    长度为0的空字符串''

    b

    1 Byte

     

    0 to 255属于ABAP内部类型,在ABAP程序中不能直接使用

    0

    s

    2 bytes

     

    -32.768 to +32.767属于ABAP内部类型,在ABAP程序中不能直接使用

    0

2.局部数据类型-存在于程序内部

3.全局数据类型-存在于数据字典中

  • 全局数据类型是指所有程序都可以使用的数据类型
  • 可以用TYPE语句参照ABAP数据字典里的数据类型定义变量

声明数据类型

1.参考基本数据类型定义变量

DATA:gv_num TYPE i,
   gv_deci TYPE f. 

TYPE后面是ABAP基本数据类型

2.参照局部数据类型定义变量

将程序中常用的数据及结构声明为一个数据类型,定义变量时可以参考此数据类型定义,但此数据类型只能在改程序内容使用

TYPES: BEGIN OF t_struct,
                col1 TYPE c,
                col2 TYPE i,
                col3 TYPE d,
       END OF t_struct.
DATA: gs_struct TYPE t_struct,
    gv var LIKE gs struct-col1.

3.参照全局数据类型定义变量

利用ABAP数据字典(表/结构体/数据元素等)定义变量的方法,此数据类型在所有程序都可以使用

DATA: gv_carrid TYPE s_carr_id,
      gv_connid TYPE sflight-carrid,
      gv_matnr TYPE mara-matnr.

DATA语句

用于定义数据变量,变量名可以包含_, 长度最长30位

1. TYPE type

定义变量的数据类型

DATA: gv_num TYPE i.

冒号是一个命令从逗号开始, 遇到句号结束

下面的命令效果等同

DATA gv_num1 TYPE I.
DATA gv_num2 TYPE I.

DATA: gv_num1 TYPE I,
      gv_num2 TYPE I.

2. LIKE num

定义与前一个变量相同类型的变量, num可以是任何一种数据类型(字段/参数.结构体/系统变量)

DATA: GV_NUM3 LIKE GV_NUM1.

3.VALUE INT

所有数据类型都存在初始值

DATA语句可以用VALUE选项设置初始值INT

DATA: GV_NUM TYPE I VALUE 123,
      GV_FLAG VALUE 'X',
      GV_VAL VALUE IS INITIAL
      GV_IDX LIKE SY-TABIX VALUE 45.

VALUE IS INITIAL 变量的初始值为所参照的数据类型的初始值,可以省略,效果一样

4. LENGTH N

LENGTH N用于指定字段长度, 仅适用数据类型: C/N/P/X

DATA: GV_NUM TYPE N LENGTH 2.

5. DECIMALS N

用于指定1-14位小数,仅适用于数据类型P

DATA: GV_NUM TYPE P DECIMALS 3.

第一个helloworld

REPORT  Z_YZW_HELLOWORLD. "报表名称
TYPES T_VAR TYPE C LENGTH 20.  "声明一个局部数据类型为C,长度为20
DATA GV_VAR TYPE T_VAR.  "声明一个变量,类型使用上面定义的数据类型
GV_VAR = 'HELLOW ABAP'.  "给变量赋值
WRITE GV_VAR.  "打印变量
  • .号表示一行代码结束
  • 字符串用单引号
  • =号前后要留空格, 和SHELL一样
  • *号表示一行注释, "号表示右边注释

命名规则

全局变量以G开头

局部变量以L开头

 

一个好的命名包括:作用范围/数据类型/含义

 

 数据基本运算中, 浮点数需要调用function FLTP_CHAR_CONVERSION转换成char类型

DATA GV_F1 TYPE F  VALUE '2.22'.
DATA GV_F2 TYPE F VALUE '3.33'.
DATA GV_FRESULT TYPE F.
DATA GV_CRESULT TYPE C LENGTH 16.
GV_FRESULT = GV_F1 * GV_F2.
WRITE / GV_FRESULT.

CALL FUNCTION 'FLTP_CHAR_CONVERSION'
exporting
DECIM = 2
INPUT = GV_FRESULT
importing
FLSTR = GV_CRESULT.

WRITE / GV_CRESULT .

 

数字运算用函数

  • ABS, 返回绝对值, ABS(-100)renturn 100
  • SIGN, 返回符号, 负数return -1, 0 return 0, 整数return 1
  • CEIL, 返回不小于该值的最小整数, ceil*1.3) ceil(1.7) 返回最小整数2
  • FLOOR, 返回不大于该值的最大整数, floor(1.3) ceil(1.7) 返回整数1
  • TRUNC取整, trunc(1.3) trunc(1.7)返回整数1
  • FRAC取小数, frac('2.9') 返回0.9

浮点函数

  • ACOS/ASIG/ATAN/COS/SIN/TAN三角函数
  • COSH/SIGNH/TANH 双曲线函数
  • EXP 指数函数
  • LOG 自然对数函数, 以e为底
  • LOG10 常用对数函数, 以10为底
  • SQRT 平方根函数, 开方

字符串类型

字符串类型也成为字符串字段, 分为4种

  • C 用于定义文字/数字/特殊文件, 需显式指定字段长度, 不指定默认长度为1, data g_char(3) type C. 或者data g_char type C length 3.
  • N 用于显示C类性数字,以字符串形式显示整数, 长度不够时前置补零
  • D 日期类型
  • T 时间类型

 

日期时间

  • sy-datum, 输出当前日期格式YYYYMMDD, sy-datum+3 当前日期加三天, 单位是天
  • sy-uzeit, 输入当前系统时间格式HHMMSS, sy-uzeit-60, 当前时间减60秒, 即1分钟前, 单位是秒

sy-datum sy-datlo

  • sy-datum在stzac设置, 默认到su01的用户时区
  • sy-datlo可以覆盖su01用户时区

string类型

与C类型类似, 用于定义不固定长度的变量, 常用于定义长文本,执行是生成动态内存

  • FIND, 查找索引位, find '查找内容' in 字符串
  • REPORT  Z_YZW_STRING.
    data: gv_str type string,
    gv_chr(4) type c.
    
    gv_str = 'ABAP'.
    gv_chr = 'B'.
    FIND 'D' in 'ABAP'.
    write: / 'sy-subrc', sy-subrc.
    if sy-subrc eq 0.
      write / 'b was found'.
    endif.

    判断结果sy-subrc为0, 则为真, 4, 则为假

  • REPLACE, 替换指定字符串, replace '被替换内容' in 原字符串 with 替换内容.
  • gv_str = 'abapasdfasdfasdf'.
    gv_chr = 'BBAP'.
    write: / 'before replace gv_str is', gv_str.
    replace 'abap' in gv_str with gv_chr.
    write: / 'after replace gv_str is', gv_str.
  • TRANSLATE, 大小写转换, 大写变小写, 小写变大写
  • gv_str = 'ABCdefGHI'.
    translate gv_str to upper case.
    write / gv_str.

    upper/lower, 不能同时转换, 只能转换大写或者小写

  • SHIFT, 字符串左移
  • gv_str = '12345'.
    shift gv_str.
    write / gv_str.  "默认左移1位, 输出2345
    gv_str = '12345'.
    shift gv_str by 3 places.
    write / gv_str. "左移3位, 输出45
    
    gv_str = '12345'.
    shift gv_str up to '3'.
    write / gv_str. "截止3为止, 前面字符被弹出, 输出345
  • CONDENSE, 去除空格并左对齐, 常与NO-GAPS一起使用去掉空格
  • gv_str = ' aa bb cc '.
    condense gv_str.
    write / gv_str. "前后空格剪掉
    gv_str = ' aa bb cc '.
    condense gv_str no-gaps.  "所有空格剪掉
    write / gv_str.
  • OVERLAY, 填充空格, 原有字符串不覆盖
  • gv_str = 'B B B'.
    gv_chr = 'AAAA'.
    overlay gv_str with gv_chr.
    write / gv_str.

    输出:BABAB

  • CONCATENATE, 字符串链接
  • gv_str = '123'.
    gv_chr = '456'.
    concatenate gv_str gv_chr into gv_str.
    write / gv_str.

    输出:123456

  • SPLIT, 分裂
  • gv_str = '123'.
    split gv_str at '2' into gv_str gv_chr.
    write: / gv_str, gv_chr.

    输出:1 3

看帮助, 按F1

定义结构体类型

types begin of struc_type.
    types dtype.
types end of struc_type.
REPORT  Z_YZW_STRUC.
*这里声明结构体类型,结构体里面定义变量类型和长度
types: begin of t_ren,
name type c length 20,
country type c length 15,
city type c length 10,
age type i,
end of t_ren.

*这里给结构体变量赋值
data gs_people type t_ren.
gs_people-name = 'yzw'.
gs_people-country = 'CHINA'.
gs_people-city = 'guangzhou'.
gs_people-age = 18.
write: / gs_people-name, gs_people-country, gs_people-city, gs_people-age.

有点像python的类构造方法

  • 嵌套结构体
REPORT  Z_YZW_STRUC.
*这里声明结构体类型,结构体里面定义变量类型和长度
types: begin of t_ren,
name type c length 20,
country type c length 15,
city type c length 10,
age type i,
end of t_ren.
*这里定义嵌套结构体类型
types: begin of t_info.
      include type t_ren as ren. "定义另一个结构体t_info,同时包含上面的结构体t_ren, 达到t_info里面嵌套t_ren
types: phone type c length 10,
      end of t_info.
*这里给结构体变量赋值
data gs_people type t_info. "这里使用最外层结构体类型, 也就是t_info
gs_people-name = 'yzw'.
gs_people-country = 'CHINA'.
gs_people-city = 'guangzhou'.
gs_people-phone = '123456'.
write: / gs_people-name, gs_people-country, gs_people-city, gs_people-phone.

结构体与变量之间用短-连接: 结构体-变量

  • 直接定义变量
*不参照结构体,直接在data里定义变量和指定变量类型
data: begin of gs_people,
name type c length 20,
country type c length 15,
city type c length 10,
phone type c length 10,
end of gs_people.

gs_people-name = 'yzw'.
gs_people-country = 'CHINA'.
gs_people-city = 'guangzhou'.
gs_people-phone = '123456'.
write: / gs_people-name, gs_people-country, gs_people-city, gs_people-phone.
  •  include structure, 可以把data语句定义的结构体或者ABAP数据字典存在的结构体包含到嵌套结构体中
REPORT  Z_YZW_STRUC.
*定义数据类型,前缀是gs_ren
data: begin of gs_ren,
name type c length 20,
country type c length 15,
city type c length 10,
end of gs_ren.

*定义另一个数据类型gs_people,包含内层gs_ren,内层嵌套可以是data语句结构体或者ABAP数据数据字典已存在结构体
data: begin of gs_people.
    include structure gs_ren as ren.
data: phone type c length 10,
      end of gs_people.
      
gs_people-ren-name = 'yzw'.
gs_people-ren-country = 'CHINA'.
gs_people-ren-city = 'guangzhou'.
gs_people-phone = '123456'.
write: / gs_people-ren-name, gs_people-ren-country, gs_people-ren-city, gs_people-phone.
  • 不使用as关键字
*定义数据类型,前缀是gs_ren
data: begin of gs_ren,
name type c length 20,
country type c length 15,
city type c length 10,
end of gs_ren.

*定义另一个数据类型gs_people,包含内层gs_ren,内层嵌套可以是data语句结构体或者ABAP数据数据字典已存在结构体
data: begin of gs_people.
    include structure gs_ren.  "去掉 as ren
data: phone type c length 10,
      end of gs_people.
*如果不使用as关键字,访问变量均需要使用外层嵌套变量名作为前缀      
gs_people-name = 'yzw'.
gs_people-country = 'CHINA'.
gs_people-city = 'guangzhou'.
gs_people-phone = '123456'.
write: / gs_people-name, gs_people-country, gs_people-city, gs_people-phone.

ABAP数据字典数据类型

abap数据字典中的数据类型为全局数据类型. abap数据字典(表/结构体/数据元素)实在所有程序中都可以用来声明变量的因素

abap数据字典类型大致分为3种:

  • 表及视图: type dbtab, type dbtab-comp
  • 数据类型: 数据元素, 结构体, 表类型
  • 类型组: type groups

 根据数据表定义数据类型:

data: gs_sflight type sflight. "fliaght是一个数据表
select single * from sflight into gs_sflight where carrid = '001'.
write: / gs_sflight-CARRID, gs_sflight-connid, gs_sflight-fldate, gs_sflight-price,
gs_sflight-currency, gs_sflight-planetype.

根据数据库表的字段定义数据类型:

data: gv_carrid type sflight-carrid,
gv_connid type sflight-connid,
gv_fldate type sflight-fldate.
gv_carrid = 'aa'.
gv_connid = '018'.
gv_fldate = sy-datum.
write: / gv_carrid, gv_connid, gv_fldate.

参照基本数据类型定义变量

SE11中创建数据类型可选项:

 

数据元素, 参照域定义, 一个域可以在多个数据元素中使用, 一个数据元素可以在多个数据表中使用

  • 参照数据元素定义变量
data gs_carrid type s_carr_id. "s_carr_id是一个系统数据元素, 可以用type关键字直接参考
gs_carrid = 'AA'.
write: / gs_carrid.
  • 参照结构体的type定义
types dtype type structure.

 先创建一个struct的数据类型zstruct

,再根据这个结构类型进行数据声明

data gs_str type ZSTRUCT.
gs_str-col1 = '1'.
gs_str-col2 = 'structure'.
gs_str-col3 = 'abap dictionary test'.
write: / gs_str-col1, gs_str-col2, gs_str-col3.

ABAP数据字典类型与ABAP基本数据类型 

ABAP数据字典类型, 指在ABAP数据字典中将经常使用的数据类型事先定义的实例  http://blog.csdn.net/szlaptop/article/details/8125920

数据字典预置类型 ABAP类型 运行长度 说明
ACCP N(6) 6 会计计算周期
CHAR C(n) 1-255 字符
CLNT C(3) 3 集团,数据区域代码
CUKY C(5) 5 货币代码
CURR(n,m) P((n+1)/2)DECIMALm 42736 货币金额
DATS D(8) 8 日期
DEC n,m P((n+1)/2)DECIMALm n(1-31)m(1-17) 数值计算
FLTP F(8) 18 浮点数
INT1 X(1)(类型b) 3 单字节整形数
INT2 X(2)(类型s) 5 双字节整形数
INT4 X(4)(类型i) 10 四字节整形数
LANG C(1) 内部1位外部2位 语言代码
LCHR C(n) 256-最大值 长字符
LRAW X(n) 256-最大值 长位字串
NUMC n N(n) 1-255 数值文字
PREC X(2) 16 精确度
QUAN n,m P((n+1)/2)DECIMALm 42736 数量
RAW n X(n) 1-255 位字串
TIMS T(6) 6 时间
VARC n C(n) 255-最大值 长字符(仅3.0前可用)
STRING STRING 1-最大值 字符串
RAWSTRING XSTRING 1-最大值 位字符串
UNIT C(n) 2~3 单位

 

变量赋值

  • MOVE value to variable, 隐式转换类型为variable, D与T类型不可以互相转换
  • variable = value
  • write value to variable1, 还可以输出报表list
  • MOVE-CORRESPONDING 用于两个不同结构体或内标之间相互赋值, 赋值时与先后顺序无关, 自动查找同名变量进行赋值
data: begin of gs_ren,
name(20) value 'yzw',
country(10) value 'china',
city(20) value 'guangzhou',
end of gs_ren.

data: begin of gs_info,
name(20),
city(20),
phone(10) value '12345',
end of gs_info.

move-corresponding gs_ren to gs_info. "自动匹配变量名相同的变量并赋值
write: / gs_info-name, gs_info-city, gs_info-phone.

offset截取赋值

data: f1(8) value 'abcdefgh',
f2(8).
move f1+2(3) to f2. "从f1变量的第2+1位开始,截取3个字符赋值给f2
write: f1, f2.

结果是cde

结构体之间的计算操作

  • ADD-CORRESPONDING
  • SUBTRACT-CORRESPONDING
  • MULTIPLY-CORRESPONDING
  • DIVIDE-CORRESPONDING
data: begin of gs_rate,
peng type f value '0.8',
zhou type f value '1.0',
end of gs_rate.

data: begin of gs_result,
peng type i value 95,
zhou type i value 70,
end of gs_result.

multiply-corresponding gs_result by gs_rate. "两个结构体的相同变量相乘
write: / gs_result-peng, gs_result-zhou.

常量

constants c value [val | is initial].

constants: begin of crec, 
...
end of crec.
constants: c_company(10) value 'lg cns'. "一般常量
constants: begin of c_people, "结构体常量
name(20) value 'yzw',
country(10) value 'china',
end of c_people.
write: c_company, c_people-name, c_people-country.

静态常量

The "STATICS" statement can only be used in FORMs, FUNCTIONs, and CLASS-METHODs. .

在from语句块内用statics定义的局部变量的值可以保持到程序结束

statics f.

statics: begin of struc,
...
end of struc.
DO 3 TIMES.
  PERFORM call_subr.
endDO.

FORM CALL_SUBR.
statics lv_val type i.
lv_val = lv_val + 1. 
write: / lv_val. "每次调用输出1 2 3, 直到程序结束
ENDfORM.
DO 3 TIMES.
  PERFORM call_subr.
endDO.

FORM CALL_SUBR.
  data lv_val type i.
  lv_val = lv_val + 1.
  write: / lv_val. "每次调用初始化为1
ENDfORM.                    "CALL_SUBR

TABLES

使用tables语句定义的ABAP数据字典中的数据表/视图/结构体, 会生成与ABAP数据字典具有相同结构的数据对象

tables: scarr.

select * from scarr. " into scarr被省略,因为表与结构体名称相同
write: / scarr-carrid, scarr-carrname.
endselect.

 

posted @ 2018-01-13 17:26  Jenvid  阅读(1410)  评论(1编辑  收藏  举报