3. ABAP基础
3.1 数据定义
3.1.1 数据类型
定义数据需要指定其数据类型。数据类型有预定义数据类型和自定义数据类型之分。预定义数据类型的名称是固定的。用户定义的数据类型的名称由用户在程序中指定。ABAP/4 中预定义的数据类型如下表所示。
3.1.2 变量定义
DATA语法: DATA
实例:
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
实例:
DATA: BEGIN OF ADDRESS, *定义数组变量ADDRESS
NAME(10) TYPE C ,
NUMBER TYPE P,
END OF ADDRESS.
使用时用字段变量加上组件名称, 如 ADDRESS-NAME。
3.1.3 常量定义
常数定义使用 CONSTANTS 指令, 如定义 PI 是一个有5位小数的数值 3.14159 .
实例:
CONSTANTS PI TYPE P DECIMALS 5 VALUE ‘3.14159’.
3.1.4 系统定义的数据
SPACE空白字符串
SY-SUBRC系统执行返回值,0表示执行成功
SY-UNAME登陆帐号名称
SY-DATUM系统日期
SY-UZEIT系统时间
SY-TCODE目前的事务代码
3.1.5 指令
1TYPE指令
TYPE用来指定数据类型。
实例:
DATA: NAME(10) TYPE C.
TYPES: NUMBER TYPE I.
2TYPES指令
TYPES用来自定义数据类型。
实例:
TYPES:BEGIN OF MYLIST,
NAME(10) TYPE C,
NUMBER TYPE I,
END OF MYLIST.
3LIKE指令
LIKE也用来指定数据类型,使用格式与TYPE相同,LIKE与TYPE的区别是LIKE 用在已有值的数据项, 如系统变量, 而TYPE叙述则是用在指定数据类型。
实例:
DATA: MYDATA LIKE SY-DATUM.
4STATICS指令
STATICS用来定义变量,使用格式与DATA相同。与DATA的区别是STATICS只能在子程序中使用,用STATICS定义的变量可以在退出子程序后保留局部数据对象的值,而DATA不能。
语法: STATICS
实例:
FORM DATATEST2.
STATICS A(20) TYPE C .
A = 'AAA'.
WRITE: / A.
ENDFORM.
5TABLES指令
TABLES 语句用来创建称为表工作区的数据对象。表工作区是参考 ABAP/4 词典对象的字段串。语法:TABLES
实例:
TABLES: EBAN.
3.2.1 赋值
语法: MOVE
将F1的值存至变数 F2 中, 也可写成 F2 = F1
实例:
M_NAME = 'CHER'.
3.2.2 截取字符串赋值
语法: MOVE
实例:
DATA: F1(10) TYPE C VALUE 'ABCDEFGHIJ'.
F2(5) TYPE C.
F2 = F1+3(5). *自第4个位置开始取出5个字符
F2 的内容会变成 DEFGH
3.2.3 数组值的复制
语法: MOVE –CORRESPONDING
将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 则不变。
3.2.4 变量 CALL BY VALUE 的使用
在变量的使用上, 可以使用类似Call By Value 的方法
语法: WRITE (
实例:
DATA: NAME(20) TYPE C VALUE 'SOURCE',
SOURCE(10) TYPE C VALUE 'LILY',
TARGET(10) TYPE C.
WRITE (NAME) TO TARGET.
WRITE / TARGET.
执行结果: LILY
3.2.5 清除变量内容
语法: CLEAR
清除变量现在内容
实例:
DATA N TYPE I VALUE 100.
CLEAR N.
变量 N 的内容变成 0
3.2.6 算术符号
1 ** 乘幂
2 * 乘
3 / 除
4 + 加
5 - 减
6 DIV 整数除法
7 MOD 余数除法
3.2.7 数值函数
1ABS(N): 取数值 N 的绝对值
2SIGN(N): 1 if N > 0
0 if N = 0
-1 if N < 0
3CEIL(N): 传回大于数值N的最小整数
实例:
DATA:INT1 TYPE I,
INT2 TYPE I.
INT1 = CEIL('-5.65').
WRITE:INT1. 输出结果:5-
INT2 = CEIL('4.54').
WRITE:INT2. 输出结果:5
4FLOOR(N): 传回小于数值N的最大整数
实例:
DATA:INT1 TYPE I,
INT2 TYPE I.
INT1 = FLOOR('-5.65').
WRITE:INT1. 输出结果:6-
INT2 = FLOOR('4.54').
WRITE:INT2. 输出结果:4
5TRUNC(N): 传回数值N的整数部分
实例:
DATA: INTI TYPE I.
INTI = TRUNC('5.65').
WRITE INTI. 输出结果: 5
6FRAC(N): 传回数值 N 的小数部分
实例:
DATA: MYF TYPE F.
MYF = FRAC('5.65').
WRITE MYF. 输出结果: 0.65
7COS(A),SIN(A),TAN(A): 传回三角函数 cos A, sin A, tan A 的值, A 为弪度量
8EXP(N): 传回 e^N 值
9LOG(N): 传回 log eN 值
LOG10(N): 传回 log N值
10SQRT(N): 传回 N 的平方根值
1日期数据的运算
日期数据可以直接运算, 如加法与减法的运算
实例:
DATA: Mdata TYPE D.
Mdate = SY-DATUM. *如传回 19971015
Mdate = Mdate + 1. *Mdate 变成 19971016
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. *计算几分钟
3.2.9 字符串数据处理
1字符串移位
语法: SHIFT
[BY
[
(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
将字符串
实例:
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
TRANSLATE
4在字符串中寻找部分字符串
语法: SEARCH
从字符串
执行结果存至两个变数, 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
实例:
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
实例:
data: str0(10) type c.
str0 = 'abc sde'.
condense str0 no-gaps.
write:/ str0.
执行结果:abcsde
在ABAP/4中要自屏幕输入变量的内容, 使用的命令是 PARAMETERS 及 SELECTION-OPTIONS:
1. PARAMETER: 输入一个变量或字段内容
2. SELECTION-OPTIONS: 使用条件筛选画面来输入数据
3.3.1 PARAMETERS 指令
语法:
PARAMETERS
[DEFAULT
实例:
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
实例:
PARAMETERS: BOY RADIOBUTTON GROUP SEX DEFAULT ‘X’,
GIRL RADIOBUTTON GROUP SEX.
执行結果:
3.3.2 SELECTION-OPTIONS
语法:
SELECT-OPTIONS
[DEFAULT
[NO-EXTENSION]
[NO INTERVALS]
[LOWER CASE]
[OBLIGATORY]
实例:
TABLES SPFLI.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID. *将条件的输入值存放入 AIRLINE, 筛选对象为SPFLI中的CONNID栏位。
执行結果:
DEFAULT
实例:
SELECTION-OPTION AIRLINE FOR SPFLI-CONNID
DEFAULT '2042' TO '4555'.
NO-EXTENSION:设定不要多值输入画面
NO INTERVALS:设定不要区间范围输入画面
LOWER CASE:输入转换成大写OBLIGATORY:强制要求输入
图29
图30
图31
图
32
3.3.3 配合 SELECT 命令
条件输入完后要将符合条件的数据筛选出来, 可配合使用 SELECT 指令
1使用WHERE <条件式>
实例:
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI WHERE CONNID IN AIRLINE.
WRITE: / SPFLI-CONNID,SPFLI-FROMCITY,SPFLI-TOCITY.
ENDSELECT.
2使用CHECK参数
实例:
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI.
CHECK AIRLINE.
WRITE: / SPFLI-CONNID,SPFLI-FROMCITY,SPFLI-TOCITY.
ENDSELECT.
3使用 IF … IN 叙述
实例:
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI.
IF SPFLI-CONNID IN AIRLINE.
WRITE: / SPFLI-CONNID,SPFLI-FROMCITY,SPFLI-TOCITY.
ENDIF
ENDSELECT.
3.3.4 SELECTION-SCREEN
1产生空白列
语法: SELECTION-SCREEN SKIP [
Example:
SELECTION-SCREEN SKIP 2.
产生两列空白行
2产生底线
语法: SELECTION-SCREEN ULINE /
Example:
SELECTION-SCREEN ULINE / 10(30).
自第10格开始产生长度30的底线
3印出备注说明
语法: SELECTION-SCREEN COMMENT /
Example:
REMARK = ‘Pls enter your name’.
SELECTION-SCREEN COMMENT /10(30) REMARK.
4同一行中输入数个数据项
语法: SELECTION-SCREEN BEGIN OF LINE.
……
SELECTION-SCREEN END OF LINE.
实例:
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 20.
PARAMETERS NAME(10) TYPE C.
SELECTION-SCREEN POSITION 40.
PARAMETERS BIRTH TYPE D.
SELECTION-SCREEN END OF LINE.
在20格输入NAME内容, 40格输入 BIRTH的内容
5绘出BLOCK PANEL
语法:
SELECTION-SCREEN BEGIN OF BLOCK
……
SELECTION-SCREEN END OF BLOCK
实例:
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
SELECTION-SCREEN SKIP 1. *空一行
PARAMETERS: P_WERKS LIKE EBAN-WERKS OBLIGATORY.
SELECT-OPTIONS:
S_MATNR FOR EKPO-MATNR, "物料号码
S_MATKL FOR EBAN-MATKL. "物料组
SELECTION-SCREEN END OF BLOCK B1.
执行结果:
图33
3.4 屏幕输出指令
3.4.1 Write 指令
1ABAP/4 用来在屏幕上输出数据的指令是 Write 指令
语法: Write 资料项
资料项可以是常数或变量。
实例:
WRITE 'This is sample'.
WRITE: 'COMPANY:',STFL-CARRID.
2指定屏幕位置显示
语法: Write AT [/] [
/ : 先往下一列
pos : 屏幕X轴坐标
(len): 显示资料的长度
实例:
WRITE 'First Line '.
WRITE / 6 'Second Line'.
输出结果:
First Line
Second Line
DATA: NUMBER TYPE I VALUE '1234567890'.
TEXT(10) TYPE C VALUE 'ABCDEFGHIJ'.
WRITE: (5) NUMBER, /(6) TEXT.
输出结果:
*7890
ABCDEF
3指定显示格式
语法: WRITE 资料项 <显示格式参数>
显示格式参数:
LEFT-JUSTIFIED 资料靠左显示
CENTERED 资料靠中间显示
RIGHT-JUSTIFIED 资料靠右显示
UNDER
NO-GAP 紧接着显示, 不留空格
USING EDIT MASK
USING NO EDIT MASK 不使用内嵌字符
NO-ZERO 数字前面0 的部分不显示
NO-SIGN 不显示正负号
DECIMALS
EXPONENT
ROUND
CURRENCY
DD/MM/YY 日期显示格式
MM/DD/YY
DD/MM/YYYY
MM/DD/YYYY
DDMMYY
MMDDYY
YYMMDD
实例:
DATA: X TYPE I VALUE '112030',
A(5) TYPE C VALUE ’ABCDE’.
WRITE X USING EDIT MASK ‘__:__:__’.
输出结果为 11:20:30
WRITE X USING EDIT MASK '$___,___'.
输出结果为 $112,030
3.4.2 产生空白列
1产生 n 个空白行
语法: SKIP [
实例:
WRITE 'PASS1'.
SKIP 1.
WRITE 'PASS2'.
执行结果:
PASS1
PASS2
2跳至指定行坐标
将坐标跳至指定的Y轴列坐标
语法: SKIP TO LINE [
实例:
SKIP TO LINE 5.
WRITE ‘PASS1’.
3.4.3 显示图示
可以显示R/3 系统所提供的符号或图标
语法: WRITE
WRITE
实例:
INCLUDE
INCLUDE
WRITE: / ‘Phone Symbol:’ , SYM_PHONE AS SYMBOL.
WRITE: / ‘Alarm Icon:’ , ICON_ALARM AS ICON.
执行结果:
要查看系统所提供有那些符号及图标, 可选择 “编辑” 下的 “模式”, 选择“WRITE”接下来选择要查的群组。
3.4.4 显示 CHECK BOX 资料
语法:
WRITE <资料项> AS CHECKBOX.
实例:
DATA: FLAG1 VALUE ' ',
FLAG2 VALUE 'X'.
WRITE: / 'CHECK FLAG 1:' , FLAG1 AS CHECKBOX.
WRITE: / 'CHECK FLAG 2:' , FLAG2 AS CHECKBOX.
执行结果:
3.4.5 输出横线
语法:
ULINE [AT] [
int1:为输出横线的起始位置
int2:为输出横线的长度
int1与int2为变量时必须有[AT]参数,是常数时可以不写[AT]
实例:
ULINE 10(20). *从第10位置开始输出一条长度为20的横线
实例:
DATA:INT1 TYPE I VALUE '20'.
DATA:INT2 TYPE I VALUE '100'.
ULINE AT INT1(INT2). *根据int1与int2的值,从位置20输出一条长度为100的横线