一、数据类型
数据类型在 ABAP 程序中用于定义变量类型。数据类型和数据对象是单独声明的,数据对象则参照数据类型定义。在程序中利用 TYPES 语句声明数据类型,这种数据类型只能在该程序中使用,因此也称为本地数据类型。本地数据类型参照已有的 ABAP 数据类型进行声明从数据类型层面考虑,ABAP 程序的特点是可以参照ABAP 数据字典自身的数据类型定义变量,这种特征便于开发者编程。
二、数据类型的种类
三、ABAP基本数据类型
ABAP基本数据类型是系统内部定义的数据类型。
同C、Java 语言中的c、d、f、i、n类型一样,是系统内部已定义的数据类型另外,ABAP语言中还存在p、t、类型
数字型:
(1)整数型I
值范围为-2147483648~2147483647(2的31次方)
只支持整数类型。
非整数型数据会进行四舍五入(Round)。
用于计算行数、条目数、索引值等
(2)小数型 Packed numbers of Type P
允许有小数位。
可用长度为 1~16,小数位最大长度为 14 位。
程序属性设置,应选择 Fixed point arithmetic。若不选择,类型P就没有意义,与整数类型相同。常使用于精度比较高的数据
例:
*packed数据类型基本操作
DATA : packed_1 TYPE p DECIMALS 2 VALUE '2.17',
packed_2 TYPE p DECIMALS 2 VALUE '5.43',
packed_result TYPE p DECIMALS 2.
packed_result = packed_2 / packed_1.
WRITE: / packed_result.
MULTIPLY packed_result BY packed_2.
WRITE: / packed_result.
(3)浮点型 F
值范围为1X(10的-307次方)~1X(10的308次方)
用于定义指数(exponent),因此需要调用“FLTP CHAR CONVERSION”函数把其
类型转换成其他数据类型后才可以输出。
类型 F转换成二进制时会发生进位误差
若要显示高精度的数据,则应该使用类型 P。
数值较大或者不需要进行四舍五入时可以使用类型 F(因为在取近似值时使用,因此使用时需要注意)。
例:
* 浮点型数据类型基本操作
DATA : gv_float1 TYPE f VALUE '1.337',
gv_float2 TYPE f VALUE '2.7',
gv_fresult TYPE f,
gv_cresult TYPE c LENGTH 16.
gv_fresult = gv_float2 * gv_float1.
WRITE: / gv_fresult.
CALL FUNCTION 'FLTP_CHAR_CONVERSION'
EXPORTING
decim = 2
input = gv_fresult
IMPORTING
flstr = gv_cresult.
CALL FUNCTION 'FLTP_CHAR_CONVERSION'.
WRITE: / gv_cresult.
数值基本运算规则:
常用函数:
字符型:
字符串类型也称为字符串字段,分为以下 4种
C:用于定义文字、数字、特殊文字。
N:用于显示C类型数字,以字符串形式显示整数
D:日期类型。
T:时间类型
STRING:不定长的字符型
例:
* 字符串类型基本操作
DATA : gv_str TYPE string,
gv_chr(6) TYPE c.
*查找字符串
gv_str = 'ABAP'.
gv_chr = 'AB'.
FIND gv_chr IN gv_str.
IF sy-subrc EQ 0.
WRITE 'B FOUND'.
ENDIF.
*字符串替换
gv_str = 'ABAP'.
gv_chr = 'BBAP'.
REPLACE 'ABAP' IN gv_str WITH gv_chr.
WRITE: / gv_str.
*大小写转换
gv_str = 'ABAP'.
TRANSLATE gv_str TO LOWER CASE .
WRITE : / gv_str.
*字符串ABAP依次向左移动
gv_str = 'ABAP'.
SHIFT gv_str.
WRITE : / gv_str.
*去除字符串空格
gv_str = 'AB AP'.
CONDENSE gv_str NO-GAPS.
WRITE : / gv_str.
*填充空格,但不覆盖原有字符
gv_str = ' B P'.
gv_chr = 'AAAA'.
OVERLAY gv_str WITH gv_chr.
WRITE : / gv_str.
*一指定字符串分割成多个字符串。
gv_str = 'AB,AP'.
SPLIT gv_str AT ',' INTO gv_str gv_chr.
WRITE : / 'split: ' ,gv_str,
/ gv_chr.
*以上字符串输出结果如下:
* B FOUND
* BBAP
* abap
四、局部数据类型
在ABAP 程序中用ABAP 基本数据类型定义局部数据类型。另外,还可以定义包含多ABAP基本数据类型的结构体(Structure)类型。
声明类型
定义结构体类型
五、全局数据类型
全局数据类型是指所有程序都可以使用的数据类型。
可以用TYPE语句参照ABAP 数据字典里的数据类型定义变量。即SE11创建的ABAP数据字典的对象都可以用于定义数据变量。表(表字段)数据类型、数据元素、结构体 表类型,利用这些 ABAP 数据字典对象可以声明程序内部数据类型及数据变量。
六、声明数据类型
数据变量
数据变量(Data variable) 是在程序中参照数据类型(Data Type)定义的值。从技术角度考虑,ABAP 程序里是通过变量名对此变量进行操作的 (首先执行解析数据类型的操作)。在ABAP程序中最常用的方法是用 Data 语定义变量。
数据对象
前面所定义的变量实际是指数据对象。所谓的数据对象只有在程序执行期间占用内存物理地址。ABAP 语句首先利用数据对象名称确认地址,然后根据参照数据类型的字段长度及小数位等信息解析内容。数据对象里存在没有固定名称的类型,如(WRITE'ABCDE')Text Symbol ( WRITE text-001 ) 、 Variable ( DATASTATICSCLASS-DATAPARAMETERS...)Constants 等类型。
ABAP命名规则
SAP 规定创建ABAP 数据字典的程序及数据对象后命名时要以Z或Y开头且不能使用如INSERT/APPEND等关键字。此外,每个客户自己制定统一规范并遵守即可。接下来确认下在 ABAP程序中要使用的命名规则(不会涉及类似于表、结构体、锁等 ABAP 数据字典)。ABAP 程序中允许定义的变量名最大长度为 30 位,其中包含“”符号。下图充分说明了在实际业务中使用的典型命名规则。变量名的前 2 位表示范围及类型,区分符号“”和最后单词将省略变量的具体功能。
定义全局变量
全局变量(Global Variable) 是指在一个程序或函数内可以访问的数据类型。在程序内部的所有领域里都可以参照并修改,因此没有局域性。在程序激活状态下全局变量一直占用着内存地址。定义全局变量时变量名以 G 开头。
定义局部变量
局部变量(Local Variable)是指只有在程序模块内部有效的变量。所谓的模块是指函数子程序等为了实现单位功能集合成块的代码。
七、ABAP 数据字典数据类型
ABAP 数据字典中的数据类型为全局数据类型。ABAP 数据字典(表、结构体、数据元是在所有程序中都可以用来声明变量的因素。素)ABAP数据字典类型大致分为下列3种形式
表及视图:..TYPE dbtab,TYPE dbtab-comp
数据类型:数据元素,结构体,表类型
类型组(Type Groups)
参照表、视图声明数据类型
例:
DATA : gs_sflight TYPE sflight.
SELECT SINGLE * FROM sflight INTO gs_sflight
WHERE carrid = 'AA'.
WRITE: /
gs_sflight-carrid,
gs_sflight-connid,
gs_sflight-fldate,
gs_sflight-price,
gs_sflight-currency,
gs_sflight-planetype.
参照基本数据类型定义变量
数据元素:ABAP 数据字典中用数据元素 (Data Element)定义个别字段。
利用结构体的TYPE定义
例:
DATA gs_str TYPE zstructr.
gs_str-col1 = '1'.
gs_str-col2 = 'STRUCTURE'.
gs_str-col3 = 'ABAP DICTIONARY TEST'.
WRITE : gs_str-col1,gs_str-col2,gs_str-col3.
利用类型组的type定义:
例:
*利用类型组 TYPE 定义
DATA:gv_tgrp1 TYPE ztgrp_type1,
gv_tgrp2 TYPE ztgrp_type2.
gv_tgrp1 = 'TYPE GROUP'.
gv_tgrp2-col1 = 'TEST'.
gv_tgrp2-col2 = 7.
WRITE:gv_tgrp1,gv_tgrp2-col1,gv_tgrp2-col2,ztgrp_name
八、ABAP基本数据类型与数据字典类型:
九、赋值
给变量赋值:
在定义变量的时候可以用value给变量赋值,在程序运行过程中,可以使用move和write to 给变量赋值,此外,move to同=或equals相同。
复制符字段值时可以使用MOVE-CORRESPONDING 语。这时
例:(给结构体赋值)
* 结构体赋值
DATA :BEGIN OF gs_ren,
name TYPE c LENGTH 10 VALUE 'KETMI',
age TYPE i VALUE 20,
city TYPE c LENGTH 15 VALUE 'SHANGHAI',
pnone TYPE c LENGTH 11 VALUE '12345678910',
END OF gs_ren.
DATA :BEGIN OF gs_info,
name TYPE c LENGTH 10,
city TYPE c LENGTH 15,
school TYPE c LENGTH 10 VALUE '学校',
END OF gs_INFO.
MOVE-CORRESPONDING gs_ren TO gs_info.
WRITE : / gs_info-name,
/ gs_info-city,
/ gs_info-school.
利用offset赋值:
例:
*利用offset赋值
DATA:gv_f1(8) VALUE 'ABCDEF',
gv_f2(8),
gv_start TYPE i VALUE 2,
gv_length TYPE i VALUE 4.
MOVE gv_f1 TO gv_f2.
WRITE : / gv_f2.
CLEAR gv_f2.
MOVE gv_f1+2(3) TO gv_f2.
WRITE : / gv_f2.
CLEAR gv_f2.
MOVE gv_f1+gv_start(gv_length) TO gv_f2.
WRITE : / gv_f2.
结构体之间的运算操作:
例:
* 结构体运算
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 : 'TEST RESULT', 'PENG:',gs_result-peng,'ZHOU:',gs_result-zhou.
十、定义其他变量:
常量:
程序中经常使用的值可以定义为常量(constant)。定义常量后在程序内不可以进行修改在程序内会重复多次使用常量,当需要修改常量时只需修改一处即可,这样就可以节省时间。另外为数字起有意义的名字作为常量使用可以提高程序的可读性。
例:
*定义常量
CONSTANTS:c_company(10) VALUE 'CNS'.
CONSTANTS:BEGIN OF c_people,
name(20) VALUE 'ZHOU WEN WOO',
country(10) VALUE 'CHINA',
END OF c_people.
WRITE: c_company,c_people-name,c_people-country.
静态变量:在子程序块(FORMFUNCTION )中要持续保存局部变量值时定义为静态变量STATICS)。即在FORM语块内用STATICS 定义的局部变量的值可以保持到程序结束。
例:
*静态变量
DO 3 TIMES.
PERFORM call_subr.
ENDDO.
FORM call_subr.
STATICS lv_val TYPE i.
lv_val = lv_val + 1.
WRITE : / 'STATIC VARIABLE:',lv_val.
ENDFORM.
DATA : GV_RESULT TYPE I.
DO 3 TIMES.
PERFORM CALL_SUBR.
ENDDO.
FORM CALL_SUBR.
DATA LV_VAL TYPE I.
LV_VAL = LV_VAL + 1.
WRITE: / 'LOCAL VARIABLE:',LV_VAL.
ENDFORM.
TABLES:使用TABLES 语句定义 ABAP 数据字典中的数据表视图、结构体,会生成与 ABAP数据字典具有相同结构的数据对象。这种表工作区,在程序中与结构体的用法相同。
END........