SAP ABAP 基础语法超详细

1.表声明

abap 复制代码
Tables: 表名[,表名].  声明多个表时可用逗号分隔

当你声明了一个数据表的同时,系统也同时自动生成了一个和数据表同名的结构,结构的变量集等于数据表里面的字段。

2.定义变量

abap 复制代码
Data: v1[(l)] [type t] [decimals d] [value 'xxx']. 

v1 是变量名。

(l) 是变量的长度。

t 是数据类型。

d 是小数位。

'xxx' 是缺省值。

如:data num(10) type p decimals 3 value '1.12'.

数据类型 描述 缺省长度 最大长度 可用字符 缺省值
C 字符型 1 65536 任意字符
N 数字文本 1 65536 0 ~ 9 0
D 日期 8(固定) - 0 ~ 9 00000000
T 时间 8(固定) - 0 ~ 9 000000
X 十六进制数 1 65536 0 ~ 9,A ~ F
数据类型 描述 缺省长度 最大长度 最大小数位 缺省值
I 整型 4(固定) - 0 0
P 十进制数 8 16 14 0
F 浮点型 8 8 15 0.1

3.常用算术操作符:

算术符 描述
+ 加法
- 减法
* 乘法
/ 除法
** 取幂
DIV 整除
MOD 取模

4.常用比较操作:

比较操作 描述
v1 = v2 等于
v1 <> v2 不等于
v1 > v2 大于
v1 < v2 小于
v1 >= v2 大于等于
v1 <= v2 小于等于
v1 between v2 and v3 在......之间
not v1 between v2 and v3 不在......之间

5.赋值语句

abap 复制代码
total = 10. 

mess = 'this is a test! '.

如果字符串中包括 ' 号,用 '' 进行付值,如:mess = 'this is a ''test''! '.

6.IF语句

abap 复制代码
if i = 2.

  write 'i 等于 2'.

[else.

  write 'i 不等于 2'. ]

endif.

7.CASE语句

abap 复制代码
case i.     类似于VFP中的DO CASE语句

   when 1. write 'i = 1'.

   when 2. write 'i = 2'.

   [when others. write 'i <> 1 and i <> 2'.]

endcase.

8.DO语句

abap 复制代码
do [n] times.  类似于VFP中的FOR语句

  [执行代码] 

enddo.

9.WHILE语句

abap 复制代码
while [条件].  类似于VFP中的DO WHILE语句

   [执行语句]

endwhile.

10.从数据库中取数据集

abap 复制代码
select * from 数据表 [where 条件].

   [操作语句]

endselect.

如:select * from t000 [where mandt < 200]. 

    write: / t000-mandt,t000-mtext. 

  endselect.

11.取出单行记录

abap 复制代码
select single * from 数据表 [where 条件].   注:仅取出符合条件的第一行记录

select single 字段 from 数据表 into 变量 [where 条件].

12.WRITE语句

abap 复制代码
write: [/][定位][数据1][,[定位] [数据2]]......

注意:[/] 为插入一行空行,注意单独write一个[/]和在其它数据之前加 [/] 的效果是不一样的,单独的write[/]在插入空行后光标定位在空行的下面,在其它数据前加[/]在插入空行后光标定位于所插的空行

13.ULINE语句

abap 复制代码
uline.      "在当前行下一行显示一直线。

uline n.    "在当前行第n列显示一直线。

uline /n.    "在当前行下一行第n列显示一直线。

uline 和 write  '|'  一起使用可实现画表格的功能。

14.SKIP语句

abap 复制代码
SKIP.       "光标跳到下一行。

SKIP n.     "光标跑到下n行。

SKIP to line n.  "光标跳到第n行。

15.定义常量

作用:定义一些不会改变的数据,如一年的月数、圆围率等。

abap 复制代码
语法:constants c1[( l )] [type t] [decimals d] value 'xxx'. 

或者:constants c1 like cv value 'xxx'. 

例如:constants pi type p value '3.14'.

16.定义结构

(1)基本结构

abap 复制代码
data: begin of 结构名, 

   f1[(l)] [type t] [decimals d] [value 'xxx'], 

   f2[(l)] [type t] [decimals d] [value 'xxx'], 
   ......

end of 结构名. 

(2)结构中包含另一结构

abap 复制代码
data: begin of 结构名, 

   f1[(l)] [type t] [decimals d] [value 'xxx'], 

   f2[(l)] [type t] [decimals d] [value 'xxx'], 

   f3 like 另一结构名,
   ......

end of 结构名. 

(3)定义结构的另一种写法:

abap 复制代码
data begin of 结构名. 

data f1[(l)] [type t] [decimals d] [value 'xxx']. 

data f2[(l)] [type t] [decimals d] [value 'xxx']. 

[include structure 另一个结构.] 

data end of 结构名.   

注:此种写法data后可以加冒号也可以不加

例如:

abap 复制代码
data:begin of person,

   educ(10) type c,

   train(10) type c,

end of person.

data:begin of employee,

   code(10) type c,

   name(10) type c,

   department(20) type c,

   address like person,  "person为另一个结构名

   ......

end of employee.

 

employee-code = '1001'.

employee-name = '张三'. 

employee-department = 'IT部'.

employee-person-educ = '本科'

employee-person-train = '工程师'

 

write: / employee-code,employee-name,employee-department,employee-person-educ.

write: / employee.

17.TYPES语句

将结构定义成数据类型,这样在程序中可以象定义一个变量那样简单地定义一个结构。语法同定义结构,只是把data换成types即可。如:

abap 复制代码
types: begin of employee,

   code(10) type c,                
   name(10) type c,

end of employee.

types: address(50) type c.

 

data: emp type employee.   "使用TYPES定义的结构类型

data: myadd type address.  "使用TYPES定义的变量类型

 

emp-code = '1001'.

emp-name = '张三'. 

myadd = 'this is a address'.

 

write: / emp.

write: / myadd.

18.LIKE语句

abap 复制代码
tables: t000.

data: p(20) type c.

data: p1 like t000.      " p1拥有了和t000相同的结构

data: p2 like t000-mandt.   " p2的定义等同于t000中mandt这个字段的定义

data: p3 like p.       "p3的定义和p相同,为20长度的字符串

data: t111 like t000 occurs 0 with header line.    "定义一个和t000一样的内表

19.输入参数

要让一个变量成为可输入的参数,只需在定义变量时把data改为parameters 即可。

abap 复制代码
parameters p1 like v1 ... 

  ... [default 'xxx'] [obligatory] [lower case]  

  [as checkbox] [radiobutton group g].
  • 使用DEFAULT后缀为参数指定缺省值。

  • 使用obligatory后缀来标识参数为必输项。

  • 输入参数默认会把输入的字符转为大写,如果要去掉该转换,使用lower case 后缀。

  • 使用as checkbox后缀使参数以复选框的形式出现。使用复选框的参数一定为长度为1的字符串,其内容只能为'X'或' ',如:

abap 复制代码
parameters:p1 as checkbox.

parameters:p2 as checkbox default 'X'.
  • 使用radiobutton group g后缀使输入参数以单选框的形式出现。使用单选框的参数一定为长度为1的字符串,其内容只能为'X'或' ',如:
abap 复制代码
parameters:p1 radiobutton group 1.

parameters:p2 radiobutton group 1.

parameters:p3 radiobutton group 2.

parameters:p4 radiobutton group 2 default 'X'.

20.分块语句

abap 复制代码
selection-screen begin of block 块名 with frame title [text-(titlename)].

parameters: v1(10) type c.

parameters: aa like t000-mandt. "将出现圆钮选择项,也可以自定义圆钮选择项

parameters: v2(10) type c matchcode object zhlp.

"这是自定义的圆钮选择项,在SE38中创建搜索帮助,zhlp为创建的搜索帮助名称

selection-screen end of block 块名.

selection-screen uline.  "在输入屏幕上画线

21.定义内表

内表的定义和结构很相似,所差别只是内表需要指定记录的条数。

abap 复制代码
data: begin of 内表名 occurs n, 

    f1[(l)] [type t] [decimals d] [value 'xxx'], 

    f2[(l)] [type t] [decimals d] [value 'xxx'], 

    ... 

end of 内表名. 
  • n为该内表的记录条数,不过当内表的记录数超过了该数值后,内表会自动的填大这个数目,定义该数值只是为了系统的效率考虑,如果n为0,则系统会在一开始就分配8KB的空间。

  • 内表同时也可以以已存在的数据表或结构进行定义,格式为:

abap 复制代码
data: 内表名 like [结构名或数据表名] occurs n.

"例如:(使用like语句通常需要加上with header line,否则没有表头)

data: it1 like st1 occurs 10.  "st1 为一结构

data: it2 like t000 occurs 0.  "t000 为一数据表

22. 往内表中添加记录

abap 复制代码
append 内表名.       "把表头的数据插入内表。

append 结构名 to 内表名. "把结构的数据插入内表,两者的结构必须一样。

23.用LOOP读取内表数据

abap 复制代码
loop at it [into wa] [from m] [to n] [where exp]. 

   Write: / it-字段1, it-字段2, ......

endloop. 
  • it 为内表名

  • wa 为结构名,如果不填,则读到表头。

  • m,n为开始和结束行,如果不填则为从第一条到最后条。

  • exp 为取记录的条件。

24.用READ读取内表数据

READ功能为读取内表的某条记录。

abap 复制代码
read table it [into wa] [index i | with key keyexp]
  • it为内表。

  • wa为将把数据读入的结构,如果没指定,则缺省为表头。

  • i 是要读取的记录编号,即第几条记录。

  • keyexp 是取记录的条件。如果合条件的记录有不止一行,则取第一行的记录。

  • 以系统参数 sy-subrc 是否为 0 判断读取是否成功,sy-subrc 为 0 则读取操作成功。

25.把数据库的记录读入内表

(1)逐条记录的读入内表

abap 复制代码
select * from t000.

append t000 to it.

endselect.

(2)把整批数据读入内表

abap 复制代码
select * from 数据表 into table 内表 [where *exp*]. "结构需要相同

select mandt mtext from t000 into table it where mandt > 100. "结构不同的情况

select mandt mtext from t000 appending table it. "在内表中追加记录

26.CLEAR清空表头和表记录

abap 复制代码
clear 内表.   "如果内表没有表头的话,该语句将会把内表的记录清空

clear 内表[ ].  "[ ]必须紧跟内表,且[ ]间不能有空格

27.DELETE删除内表记录

abap 复制代码
delete it (a) [index n]        "删除指定行记录

     	  (b) [from i] [to j]  "删除指定范围记录

          (c) [where exp]      "删除符合条件记录
  • it为内表名

  • n,i,j 为记录编号

  • exp 为搜索条件

28.REFRESH删除内表记录

abap 复制代码
refresh 内表.

该语句删除所有记录但保留表头,内表所占用的内存仍保留。

29.FREE删除内表记录

abap 复制代码
free 内表.

该语句删除所有记录但保留表头,内表所占用的内存也被释放。

30.在内表中插入记录

abap 复制代码
insert [wa into] it [index n].
  • wa 为结构。

  • it为内表。

  • n 为记录编号。

记录会插入到编号的位置,原来的记录则向下移一位。

31.修改内表记录

abap 复制代码
modify it [from wa] 

     [index n] 

     [transporting c1 c2 ... [where exp]] 
  • it 为内表

  • wa 为结构,缺省为使用表头

  • n 为记录编号

  • c1 c2 为内表中的字段,指明要更新哪些字段,缺省为全部更新

  • exp 为条件

32.对内表进行排序

abap 复制代码
sort it [by f1 [ascending|descending].
  • it 为内表

  • f1 为要排序的字段

  • ascending 升序排列(默认)

  • descending 降序排列

33.内表的控制语句

abap 复制代码
sum. "对内表中可计算字段进行合计,只能作用于LOOP中。

at first.   "当从内表中读取第一条记录的时候,会触发at first事件,At first 常用于画表头的作用,或者做表头的合计。

at last.   "和at first相反,at last是在读取最后一条记录的时候触发

at new of p1. "当一条记录指定字段的值和上一条记录的相应字段的值有改变时,触发该事件

at end of p1. "当一条记录指定字段的值和下一条记录的相应字段的值有改变时,触发该事件

on change of it-p1 [or it-p2 ......]. "当指定字段与上一条字段有所改变时,触发该事件,on change无分组合计的功能

34.循环跳转语句

abap 复制代码
exit. "用于跳出当前循环,当运行到exit时,将直接运行循环后面的代码,当exit在循环之外时,将直接结束程序的运行。

continue. "跳过循环下面的语句然后继续执行下一个循环。

check exp. "作用与continue相类似,但check有一个判断条件,仅判断条件不为真时,才执行跳过循环下面的语句然后继续执行下一个循环。

35.常用系统变量

abap 复制代码
sy-datum  "当前日期

sy-uzeit  "当前时间

sy-uname  "当前用户

sy-subrc  "当前操作返回值(0为成功)

sy-mandt  "当前的客户机

sy-tabix  "内表当前行的记录号

36.子程序的定义

abap 复制代码
form s [tables t1 t2 ...]

    [using u1 value(u2) ...]

    [changing c1 value(c2) ...]. 

    \--- 

endform. 
  • s 为子程序名。

  • t1、t2、u1、u2、c1、c2 为子程序的传递参数。

37.子程序的调用

abap 复制代码
perform s [tables t1 t2 ...] 

     [using u1 u2 ...] 

     [changing c1 c2 ...]. 
  • s 为子程序名。

  • t1、t2、u1、u2、c1、c2 为子程序的传递参数。

  • 可用一个perform同时调用几个子程序,子程序间用逗号分隔,如 perform s1,s2.

38.子程序的参数传递

(1)传递一个参数指针

变量存储于内存中的一块空间,变量指针为程序指出了内存的位置,传递变量指针将使子程序中的变量和作为参数的变量使用同一个存储区域,也就是说,子程序中的参数的内容变了,其相应的传递参数的内容也跟着一起改变

使用using v1changing v1 均为传递变量指针。

(2)传递一个变量值

和传递变量指针不同,传递变量值仅仅把变量的内容传给子程序,子程序中相应的变量存储于另外的内存空间,也就是说,子程序中变量的值改变了,其相应的传递参数的内容还是和原来一样

使用using value(v1) 为传递变量值。

(3)传递一个变量值并返回

传递一个变量值并返回把一个变量值传给子程序,在子程序运行结束时,把子程序中变量值的内容传给调用它的变量。与传递变量指针不同,原变量内容是在子程序运行完成之后才改变,在子程序运行过程序中保持不变

使用changing value(v1)传递一个变量值并返回。

(4)传递一个内表

内表同样可以作为一个变量进行传递,内表使用指针的模式进行传递。

使用tables it structure x tables it like x 传递内表,x为结构或表。

39.常用事件

(1)initialization事件

程序最开始发生的事件,可以进行初始数据的处理

abap 复制代码
REPORT z_temp.

tables:t001.

parameters:ch(50) type c.

initialization.  "该语句不能包含在selection-screen语句中

ch = 'this is a test for the initialization!'.

start-of-selection.

write:ch.

以上代码在程序运行开始就为变量ch进行付值,该事件在输入参数之前就已经发生。

(2)start-of-selection事件

在输入参数完成之后,运行该事件,在该事件中主要进行数据的处理

(3)end-of-selection事件

发生在start-of-selection之后的事件,在该事件中主要进行数据的输出显示

abap 复制代码
REPORT z_temp.

tables:t001.

data:ch(50) type c.

end-of-selection.

write:/ 'end-of-selection'.

start-of-selection.

write:/ 'start-of-selection'.

不管按什么顺序书写代码,start-of-selection里的代码一定会在end-of-selection之前处理。

(4)top-of-page事件

该事件主要处理表头的数据,在top-of-page中显示的内容一定会出现在每一页的开始

abap 复制代码
REPORT z_temp no standard page heading line-count 6(2).

start-of-selection.

do 100 times.

  write:/ 'this is a test!'.

enddo.

top-of-page.

  write:/ 'top-of-page'.

  uline.

(5)end-of-page事件

该事件主要处理表尾的数据,在end-of-page中显示的内容一定会出现在每一页的表尾,注意必须有定义页尾留空行数的时候才可显示该事件中显示的内容

abap 复制代码
REPORT z_temp no standard page heading line-count 6(2).

start-of-selection.

do 100 times.

  write:/ 'this is a test!'.

enddo.

end-of-page.

  uline.

  write:/ 'end-of-page'.

  write:/ 'end-of-page2'. 

40.跳出事件的方法

可以使用exit,check,stop事件跳过事件,在不同的事件中,以上的语句会有不同的表现。

在所有事件中:

  • check离开当前事件并继续进行下一个事件的处理。

  • stop离开当前事件并直接跳到end-of-selection事件。

在start-of-selection之前的事件:

  • Exit和check都离开当前事件继续处理下一个事件。

在start-of-selection之中及之后的事件:

  • Exit立即进行输出的显示。

  • Check离开当前事件并继续处理下一个事件。

41.补充

  • 查询内表有多少条记录:
abap 复制代码
describe table tmp_gongsi lines iReccount. 
  • 查询一个表的字段条件属于另一个内表字段值的记录:
abap 复制代码
select aa from 表2 into i_tab1.

select aa from 表1 into 临时表 for all entries in

i_tab1 where aa = i_tab1-aa.

concatenate 'aaa' 'bbb' into 'aaabbb'. "字符串相加

REUSE_ALV_GRID_DISPLAY "输出表格函数

"EQ LE GE CP BT NE LT GT NP NB"

42.常用函数

abap 复制代码
 sy-uzeit:获取系统时间。 
 sy-datum:获取系统日期。 
 shift string:左移字符串。长度减1。 
 concatenate:连接字符串。 
 split:拆分字符串。 
 search:查询字符串。 
 replace:替换字符串。 
 condense:删除多余的空格。 
 translate:转换字符格式,如将'ABC'转换为'abc' 
 convert text:创建一个可排序的字符串。 
 overlay:用一个字符串覆盖另一个字符串。 
 strlen:字符串长度。 
 abs:取绝对值。 
 cos、sin、tan:取三角函数值。 
 acos、asin、atan:反三角函数。 
 cosh、sinh、tanh:双曲函数。 
 exp:e的幂函数。 
 Log:底数为e的对数。 
 log10:底数为10的对数。 
 sqrt:平方根。 
 sign:返回参数符号。 
 trunc:返回参数的整数部分。 
 frac:输入参数的小数部分。 
 ceil:返回不小于参数的最小整数。 
 floor:返回不大于参数的最小整数。 
相关推荐
小九不懂SAP4 天前
SAP(PP生产制造)拆解工单业务处理
sap·制造·s4·pp
冰魄禾5 天前
SAP ABAP开发学习——BAPI
运维·开发语言·笔记·运维开发·sap·abap
syounger8 天前
是我们“辜负”了IBM、SAP么?
sap
Liquid UI9 天前
Amcor 如何借助 Liquid UI 实现SAP PM可靠性
ui·自动化·sap·制造
Lisson 315 天前
The ABAP program lines are wider than the internal table.
abap
数字化转型202519 天前
跨国SAP实施 - 美国 - 税法 - 咨询
sap
阿达_优阅达21 天前
优阅达携手 Theobald 亮相新加坡科技周,助力企业 SAP 数据集成与应用
科技·ai·sap·企业数字化转型·theobald
SAP Hua24 天前
SAP PP之功能 动态安全库存(Dynamic Safety stock)配置及计算逻辑说明测试
sap
数字化转型20251 个月前
Alternative Reconciliation Accounts 备选统驭科目
sap
小九不懂SAP2 个月前
6、定义字段状态变式
sap·s4