SAP ABAP 基础语法超详细_sap语法-程序员宅基地

技术标签: SAP  SAP ABAP  ABAP  

1.表声明

Tables: 表名[,表名].  声明多个表时可用逗号分隔

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

2.定义变量

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.赋值语句

total = 10. 

mess = 'this is a test! '.

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

6.IF语句

if i = 2.

  write 'i 等于 2'.

[else.

  write 'i 不等于 2'. ]

endif.

7.CASE语句

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语句

do [n] times.  类似于VFP中的FOR语句

  [执行代码] 

enddo.

9.WHILE语句

while [条件].  类似于VFP中的DO WHILE语句

   [执行语句]

endwhile.

10.从数据库中取数据集

select * from 数据表 [where 条件].

   [操作语句]

endselect.

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

    write: / t000-mandt,t000-mtext. 

  endselect.

11.取出单行记录

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

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

12.WRITE语句

write: [/][定位][数据1][,[定位] [数据2]]……

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

13.ULINE语句

uline.      "在当前行下一行显示一直线。

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

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

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

14.SKIP语句

SKIP.       "光标跳到下一行。

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

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

15.定义常量

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

语法:constants c1[( l )] [type t] [decimals d] value 'xxx'. 

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

例如:constants pi type p value ‘3.14’.

16.定义结构

(1)基本结构

data: begin of 结构名, 

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

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

end of 结构名. 

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

data: begin of 结构名, 

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

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

   f3 like 另一结构名,
   ……

end of 结构名. 

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

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后可以加冒号也可以不加

例如:

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即可。如:

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语句

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 即可。

parameters p1 like v1 ... 

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

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

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

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

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

parameters:p1 as checkbox.

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

parameters:p2 radiobutton group 1.

parameters:p3 radiobutton group 2.

parameters:p4 radiobutton group 2 default 'X'.

20.分块语句

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.定义内表

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

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的空间。

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

data: 内表名 like [结构名或数据表名] occurs n.

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

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

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

22. 往内表中添加记录

append 内表名.       "把表头的数据插入内表。

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

23.用LOOP读取内表数据

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功能为读取内表的某条记录。

read table it [into wa] [index i | with key keyexp]
  • it为内表。

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

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

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

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

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

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

select * from t000.

append t000 to it.

endselect.

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

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清空表头和表记录

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

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

27.DELETE删除内表记录

delete it (a) [index n]        "删除指定行记录

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

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

  • n,i,j 为记录编号

  • exp 为搜索条件

28.REFRESH删除内表记录

refresh 内表.

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

29.FREE删除内表记录

free 内表.

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

30.在内表中插入记录

insert [wa into] it [index n].
  • wa 为结构。

  • it为内表。

  • n 为记录编号。

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

31.修改内表记录

modify it [from wa] 

     [index n] 

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

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

  • n 为记录编号

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

  • exp 为条件

32.对内表进行排序

sort it [by f1 [ascending|descending].
  • it 为内表

  • f1 为要排序的字段

  • ascending 升序排列(默认)

  • descending 降序排列

33.内表的控制语句

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.循环跳转语句

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

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

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

35.常用系统变量

sy-datum  "当前日期

sy-uzeit  "当前时间

sy-uname  "当前用户

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

sy-mandt  "当前的客户机

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

36.子程序的定义

form s [tables t1 t2 ...]

    [using u1 value(u2) ...]

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

    \--- 

endform. 
  • s 为子程序名。

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

37.子程序的调用

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事件

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

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之后的事件,在该事件中主要进行数据的输出显示

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中显示的内容一定会出现在每一页的开始

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中显示的内容一定会出现在每一页的表尾,注意必须有定义页尾留空行数的时候才可显示该事件中显示的内容

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.补充

  • 查询内表有多少条记录:
describe table tmp_gongsi lines iReccount. 
  • 查询一个表的字段条件属于另一个内表字段值的记录:
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.常用函数

 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:返回不大于参数的最小整数。 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46370595/article/details/131955755

智能推荐

Linux 下清空Oracle监听日志_linux清理oracle监听日志-程序员宅基地

文章浏览阅读3.5k次。Linux 下清空Oracle监听日志_linux清理oracle监听日志

R语言RCurl爬虫(多线程爬虫)-高评分豆瓣图书_rcurl 批量获取url-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏22次。R语言爬虫-高评分图书(豆瓣)# R语言爬虫-高评分图书(豆瓣)本篇文章依然延续之前的爬虫类型文章,多次实操有助于对于代码的理解和技术的提升。此次爬取的是豆瓣上高评分的图书,每一次爬取都会给大家提供一份有价值、有意义的东西,每一次都有所提升,我是ERIC,希望喜欢这方面技术的或者对于发表的内容感兴趣都可以相互交流,共同提升。 (此篇爬虫数据采集后只进行了简单的可视化分析,未进..._rcurl 批量获取url

去掉txt文件内的换行符-程序员宅基地

文章浏览阅读5.8k次。在txt文件内,直接用^p来搜索换行符并不行,所以有时候面对很多行数字(如手机号)的时候,如果想去掉换行符,我就粘贴到word里,再替换。但是这样效率很慢,粘一万条手机号都要等很久,后来通过搜索找到一个好办法,把txt文件另存为html文件,里边的换行符就会删除掉,变成了空格,这时候我们只要把html文件里内容重新粘回txt文档,把空格替换掉就可以了,速度很快。转载于:https..._txt里有怎么消除

SpotMicro 12自由度四足机器人制作(两套方案)-程序员宅基地

文章浏览阅读4k次,点赞8次,收藏56次。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、方案确立二、使用步骤1.引入库2.读入数据总结前言老板想做个大号的四足,让我先做个小的练练手,两套方案均基于树莓派。一、方案确立大致情况如下方链接所示。前面的动态图是基于ROS-kinectic系统,后面的图是树莓派原生系统。二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as plti_spotmicro

【愚公系列】2023年07月 Python自动化办公之win32com操作excel-程序员宅基地

文章浏览阅读6k次。python中能操作Excel的库主要有以下9种:本文主要针对win32com读取 写入 修改 操作Excel进行详细介绍win32com是Python的一个模块,它提供了访问Windows平台上的COM组件和Microsoft Office应用程序的能力。通过该模块,Python程序可以与Windows平台上的其他应用程序交互,例如实现自动化任务、自动化报告生成等功能。_win32com

sql审核工具 oracle,Oracle SQL Developer工具-程序员宅基地

文章浏览阅读326次。Oracle SQL Developer工具下载解压了Oracle SQL Developer工具,运行时,启动不了,报错信息如下:---------------------------Unable to create an instance of the Java Virtual MachineLocated at path:\jdk\jre\bin\client\jvm.dll--------..._开源oracle sql审核工具

随便推点

NGN典型架构及主要支撑技术_ngn架构-程序员宅基地

文章浏览阅读3k次。1 NGN的定义及研究进展 如《NGN的产生》一文所述,NGN是一个宽泛的不断发展的概念,有自己的内在发展动力和发展方向,但没有清晰的边界。所谓的定义,是各研究机构基于当前的阶段性研究成果和认识,试图在这个研究领域和方向上划定一个适当的研究边界,以指导今后相当长一段时期的研究工作。 国际上研究NGN的主要的四个标准化组织是:国际电信联盟(ITU)、欧洲电信标准化组织_ngn架构

Hack the BTRSys1(Boot2Root Challenge)【VulnHub靶场】渗透测试实战系列1_welcome to the boot2root ctf, morpheus:1. you play-程序员宅基地

文章浏览阅读1.2k次。靶场下载地址:BTRSys: v1下载完毕之后直接导入到VMWare,看下设置了DHCP,那就在内网网段~~接着就打开内网的另外一台攻击机器Kali,首先搜集一下信息,Zenmap开始扫描,其实也就是nmap包装了一个UI界面。Okay,扫描结果出来了,看下图:主要提供了下面三个服务端口:vsftd,这个应该版本有点老,可以exploit一下,小本本记下来 ss..._welcome to the boot2root ctf, morpheus:1. you play trinity, trying to invest

antd date-picker 默认时间设置问题_a-date-picker 默认值-程序员宅基地

文章浏览阅读1.3w次,点赞7次,收藏8次。一.官网给出的例子<template> <div> <a-date-picker :default-value="moment('2015/01/01', dateFormat)" :format="dateFormat"/> <br /> <a-date-picker :default-value="moment('01/01/2015', dateFormatList[0])" :format="dateFormatList"/_a-date-picker 默认值

python已知两边求第三边_已知两边求第三边公式-程序员宅基地

文章浏览阅读2.4k次。各位家长好,我是家长无忧(jiazhang51.cn)专栏作者,七玥老师全文共计549字,建议阅读2分钟如果是三角形是直角三角形,了解两侧,可以用勾股定理求出第三边。如果是三角形是一般三角形(钝角、钝角三角形),那这一标准下只有求出第三边的范畴:两边之和超过第三边,两侧之差低于第三边。求边公式计算只了解两侧相同假如一个是底部一个是腰得话,这个是正三角形,第三边就等于腰。假如只了解等腰三角形腰长,那..._输入两边长度自动得出第三边长度 并排序

达梦数据库--学习总结-程序员宅基地

文章浏览阅读697次。达梦概述:1. 达梦:达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。2. 2019年新一代达梦数据库管理系DM8发布。(二)特点:1. 通用性:达梦数据库管理系统兼容多种硬件体系,可运行于X86、X64、SPARC、POWER等硬件体系之上。2. 高性能:支持列存储、数据压缩、物化视图等面向联机事务分析场景的优化选项。3. 高可用:可配置数据守护系统(主备),自动快速故障恢复,具有强大的容灾处理能力。_达梦数据库

神经网络(优化算法)_nnet-程序员宅基地

文章浏览阅读1.2w次。神经网络(优化算法)人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具,常用来对输入和输出间复杂的关系进行建模,或用来探索数据的模式。人工神经网络从以下四个方面去模拟人的智能行为:_nnet

推荐文章

热门文章

相关标签