● 基础类型
.P
声明: TYPES mount TYPE p length 5 DECIMALS 2.
又称为压缩类型.
值范围1~15整型数字(除去最后的符号位).
若在没有定义长度的情况下,默认为最大长度,即15.
点号不算在表示位数内,但表示位数过长的情况下,点号会自动消除,如:12,345; 1234567,890,123
小数点可表示最大位数14.小数点部分按四舍五入法取值.
.DEC
DEC(13,2) 长度为13,其中2位小数位.
金额类型.
与类型P的转换公式为:P((n+1)/2) 即DEC(13,2) = P(7)
※注意DEC(14,2) = P(8) / DEC(15,2) = P(8)
与之相关的常用的domain有 DEC13(13位的小数点项目)
DECV13(13位的小数点项目(正负))
DEC15(15位的小数点项目)
DECV15(15位的小数点项目(正负))
金额加算等需要注意溢出(CX_SY_ARITHMETIC_OVERFLOW)
.F
浮动小数点数
可表示值范围1~31.如:1000000 ⇒ 1.0000000000000000E+06
用WRITE中的EXPONENT属性可以设定变量的指数,
如: f = 1000000. WRITE f EXPONENT 2.⇒10000.000000000000E+02
● 演算符
+ 加算
- 减算
* 乘算
/ 除算
DIV 整除
MOD 取模
** 乘方
Ø 负数取模(MOD)
例: 1 MOD 5 ⇒1 25 MOD 7 ⇒4
1 MOD -5 ⇒1 25 MOD -7 ⇒4
-1 MOD 5 ⇒4 -25 MOD 7 ⇒3
-1 MOD -5 ⇒4 -25 MOD -7⇒3
从上例可以得出以下的结论
① 取模结果只与除数符号有关,与被除数的符号无关
② 所谓的取模即为两数相除后得到的余数,所以取模结果为几的关键是相除后的商是多少.
上例可以看出取模运算的商是两数可除尽的最小整数值.如:25/7⇒3(余4) -25/7⇒-4(余3)
※可除尽的最小整数值的符号与除数符号一致(-25/-7⇒-4(余3))
③ 取模结果一般都为正数(取模结果 = | |商 * 被除数| - |除数| |)
④ ABAP的取模结果不代表数学上的取模结果,根据编译器的不同, 取模结果也可能不同
● 常用函数
例 5.55- (P)
abs(n) 绝对值 5.55
sign(n) 符号值 1.00-
ceil(n) >n的整数最小值 5.00-
floor(n) <n的整数最大值 6.00-
trunc(n) 取整数部 5.00-
frac(n) 取小数部 0.55-
strlen(str) 取文字列个数(unicode对应)
lines(arg) 取内表的行数
● 逻辑运算符
Ø 数值型(I 型、F 型、P 型)
= EQ
<> NE
< LT
> GT
<= LE
>= GE
Ø 文字型(C、D、N、T、STRING)
例:f1 逻辑式f2
含义 大小写区分 右侧的空格处理
CO 全包含(f1 ⊆ f2) 区分 处理
CN CO的相反 区分 处理
CA 至少包含一个文字(f1 ⊇ f2) 区分 无视
NA CA的相反 区分 无视
CS 包含(f1 ⊇ f2) 不区分 无视
NS CS的相反 不区分 无视
CP 与正规表达式匹配(f1 ⊆ f2) 不区分 无视
NP CP的相反 不区分 无视
※1.CO中要注意f1的右侧空格是作为一个文字来进行处理的,看下面的代码
DATA: str1(10) TYPE c VALUE 'abc',
str2(10) TYPE c VALUE 'abcdefghij'.
if str1 cp str2.
write '●'.
else.
write '×'.
endif.
运行结果为'×',原因就在于str1的右侧还包含了7个space,而str2中没有space字符。
2. CP中可以使用正则表达式,*,+,转意符#
● 数据处理
Ø 日期,时间处理
例:
² 取上个月的最后一天的日期
ultimo = sy-datum.
ultimo+6(2) = '01'.
ultimo = ultimo - 1.
² 取相隔时间差
DATA: t1 TYPE t VALUE '200000',
t2 TYPE t VALUE '020000'.
diff = t2 - t1.
seconds = diff MOD 86400.
hours = seconds / 3600.
Ø 字符串处理
² SHIFT
根据指定文字数向左向右移动,根据指定子字符串的值向左向右移动,删除指定子字符串的值等
² REPLACE
对字符串进行置换
² TRANSLATE
对字符串大小写转换及一些简单置换
² OVERLAY
将第一个字符串内容置换成相同位置的第二个字符串的内容
² Strlen()
计算字符串的长度(字符串的右space不算在字符串长度内)
² CONDENSE
去除space
² CONCATENATE
字符串连接
² SPLIT
字符串分割
² +OFFSET(LENGTH)
取子字符串
● 内表
Ø STANDARD TABLE
标准内表,通过索引对表进行访问,所属index table
Ø SORTED TABLE
所属index table。有索引。
可以设置主键,也可不设。
设置主键后,在行插入(insert)时,可根据主键自动排序。
(但在行追加(append)时,如果追加行的主键值大于内表中最后一条记录的主键值时,会有执行错误发生)
另外,在行检索(read itab from stru)时,可以根据stru中的主键值(主键值以外的项目值被无视)进行检索。
关于主键唯一性的设置 NON-UNIQUE:主键值不唯一/UNIQUE:主键唯一
Ø HASHED TABLE
哈希内表。
无索引。所以所有关于使用index操作表的语句都不可使用。
必须设置主键。
● 内表操作
Ø 行追加/插入
APPEND 单一/复数行追加。一般用于STANDARD TABLE的行追加。
INSERT 单一/复数行插入。一般用于SORTED TABLE的行插入。行插入时能根据主键自动按升序排列
COLLECT 单一行插入,若内表中已有相同主键的纪录,使主键以外的数值型项目相加后,合并。(所以要求COLLECT的操作对象内表中,除主键以外的项目必须是数值类型(i,p,f))。一般用于定义有主键的SORTED TABLE和HASHED TABLE的数值求和等
Ø 行更新
MODIFY 单一/复数行内容更新。更新语句一般有下述两种:
1. Modify table itab from wa
根据wa的主键值进行检索,更新。
所以不建议无主键的内表使用,如STANDARD TABLE。即便使用了,更新的内容也非预期所想的。一般情况下更新内表中的第一条数据。
更新时,若检索主键值存在的情况下,根据检索主键更新。若主键值不存在,则不进行更新,结果返回4
2. Modify itab index sy-tabix from wa
根据索引进行检索,更新。
HASHED TABLE因为没有索引,该语句不允许被使用。
SORTED TABLE虽然允许使用,但如果被更新纪录的主键已被修改的情况下
会发生执行错误。建议使用1.
在STANDARD TABLE中会无条件更新,当然前提是该索引存在的情况下。但
即使索引不存在,也不会发生指针溢出的情况。
Ø 行删除
DELETE 单一/复数行删除。
与MODIFY相似,可根据主键值以及索引进行删除。
可多条件删除,如:DELETE TABLE itab: FROM line,
WITH TABLE KEY col1 = 3.
在使用重复值删除(ADJACENT DUPLICATES FROM)的时候要注意,重复值指的是相临的几条数据之间的重复值比较,而非整个内表中的所有记录。所以在使用重复值删除时,最好先根据比较key排一下序。
Ø 表访问
READ 表读取。读取内表中符合检索条件的第一条记录。
LOOP AT 循环读取表纪录。
at new compN/at end of compN
含义:
-at new compN:在项目comp1~compN值变化的第一条数据时执行
-at end of compN:在项目comp1~compN拥有相同值的最后一条记录
时执行
要注意一下几点:
1. 关于语句at new compN,不是单单compN值变化时执行的,而是到compN
之前的任何一个项目的值发生变化时都会执行。
2.在at new compN~endat中,有时候不能正常的读取循环领域的值(*)。
3.关于GROUP求和(SUM). SUM一般在at end of compN/at last中被使
用。求和结果放在循环领域的同名项目中。SUM求和比较复杂,也不易操作,如同一内表需要对不同的GROUP进行求和的场合,由于1.的原因需要创建与该内表项目名相同但次序不同的多个结构。建议使用COLLECT。
Ø 排序等
SORT 按key值升/降排序
STABLE不破坏原有的顺序,在原有的顺序基础上排序