一、定义变量和类型
新的开始,菜鸟ABAP从此起航。记录每天的进步和收获,坚持就一定会有收获。
1、定义基本变量和类型
示例代码如下:
REPORT ZTEST_WJ_002.
*用户自定义类型
*要求:
*首先定义以下类型
*姓名 长度20的字符串。
*年龄 整数类型
*身份证号 长度为18的字符串。
*手机号 长度为11的数字
*性别 长度为1的字符
*身高(米) 1位整数,两位小数。
TYPES:TY_NAME(20) TYPE c.
TYPES:TY_AGE(2) TYPE n.
*可以用一个TYPES 用冒号连续定义多个类型。
TYPES:TY_SFZ(18) TYPE C,
TY_MOBILE(11) TYPE N,
TY_GENDER(1) TYPE C,
TY_HIGHT(2) TYPE P DECIMALS 2.
DATA:name TYPE TY_NAME,
age TYPE TY_AGE,
sfz TYPE TY_SFZ,
gender TYPE TY_GENDER,
hight TYPE TY_HIGHT,
mobile TYPE TY_MOBILE.
MOVE '张三' TO name.
age = 28.
sfz = '422802199401111234'.
gender = 'F'.
hight = '1.85'.
mobile = '15251632992'.
WRITE: '员工个人信息:',/,'姓名:',name,/,'性别:',gender,/,'年龄:',age,/,'身份站号:',sfz,
/,'电话:',mobile.
注意:类型的创建主要参考已经存在基本数据类型和表字段,在创建的时候同时可以预定义字段的长度。字段的定义主要有以下几种方式。注意在参考类型创建时用关键字TYPE,参考字段创建时,用关键LIKE.
①、参考基本类型定义。
DATA: g_l(10) TYPE c.
②、参考类型
DATA: g_l(10) TYPE TY_NAME.
③、参考字段
DATA: g_l(10) LIKE mseg-matnr.
2、定义结构体类型
示例代码如下:
REPORT ZTEST_WJ_003.
TYPES:TY_NAME(20) TYPE c.
TYPES:TY_AGE(2) TYPE n.
*可以用一个TYPES 用冒号连续定义
TYPES:TY_SFZ(18) TYPE C,
TY_MOBILE(11) TYPE N,
TY_GENDER(1) TYPE C,
TY_HIGHT(2) TYPE P DECIMALS 2.
*定义结构体类型
TYPES:
BEGIN OF s_person,
t_name TYPE TY_NAME,
t_age TYPE TY_AGE,
t_mobile TYPE TY_MOBILE,
t_gender TYPE TY_GENDER,
t_hight TYPE TY_HIGHT,
END OF s_person.
DATA:ty_person TYPE s_person.
ty_person-t_name = '张三'.
ty_person-t_gender = '男'.
ty_person-t_age = '28'.
ty_person-t_mobile = '15251632992'.
ty_person-t_hight = '1.85'. WRITE:ty_person-t_name.
*结构的嵌套
TYPES:BEGIN OF s_student,
t_person TYPE s_person,
t_id(8) TYPE n,
t_school(20) TYPE c,
END OF s_student.
DATA:ty_student TYPE s_student.
ty_student-t_person = ty_person.
WRITE:ty_student-t_person-t_name.
ty_student-t_person-t_name = '张三1'.
write:ty_student-t_person-t_name.
*验证结构赋值
TYPES:BEGIN OF s_sname,
t_name TYPE TY_NAME,
t_age TYPE TY_AGE,
END OF s_sname.
DATA:ts_name TYPE s_sname.
DATA ts_person TYPE s_person.
ts_name-t_name = '张三4'.
IF ts_name-t_name = '张三4'.
ts_name-t_name = 'WJ4'.
ENDIF.
* ts_name-t_name = '张三4'.
move-corresponding ts_name to ts_person.
WRITE:/,'ts_name:',ts_name,/,'ts_person:',ts_person-t_name.
注意: 在定义数据对象的时候,必先确定数据类型。对于类型的创建可以参考多种方式,比如参考已经存在的表的字段,直接创建基于基本数据类型的类型,参考之前定义的属性字段,还可以预定义类型的长度,这在对某些固定长度的字段中显得非常有必要,比如电话号码、身份证等信息,就可以在类型中预定义数据的长度。结构的创建主要有以下几种方式:
①、直接创建,结构体类型的成员为基本数据类型或为参考基本数据创建的数据类型。
TYPES:TY_NAME(20) TYPE c.
TYPES:TY_AGE(2) TYPE n.
*可以用一个TYPES 用冒号连续定义
TYPES:TY_SFZ(18) TYPE C,
TY_MOBILE(11) TYPE N,
TY_GENDER(1) TYPE C,
TY_HIGHT(2) TYPE P DECIMALS 2.
*定义结构体类型
TYPES:
BEGIN OF s_person,
t_name TYPE TY_NAME,
t_age TYPE TY_AGE,
t_mobile TYPE TY_MOBILE,
t_gender TYPE TY_GENDER,
t_hight TYPE TY_HIGHT,
END OF s_person.
DATA:ty_person TYPE s_person.
②、参考已存在表对象创建,这也可以被称为创建工作区。
DATA wa_scarr TYPE scarr.
3、内表的创建和处理
示例代码如下:
REPORT ZTEST_WJ_005.
*定义内表
TYPES:BEGIN OF ty_person,
name(10) TYPE c,
sfz(18) TYPE n,
mobile(11) TYPE n,
END OF ty_person.
DATA it_person TYPE TABLE OF ty_person.
*利用类型定义工作区
DATA wa_person_1 TYPE ty_person.
DATA wa_person_2 LIKE LINE OF it_person.
DATA it_person1 TYPE TABLE OF mseg.
DATA wa_person1 TYPE mseg.
*用内表取出数据
DATA wa_scarr TYPE scarr.
DATA it_scarr TYPE TABLE OF scarr.
SELECT *
FROM scarr
INTO CORRESPONDING FIELDS OF TABLE it_scarr.
IF sy-subrc = 0.
LOOP AT it_scarr
INTO wa_scarr.
WRITE:wa_scarr-CARRID,
wa_scarr-CARRNAME,
wa_scarr-CURRCODE,
wa_scarr-url,/.
ENDLOOP.
ELSE.
WRITE:'Data not found!'.
ENDIF.
注意: 内表的创建方式多样, 比较常见的方式有以下几种:
①、参考已经存在的表创建
DATA it_scarr TYPE TABLE OF scarr.
②、参考结构体类型创建
TYPES:BEGIN OF ty_person,
name(10) TYPE c,
sfz(18) TYPE n,
mobile(11) TYPE n,
END OF ty_person.
DATA it_person TYPE TABLE OF ty_person.
对于内表的处理方式,首先遍历工作区,工作区相当于结构变量。遍历内表行,每次取值至工作区单独处理。