ABAP基础-语法
2018-10-16 本文已影响24人
常威爆打来福
1 数据定义
1一般性类型
形参类型 | 兼容性检查规则 |
---|---|
无类型 或 TYPE ANY | 接受任意类型实参 |
TYPE C, N, P, X | 检查实参类型是否是C, N, P, X中的任意一种 |
TYPE TABLE | 检查实参是否为标准表,等价TYPE STANDARD TABLE |
TYPE ANY TABLE | 检查实参是否为内表 |
TYPE INDEX TABLE | 检查实参是否为索引表 |
TYPE STANDARD TABLE | 检查实参是否为标准表 |
TYPE SORTED TABLE | 检查实参是否为排序表 |
2 内置基本数据类型
数据类型 | 默认大小 | 有效大小 | 初始值 | 说明 | 示例 |
---|---|---|---|---|---|
C | 1 | 1-65535 | SPACE | 文本字符(串) | 'Name' |
N | 1 | 1-65535 | '00..0' | 数字文本 | '0123' |
T | 6 | 6 | '000000' | 事件(HHMMSS) | '123010' |
D | 8 | 8 | '00000000' | 日期(YYYYMMSS) | '20080808' |
I | 4 | 4 | 0 | 整型(整数) | 99 |
F | 8 | 8 | 0 | 浮点型 | 5E+04 |
P | 8 | 1 - 16 | 0 | 压缩型 | 12.91 |
X | 1 | 1-65535X | '0' | 十六进制 | '3A' |
String | 1 | 无限定 | SPACE | 字符串(长度可变) | 'A String' |
XString | 1 | 无限定 | SPACE | 十六进制字符串 | 'A3FF' |
- 固定长度的内置类型(八种)
- 字符型(C, N, T, D)
- 数字型(I, F, P)
- 十六进制类型(X)
- 长度可变的内置类型
- String可以看作是长度可变的C类型
- XString是长度可变的十六进制类型
- C,N,P,X需要声明时指定长度
- 如果声明一个数据对象时,不指明类型,默认为C类型
3 程序内部数据定义
- 自定义基本数据类型数据
在程序中根据内置类型自定义基本数据类型的语法格式:
TYPES type(len) TYPE type [DECIMALS dec] [VALUE] val.
在程序中根据内置类型声明基本类型数据对象的语法格式
DATA data(len) TYPE type [DECIMALS dec] [VALUE] val.
DECIMALS附加项只适用于指定P类型的小数位
参照自定义类型生成新数据语法
TYPES|DATA ... TYPE 1_type ...
TYPES|DATA ... LIKE dobj ...
参照自程序中已经声明的数据对象生成新数据语法格式。如果参照自定义类型类型仍然使用TYPE,如果参数程序中已经存在的数据对象生成新数据,则需使用LIKE。
上述语句中的1_type和dobj 分别代表程序内部类型和数据对象
REPORT z_calling_program.
TYPES t_name(10) TYPE c.
DATA:chinese_name(20) TYPE c,
f_name TYPE t_name VALUE 'Cheong',
l_name TYPE f_name VALUE 'Jack'.
chinese_name = 'Zhang Xue'.
WRITE: f_name, l_name, chinese_name.
- 引用类型和对象
语法格式:TYPES|DATA ... TYPE REF TO data.
- 结构类型和结构体
语法格式:
TYPES|DATA BEGIN OF structure.
k1 [TYPE type | LIKE dobj ] ...,
k2 [TYPE type | LIKE dobj ] ...,
...
kn [TYPE type | LIKE dobj ] ...,
END OF structure.
REPORT z_calling_program.
TYPES : spfli_type TYPE spfli,
surname(20) TYPE c,
BEGIN OF address,
name TYPE surname,
street(30) TYPE c,
city TYPE spfli_type-cityfrom,
END OF address.
DATA my_add TYPE address.
my_add-name = 'Zhang Ming'.
my_add-street = 'No. 10 Nanyang Ave'.
my_add-city = 'Singapore'.
WRITE / my_add.
创建结构体
如果在同一个程序中已经定义了结构体类型或者对象,或者数据字典中定义了结构,则可以使用TYPES和DATA语句的一般形式直接参照该结构生成新的结构体
TYPES|DATA structure TYPE str_type | LIKE str_dobj...
特别指出的时还可以参照数据字典中定义的数据库表结构声明结构体
TYPES|DATA structure TYPE dbtab.
- 表类型和内表
语法格式:TYPES|DATA table TYPE|LIKE tabkind OF linetype [WITH key] [INITIAL SIZE n].
4 程序中的数据对象
- 文字对象
文字对象占据程序内存,但没有名称,不需要进行声明即可直接在程序中尽心使用。文字分数字和字符两种。数字文字可以直接使用,而字符文字必须在其开始和结束时使用'
注明。
在字符文字中如果需要输出'
,则需要在前面多加一个'
转回原意。 - 有名称的数据对象
需要先进行声明才能使用。- variables
- constants
- text symbols
- interface work areas
- selection screen parameter
常量声明语法格式如下
CONSTANT const(len) TYPE type|LIKE dobj [DECIMALS dec] [VALUE val]
- 系统数据对象
由系统预定义的数据对象无需声明,可直接在程序运行中使用,e.g:系统日期SY-DATUM
,时间SY-UZEIT
- 确定数据对象属性
在程序的运行期间内,有时候需要查明数据对象的数据类型等属性,可以使用DESCRIBE
语句得到这些属性。
DESCRIBE FIELD dobj
[TYPE typ [COMPONENTS com]]
[LENGTH ilen IN {BYTE|CHARACTER} MODE]
[DECIMALS dec]
[OUTPUT-LENGTH olen]
[HELP-ID hlp]
[EDIT MASK mask].
其中:
- LENGTH 确定数据对象的类型
- TYPE确定数据对象的类型
- OUTPUT-LENGTH确定输出长度,各种不同数据对象的实际输出长度
- DECIMALS 确定P类型数据对象的小数长度
- EDIT MASK确定在数据词典中定义转换例程
- HELP-ID确定在数据词典中定义的F1帮助信息
REPORT z_describe_attribute.
DATA: text(8) TYPE c VALUE 'abcdefg'.
DESCRIBE FIELD text LENGTH DATA(len) IN CHARACTER MODE.
WRITE : text , 'has length', len.
确定运行时数据对象属性
2 基本数据操作
1 数据赋值
- MOVE语句
MOVE source TO destination.
destination = source.
这两种形式是完全等价的。
REPORT z_data_manipulation.
DATA: source(7) TYPE c VALUE 'Stephen',
destination(7) TYPE c VALUE 'Yang'.
MOVE source TO destination.
WRITE: source , destination.
source = 'Yang'.
destination = source.
WRITE: source , destination.
MOVE语句
- 结构体赋值
结构相似的结构体(即可进行类型转换的结构体)之间也可以进行赋值
TYPES: BEGIN OF structure,
...
END OF structure.
DATA: struct1 TYPE structure,
struct2 TYPE structure.
...
struct2 = struct1.
两个结构相同的结构体数据进行赋值操作,把原对象所有组件的值整体拷贝到目标结构体;如果两个结构体组件结构并不完全相同,只有部分组件由对应关系,此时若整体赋值,则没有意义;可以逐个组件进行赋值,也可以使用MOVE-CORRESPONDING
语句在两个结构体中的所有同名组件间赋值,而木匾结构体中其他字段值不变。语法格式与MOVE语句相似:
MOVE-CORRESPONDING source_struct TO destination_struct.
REPORT z_data_manipulation.
DATA: BEGIN OF add_personel,
title(5) VALUE 'Mr',
name(20),
street(20),
no(3) TYPE n,
postcode(6) TYPE n,
END OF add_personel.
DATA: BEGIN OF add_company,
position(20) VALUE 'Consultant',
name(20) VALUE 'Jack Huang',
street(20) TYPE c VALUE 'Beijing Avenue',
no(3) TYPE n VALUE '002',
postcode(6) TYPE n VALUE '100875',
END OF add_company.
MOVE-CORRESPONDING add_company TO add_personel.
WRITE add_personel.
MOCE-CORRESPONDING操作
- 设定初始值
使用CLEAR语句可以将已经赋值的变量值清空,回复初始状态。这里所说的初始值意为ABAP中各类型默认的‘空"值,并不是指VALUE附加项所指定的初始值。CLEAR f
2 类型转换
- 基本类型对象转换原则
基本类型间除去类型D和T之间不存在转换规则,因而无法进行类型转换之外,其他类型之间都有对应的转换规则。
REPORT z_data_manipulation.
DATA: char(10) TYPE c VALUE '-X1Y2Z3.A4',
numc(10) TYPE n,
time TYPE t VALUE '010001',
int TYPE i.
numc = char. int = time.
WRITE : / char , / numc , / time , / int.
基本类型对象转换
- 引用类型对象转换原则
对象引用和数据引用变量之间不能相互赋值 - 结构体转换原则
需要确定目标对象是扁平结构还是纵深结构,如果是纵深结构,则要求原对象和目标之间完全兼容,因为纵深类型之间赋值时不存在任何类型转换规则;对于扁平结构,可以在互不兼容的结构体之间赋值。 - 内表转换原则
内表只能赋值给其他内表对象,能否赋值成功取决于二者的行结构是否可以兼容,与表类型或者表关键字无关。
3 数值运算
- 算术运算
运算 | 数学表达式 | 关键字语句 |
---|---|---|
加法 | n = x + y. | ADD y to x |
减法 | n = x - y. | SUBTRACT y FROM x |
乘法 | n = x * y. | MULTIPLY x BY y |
除法 | n = x / y. | DIVIDE x BY y |
整除 | n = x DIV y. | 无 |
取余 | n = x MOD y. | 无 |
幂(乘方) | n = x ** y. | 无 |
说明:
1.如果将几种数学表达式组合在一起,优先级依次为括号内的运算,函数,乘方,算术乘除,最后是加减运算。对于同优先级的运算符从左到右依此进行,而乘方运算例外,是从右到左进行。
2.使用数学表达式时,运算符+,-,,/,*,以及括号都是ABAP关键字,前后均必须有空格。
- 数学函数
数学函数分两类,一类函数的参数类型是任意的,运算期间类型取决于参数类型;另一类函数的值总为浮点型,运算时其他类型数据被系统预先转化为浮点型。
1 任意类型参数的函数列表
函数名 | 说明 |
---|---|
ABS | 返回输入参数的绝对值 |
SIGN | 返回输入参数符号:正数返回1,0返回0,负数返回-1 |
TRUNC | 返回输入参数的整数部分 |
FRAC | 返回输入参数的小数部分 |
CEIL | 返回不小于输入参数的最小整数值 |
FLOOR | 返回不大于输入参数的最小整数值 |
REPORT z_data_manipulation.
DATA: result(20) TYPE c,
float TYPE f VALUE '2.5E00'.
result = trunc( float ).
WRITE result.
数学函数
2 F类型参数的函数列表
函数名 | 说明 |
---|---|
COS, SIN, TAN | 三角函数 |
ACOS, ASIN, ATAN | 反三角函数 |
COSH, SINH, TANH | 双曲函数 |
EXP | 底数为e的幂函数 |
LOG | 底数为e的自然对数 |
LOG10 | 底数为10的对数 |
SQRT | 平方根 |
- 时间日期运算
系统会自动根据这两种特定的数据类型进行合理的增减。例如,日期20041231加1,得到的结果应该时20050101,而不会是20041232,对于时间也是如此,结果是其秒数的差异。
REPORT z_data_manipulation.
DATA: seconds TYPE i,
hours TYPE i,
time1 TYPE t VALUE '100000', "10:00:00 AM"
time2 TYPE t VALUE '080000'. "08:00:00 AM"
seconds = time1 - time2.
hours = seconds / 3600.
WRITE : / 'Seconds between time1 and time2:', seconds,
/ 'Hours between time1 and time2:', hours.
时间运算
4 数据输出
- 基本输出格式
数据输出及其格式化的相关语句由WRITE, ULINE, FORMAT, SKIP等,其中最主要的是WRITE语句。
数据类型 | 输出长度 | 对齐方式 |
---|---|---|
C | 字段长(定义长度) | 左对齐 |
N | 字段长 | 左对齐 |
T | 6 | 左对齐 |
D | 8 | 左对齐 |
X | 2 * 字段长 | 左对齐 |
F | 22 | 右对齐 |
I | 11 | 右对齐 |
P | 2 * 字段长(+1个小数位) | 右对齐 |
- 格式化输出
语法格式WRITE ... f <format_options>.
其中格式化选项<format_options>与field的具体数据类型有关,有关选项只能应用于特定的类型。
选项 | 应用类型 | 说明 |
---|---|---|
LIFT-JUSTIFIED | 所有类型 | 输出左对齐,调整字段对齐方式 |
GENTERED | 所有类型 | 输出剧中,调整字段对齐方式 |
RIGHT-JUSTIFIED | 所有类型 | 输出右对齐,调整字段对齐方式 |
UNDER g | 所有类型 | 输出直接开始于字段g |
NO-GAP | 所有类型 | 忽略输出时字段后的一位空格 |
USING EDIT MASK m | 所有类型 | 指定数据字典中定义的格式模板 |
USING NO EDIT MASK | 所有类型 | 撤销对格式模板的激活 |
NO-ZERO | 所有类型 | 用空格替换字段中的0,C和N类型,还将替代前导0 |
NO-SING | 数值类型 | 不输出前导符号 |
DECIMALS d | 数值类型 | 输出d定义小数点后的数字位数,如需截断,则四舍五入 |
EXPONENT e | 数值类型 | 对F类型字段在e>定义幂指数 |
ROUND r | 数值类型 | 用10的负r次方乘p类型字段,然后取整 |
CURRENCY c | 数值类型 | 按系统表格TCURX中定义的格式将货币c格式化 |
DD/MM/YY or MM/DD/YY | 时间日期类型 | 格式调整,'/'为用户主记录中定义的分隔符 |
DD/MM/YYYY or MM/DD/YYYY | 时间日期类型 | 格式调整,'/'为用户主记录中定义的分隔符 |
DDMMYY or MMDDYY or YYMMDD | 时间日期类型 | 格式调整,无分隔符 |
REPORT z_data_manipulation.
DATA : g(5) TYPE c VALUE 'Hello',
f(5) TYPE c VALUE 'ABAP'.
WRITE : g , f.
WRITE: /11 g,
/ f UNDER g,
/ f UNDER g RIGHT-JUSTIFIED.
WRITE: / g NO-GAP, f.
数据格式化
5 逻辑表达式
- 通用逻辑运算符
运算符 | 意义 |
---|---|
EQ或= | 等于 |
NE或<>或>< | 不等于 |
LT或< | 小于 |
LE或<= | 小于等于 |
GT或> | 大于 |
GE或>= | 大于等于 |
- 字符类型操作符
用于判断两个字符型操作数之间的种种包含关系是否成立,比较结束后,返回逻辑值。 - IS操作符
用于检查数据对象是否处于初始状态或者字段符号,参数等是否已经被分配。- 使用IS INITIAL,检查字段是否为初始值
... f IS INITIAL ...
- 使用IS ASSIGNED,检查字段符号是否被分配
... fs IS ASSIGNED ...
- 使用IS [SUPPLIED|REQUESTED],检查参数是否被实参填充
... p IS [SUPPLIED|REQUESTED]
- 使用IS INITIAL,检查字段是否为初始值
- BETWEEN操作符
BETWEEN操作符用于检查数据对象的值是否属于特定范围
... f1 BETWEEN f2 AND f3 ...
- IN操作符
IN操作符用于检查一个数据对象的内容是否遵循从某个选择表的逻辑条件... f IN seltab ...
选择表是一种内表,每一行中都包含一个特定的逻辑条件,可以看作是多个逻辑表达式组合,选择表有两种生成方式,分别是带有RANGE OF类型构建符的DATA语句:DATA seltab LIKE RANGE OF f.
或者RANGES语句生成SELECT-OPTIONS seltab FOR f.
- 组合逻辑表达式
- AND 与
- OR 或
- NOT 非
3 结构控制
1.分支控制
- IF/ENDIF结构
语法格式:
IF <condition1>.
<statement block>
ELSEIF <condition2>.
<statement block>
ELSEIF <condition3>.
<statement block>
...
ELSE.
<statement block>
ENDIF.
REPORT z_data_manipulation.
IF sy-uzeit < 120000.
WRITE / 'Good Morning!'.
IF sy-uzeit < 060000.
WRITE / 'You are very early.'.
ENDIF.
ELSEIF sy-uzeit < 180000.
WRITE / 'Good Afternoon'.
ELSE.
WRITE / 'Good Evening'.
ENDIF.
IF/ENDIF
- CASE/ENDCASE结构
语法格式:
CASE f.
WHEN f11 [OR f12 OR ...].
<statement block>
WHEN f21 [OR f22 OR ...].
<statement block>
WHEN ...
...
WHEN OTHERS.
<statement block>
ENDCASE.
REPORT z_data_manipulation.
CASE sy-datum+4(2).
WHEN '12' OR '01' OR '02'.
WRITE / 'The season now is winter'.
WHEN '03' OR '04' OR '05'.
WRITE / 'The season now is Spring'.
WHEN '06' OR '07' OR '08'.
WRITE / 'The season now is Summer'.
WHEN '09' OR '10' OR '11'.
WRITE / sy-datum.
WRITE / sy-datum+5.
WRITE / sy-datum+3(2).
WRITE / 'The season now is Autumn'.
WHEN OTHERS.
WRITE 'This is illegal data'.
ENDCASE.
CASE
2.循环控制
- 无条件循环
在执行内部语句块前不需要任何逻辑判断的循环,在ABAP中使用DO语句实现。
DO [n TIMES].
<statement block>
ENDDO.
n用于控制循环次数,他可以是文字或变量。如果是0或负数,系统不进入死循环;如果没有限定n值,则必须用EXIT, STOP或REJECT等语句强制结束循环,否则将进入死循环。在循环过程中,系统字段SY-INDEX中包含已处理过的循环数值。DO循环可以嵌套,SY-INDEX则一直为当前循环次数索引。
REPORT z_data_manipulation.
DATA: outer_index TYPE i,
inner_index TYPE i.
DO 2 TIMES.
outer_index = sy-index.
WRITE sy-index.
SKIP.
DO 3 TIMES.
inner_index = sy-index.
WRITE: outer_index NO-GAP ,'-' NO-GAP,
inner_index LEFT-JUSTIFIED.
ENDDO.
SKIP.
ENDDO.
无条件循环
- 条件循环
WHILE <condition>
<statement block>
ENDWHILE
REPORT z_data_manipulation.
DATA: len TYPE i,
string(30) TYPE c VALUE 'Beijing 2008'.
WHILE string NE space.
len = sy-index.
SHIFT string.
WRITE: / len.
WRITE: / string.
ENDWHILE.
WRITE: / 'Length of string:', len.
无条件循环
- 循环的终止
- CONTINUE,结束本次循环
- CHECK,结束当前循环,继续后面的语句
- EXIT,立即退出
REPORT z_data_manipulation.
DO 4 TIMES.
IF sy-index = 2 . CONTINUE. ENDIF.
WRITE sy-index.
ENDDO.
SKIP.
DO 4 TIMES.
CHECK sy-index BETWEEN 2 AND 3.
WRITE sy-index.
ENDDO.
SKIP.
DO 4 TIMES.
IF sy-index = 3.EXIT . ENDIF.
WRITE sy-index.
ENDDO.
SKIP.
循环的终止