定义数据需要指定其数据类型。数据类型有预定义数据类型和自定义数据类型之分。预定义数据类型的名称是固定的。用户定义的数据类型的名称由用户在程序中指定。ABAP/4 中预定义的数据类型如下表所示。
类型 | 长度 | Rang | 初始值 | 说明 |
---|---|---|---|---|
C | 1 | 1-65535Byte | space | 字符串数据, 如’Program’ |
D | 8 | 8Byte | ‘00000000’ | 日期数据, 格式为YYYYMMDD |
F | 8 | 8Byte | 0 | 浮点数 |
I | 4 | -231至231-1 | 0 | 整数 |
N | 1 | 1-65535Byte | ‘00…0’ | 数值所组成的字符串 |
P | 8 | 1-16Byte | 0 | Packed 数, 用在小数点数 |
T | 6 | 6Byte | ‘000000’ | 时间数据, 格式为HHMMSS |
X | 1 | 1-65535Byte | X’00’ | 16进位数 |
*DATA语法:
*DATA [] TYPE [] []
*: 变量名称, 最长30个字符, 不可含有 + . , : ( ) 等字符。
*: 数据类型及长度, 如 LINE(20) TYPE C.亦如MYNAME LIKE SY-UNAME 。
*: 初值。
*: 小数位数。
"实例1
DATA: COUNTER TYPE P VALUE 1, "名称为COUNTER变量,类型为P ,初值为1
FLAG TYPE C VALUE IS INITIAL, "名称为FLAG的变量,类型为 C ,初值为默认值
WEIGHT TYPE P DECIMALS 2 VALUE ‘1.25’. "名称为WEIGHT的变量,类型为P ,初值为1.25
"实例2
DATA: BEGIN OF ADDRESS, "定义数组变量ADDRESS
NAME(10) TYPE C ,
NUMBER TYPE P,
END OF ADDRESS.
"使用时用字段变量加上组件名称, 如 ADDRESS-NAME。
*常数定义使用 CONSTANTS 指令, 如定义 PI 是一个有5位小数的数值 3.14159 .
"实例:
CONSTANTS PI TYPE P DECIMALS 5 VALUE ‘3.14159’.
SPACE "空白字符串
SY-SUBRC "系统执行返回值,0表示执行成功 4代表错误
SY-UNAME "登陆帐号名称
SY-DATUM "系统日期
SY-UZEIT "系统时间
SY-TCODE "目前的事务代码
*TYPE用来指定数据类型。
"实例:
DATA: NAME(10) TYPE C.
TYPES: NUMBER TYPE I.
*TYPES用来自定义数据类型。
"实例:
TYPES:BEGIN OF MYLIST,
NAME(10) TYPE C,
NUMBER TYPE I,
END OF MYLIST.
*LIKE也用来指定数据类型,使用格式与TYPE相同,LIKE与TYPE的区别是LIKE 用在已有值的数据项,
*如系统变量, 而TYPE叙述则是用在指定数据类型。
"实例:
DATA: MYDATA LIKE SY-DATUM.
*STATICS用来定义变量,使用格式与DATA相同。与DATA的区别是STATICS只能在子程序中使用,
*用STATICS定义的变量可以在退出子程序后保留局部数据
*对象的值,而DATA不能。
"语法:
" STATICS [] [] []
"实例:
FORM DATATEST2.
STATICS A(20) TYPE C .
A = 'AAA'.
WRITE: / A.
ENDFORM.
TABLES 语句用来创建称为表工作区的数据对象。表工作区是参考 ABAP/4 词典对象的字段串。语法:TABLES .其中 是ABAP/4 词典 对象的名称,同时也是创建的表工作区的名称。表工作区组件的顺序和名称与在 ABAP/4 词典中声明的对象相同。
TABLES: EBAN.
语法:
MOVE TO
将F1的值存至变数 F2 中, 也可写成 F2 = F1
实例:
DATA M_NAME(10) TYPE C.
M_NAME = 'CHER'.
MOVE M_NAME TO DATA(M_NAME1).
DATA: F1(10) TYPE C VALUE 'ABCDEFGHIJ'.
F2(5) TYPE C.
F2 = F1+3(5). "自第4个位置开始取出5个字符
"F2 的内容会变成 DEFGH
语法: MOVE –CORRESPONDING TO .
将Strings1中的字段名称相同的数据复制至Strings2相应字段中
DATA: BEGIN OF ADDRESS,
FIRSTNAME(10) TYPE C VALUE 'LULU',
LASTNAME(10) TYPE C VALUE 'CHOU',
TEL(12) TYPE C VALUE '4660570',
END OF ADDRESS.
DATA: BEGIN OF NAME,
FIRSTNAME(10) TYPE C,
LASTNAME(10) TYPE C,
E_MAIL(30) TYPE C,
END OF NAME.
MOVE-CORRESPONDING ADDRESS TO NAME.
"NAME-FIRSTNAME 变成 ‘LULU’, NAME-LASTNAME 变成 ‘CHOU’, 而 NAME-E_MAIL 则不变。
*语法:
* CLEAR .
* 清除变量现在内容
*实例:
DATA N TYPE I VALUE 100.
CLEAR N.
FREE abc[] "清空数组
"变量 N 的内容变成 0
符号 | 说明 |
---|---|
** | 乘幂 |
* | 乘 |
/ | 除 |
+ | 加 |
- | 减 |
DIV | 整数除法 |
MOD | 余数除法 |
1 ABS(N): 取数值 N 的绝对值
2 SIGN(N): 1 if N > 0
0 if N = 0
-1 if N < 0
3 CEIL(N): 传回大于数值N的最小整数
实例:
DATA:INT1 TYPE I,
INT2 TYPE I.
INT1 = CEIL('-5.65').
WRITE:INT1. 输出结果:5-
INT2 = CEIL('4.54').
WRITE:INT2. 输出结果:5
4 FLOOR(N): 传回小于数值N的最大整数
实例:
DATA:INT1 TYPE I
INT2 TYPE I.
INT1 = FLOOR('-5.65').
WRITE:INT1. 输出结果:6-
INT2 = FLOOR('4.54').
WRITE:INT2. 输出结果:4
5 TRUNC(N): 传回数值N的整数部分
实例:
DATA: INTI TYPE I.
INTI = TRUNC('5.65').
WRITE INTI. 输出结果: 5
6 FRAC(N): 传回数值 N 的小数部分
实例:
DATA: MYF TYPE F.
MYF = FRAC('5.65').
WRITE MYF. 输出结果: 0.65
7 COS(A),SIN(A),TAN(A): 传回三角函数 cos A, sin A, tan A 的值, A 为弪度量
8 EXP(N): 传回 e^N 值
9 LOG(N): 传回 log eN 值
LOG10(N): 传回 log N值
10 SQRT(N): 传回 N 的平方根值
1 日期数据的运算
日期数据可以直接运算, 如加法与减法的运算
实例:
DATA: Mdate TYPE d.
Mdate = SY-DATUM. "如传回 19971015
Mdate = SY-DATUM. "如传回 19971015
Mdate+6(2) = '01'. "Mdate 变成 19971001
Mdate = Mdate - 1. "Mdate 变成 19970930
2 时间数据的运算
时间格式为 ‘hhmmss’, 如 ‘212030’ 表 ’21:20:30’
实例:
DATA: HOURS TYPE I,
MINUTES TYPE I,
T2 TYPE T VALUE '200000',
T1 TYPE T VALUE '183000'.
HOURS = ( T2 - T1 ) / 3600. "计算有几小时
MINUTES = ( T2 - T1 ) / 60. "计算几分钟
1 字符串移位
语法:
SHIFT [BY PLACES] [] [CIRCULAR]
[BY PLACES]:表示移动的位数,没有此参数默认移动一位。
[] : 移动的方向,没有此参数默认向左移动。
(1).LEFT, 字符串往左移 n 位
(2).RIGHT, 字符串往右移 n 位
[CIRCULAR]: 字符串以环状方式移位
实例:
DATA STRING(10) TYPE C VALUE 'ABCDEFGHIJ'.
SHIFT STRING. "得到 'BCDEFGHIJ'
SHIFT STRING BY 2 PLACES RIGHT. "得到 ABCDEFGH
2 取代字符串内容
语法:
REPLACE WITH INTO
将字符串 中的 以 来取代
实例:
DATA: STRING(10) TYPE C VALUE 'ABCDEFGHI',
STR1(3) TYPE C VALUE 'DEF',
STR2(3) TYPE C VALUE '123'.
REPLACE STR1 WITH STR2 INTO STRING.
WRITE / STRING. "得到 ABC123GHI
3 大小写的转换
语法:
TRANSLATE TO UPPER CASE. *转成大写
TRANSLATE TO LOWER CASE. *转成小写
4 在字符串中寻找部分字符串
语法:
SEARCH FOR
从字符串查询字符串
执行结果存至两个变数, SY-SUBRC 和 SY-FDPOS, 若找到则 SY-SUBRC 为 0 ,SY-FDPOS 存开始位迭(从0开始计)。
若找不到则 SY-SUBRC为 4, SY-FDPOS为 0。
实例:
DATA STRING(10) TYPE C VALUE 'ABCDEFGHIJ'.
SEARCH STRING FOR 'CDE'.
SY-SUBRC值为:0
SY-FDPOS值为:2
5 字符串长度
语法:
STRLEN()
实例:
DATA:INT TYPE I.
INT = STRLEN('XYZABC'). "得到 6
INT = STRLEN('ABC '). "得到 3
6 取部分字符串
语法:
[+][]
实例:
DATA T(10) TYPE C VALUE 'ABCDEFGHI'.
WRITE / T+2(4).
执行结果:CDEF
7 组合字符串的函数
语法:
CONCATENATE INTO .
实例:
DATA:str1(4) type c,
str2(4) type c,
str3(8) type c.
str1 = '2007'.
str2 = '0902'.
CONCATENATE str1 str2 INTO str3.
WRITE:str3.
执行结果:20070902
8 去掉字符串中间的空格
语法:
CONDENSE NO-GAPS.
实例:
DATA: str0(10) TYPE c.
str0 = 'abc sde'.
CONDENSE str0 NO-GAPS.
WRITE:/ str0.
执行结果:abcsde
在ABAP/4中要自屏幕输入变量的内容, 使用的命令是 PARAMETERS 及 SELECTION-OPTIONS:
语法:
PARAMETERS
[DEFAULT ] [LOWER CASE] [OBLIGATORY] [AS CHECKBOX] [RADIOBUTTON GROUP ]
实例:
PARAMETERS: NAME(8) TYPE C,
AGE TYPE I,
BIRTH TYPE D.
执行行結果:
LOWER CASE:ABAP/4预设是将字串输入值自动转换为大写, 加上此参数会将输入的资料转成小写。
OBLIGATORY:强制要求输入, 屏幕上会出現一个“ ?” , 使用者必须要输入才可。
AS CHECKBOX:输入 CHECKBOX的格式。
实例:
PARAMETERS: TAX AS CHECKBOX DEFAULT ‘X’,
NTD AS CHECKBOX.
执行結果:
RADIOBUTTON GROUP :输入 RADIO BUTTON GROUP 的方式。
实例:
PARAMETERS: BOY RADIOBUTTON GROUP SEX DEFAULT ‘X’,
GIRL RADIOBUTTON GROUP SEX.
执行結果:
语法:
SELECT-OPTIONS FOR
[DEFAULT TO ]
[NO-EXTENSION]
[NO INTERVALS]
[LOWER CASE]
[OBLIGATORY]
实例: TABLES SPFLI.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID. *将条件的输入值存放入 AIRLINE, 筛选对象为SPFLI中的CONNID栏位。
执行結果:
DEFAULT TO :设定开始结束范围输入默认值
实例:
SELECT-OPTIONS AIRLINE FOR SPFLI_WA-CONNID
DEFAULT '2042' TO '4555'.
NO-EXTENSION:设定不要多值输入的画面
NO INTERVALS:设定不要区间范围输入的画面
LOWER CASE:输入转换成大写
OBLIGATORY:强制要求输入
条件输入完后要将符合条件的数据筛选出来, 可配合使用 SELECT 指令
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI WHERE CONNID IN AIRLINE.
WRITE: / SPFLI-CONNID,SPFLI-FROMCITY,SPFLI-TOCITY.
ENDSELECT.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI.
CHECK AIRLINE.
WRITE: / SPFLI-CONNID,SPFLI-FROMCITY,SPFLI-TOCITY.
ENDSELECT.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI.
IF SPFLI-CONNID IN AIRLINE
WRITE: / SPFLI-CONNID,SPFLI-FROMCITY,SPFLI-TOCITY.
ENDIF.
ENDSELECT.
略…用处不大
TYPES: BEGIN OF LINE, *定义数组类型
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
TYPES:ITABT TYPE LINE OCCURS 10. *定义表类型
DATA: MYITAB TYPE ITABT WITH HEADER LINE. *定义带工作区的内表,工作区名称与内表名称相同:MYITAB
*自带工作区的内表,工作区名称与内表名称相同:MYITAB
DATA: BEGIN OF MYITAB OCCURS 0,
COL1 TYPE I,
COL2 TYPE I,
END OF MYITAB.
DATA: ITAB LIKE SPFLI OCCURS 0 WITH HEADER LINE.(参数指定带工作区)
ITAB是定义的内表。
SPFLI是参照的数据库表。
DATA: BEGIN OF ITAB OCCURS 0.(自带同名工作区)
INCLUDE STRUCTURE ZTABLE1.(DATA BEGIN结构中每个子句用句号结束)
DATA: NAME(20) TYPE C.(可将定义NAME和AGE字段的DATA合并为一个,中间用逗号分割)
DATA: AGE TYPE I.
DATA: END OF ITAB.
ITAB是定义的内表。
ZTABLE1是参照的数据库表。
内表ITAB结构除包含数据库表ZTABLE1的所有字段外还包括字段NAME和字段AGE。
DATA: BEGIN OF MYITAB OCCURS 0,
COL1 TYPE I,
COL2 TYPE I,
END OF MYITAB.
MYITAB-COL1 = 11.
MYITAB-COL2 = 12.
APPEND MYITAB.
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE LINE OCCURS 10.
LINE-COL1 = 10.
LINE-COL2 = 20
APPEND LINE TO ITAB.
使用COLLECT指令向内表添加数据时将有相同standard key(非数值字段)的数据的数值字段进行汇总。
*语法:
* COLLECT [ INTO]
DATA: BEGIN OF ITAB OCCURS 3,
COL1(3) TYPE C,
COL2 TYPE I,
END OF ITAB.
ITAB-COL1 = ‘ABC’.
ITAB –COL2 = 10.
COLLECT ITAB.
ITAB-COL1 = ‘XYZ’.
ITAB-COL2 = 20.
COLLECT ITAB.
ITAB-COL1 = ‘ABC’.
ITAB-COL2 = 30.
COLLECT ITAB. “汇总COL2 至 COL1=ABC 的元素上
LOOP AT ITAB.
WRITE: / ITAB-COL1,ITAB-COL2.
ENDLOOP.
执行结果:
ABC 40
XYZ 20
*语法
*INSERT [ INTO] [INITIAL LINE INTO] [INDEX ]
*INITIAL LINE INTO:与前面的[ INTO]参数不能同时使用,意义是插入空记录行到内表中
*INDEX :插入在第idx条记录之前的位置
*实例
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE LINE OCCURS 10.
DO 3 TIMES.
LINE-COL1 = SY-INDEX *10.
LINE-COL2 = SY-INDEX *20.
APPEND LINE INTO ITAB.
ENDDO.
LINE-COL1=100.
LINE-COL2=200.
INSERT LINE INTO ITAB INDEX 2. *插入在位置2之前
LOOP AT ITAB INTO LINE.
WRITE: / SY-TABIX,LINE-COL1,LINE-COL2. *SY-TABIX为Table位置
ENDLOOP.
*执行结果:
* 1 10 20
* 2 100 200
* 3 20 40
* 4 30 60
*语法:
*INSERT LINES OF [FROM TO ] INTO INDEX
*将中自至的范围的数据插入至中, 位置在 之前。
*实例:
INSERT LINES OF ITAB INTO JTAB INDEX 3.
*将ITAB所有元素插入JTAB中, 位置在第三个元素之前。
*LOOP AT [INTO ] [FROM TO ] [WHERE ]
*
*ENDLOOP.
*实例:
LOOP AT ITAB INTO LINE WHERE COL1 >100.
WRITE: / SY-TABIX,LINE-COL1.
ENDLOOP.
*仅读取 COL1 > 100 的元素。
*语法:
*READ TABLE [INTO ] INDEX
*自指定位置 读取元素数据。
*实例:
READ TABLE ITAB INTO LINE INDEX 5.
*读取 ITAB的第5个元素数据, 放入 LINE的字段中。
*语法:
READ TABLE INTO COMPARING .
*实例:
ITAB-COL1 = 'ABC'.
READ TABLE ITAB INTO LINE COMPARING COL1.
*找出ITAB 中 COL1 字段内容是 ABC 的元素, 找到的值放入 LINE 中。
*若找到 SY-SUBRC传回0, 找不到则SY-SUBRC传回 4, 必须定义有工作区。
READ TABLE ITAB INTO DATA(LS_TAB) WITH KEY COL1 = 'ABC'. "根据字段查数据
*语法:
*MODIFY [FROM ] [INDEX ] [TRANSPORTING …]
*[WHERE ]
*TRANSPORTING .. : 指定更新的字段名称。
*可分解为一下三种指令格式:
*(1) MODIFY [FROM ] [INDEX ]
*(2) MODIFY [FROM ] [TRANSPORTING …] [WHERE ]
*(3) LOOP AT ITAB. *没有参数确定修改哪条数据的情况MODIFY要在循环中使用,默认修改当前记录
* MODIFY [FROM ].
* ENDLOOP.
*实例:
LOOP AT ITAB.
LINE-COL1 = 4.
LINE-COL2 = 100.
MODIFY ITAB FROM LINE.
ENDLOOP.
"将目前位置数据以LINE的内容更新
*实例:
LINE-COL1 = 10.
MODIFY ITAB FROM LINE INDEX 3 TRANSPORTING COL1.
*将第三个元素的COL1字段更新为 10
删除Internal Table 的数据
*语法:
DELETE INDEX
*实例:
DELETE ITAB INDEX 4
*删除第四个数据
*加上删除条件:
DELETE [FROM TO ] [WHERE
*实例:
DELETE ITAB FROM 3 TO 10.
*删除第3至第10个数据