SAP 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字符型165536任意字符
N数字文本1655360 ~ 90
D日期8(固定)-0 ~ 900000000
T时间8(固定)-0 ~ 9000000
X十六进制数1655360 ~ 9,A ~ F
数据类型描述缺省长度最大长度最大小数位缺省值
I整型4(固定)-00
P十进制数816140
F浮点型88150.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 ini_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:返回不大于参数的最小整数。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/13599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVASE】循环结构

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 循环 1. 循环结构1.1 while 循环1.2 bre…

自动驾驶小车

开发自动驾驶小车涉及多个方面&#xff0c;包括硬件和软件。下面是一般情况下开发自动驾驶小车的主要步骤&#xff1a; 确定需求和功能&#xff1a;明确您的自动驾驶小车的目标和应用场景&#xff0c;确定需要的功能和特性&#xff0c;例如感知、决策、控制等。 硬件选择和安…

招商银行秋招攻略和考试内容详解

招商银行秋招简介 招商银行是一家股份制商业银行&#xff0c;银行的服务理念已经深入人心&#xff0c;在社会竞争愈来愈烈的今天&#xff0c;招商银行的招牌无疑是个香饽饽&#xff0c;很多人也慕名而至&#xff0c;纷纷向招商银行投出了简历。那么秋招银行的秋招开始时间是多…

支持向量机(iris)

代码&#xff1a; import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn import svm import numpy as np# 定义每一列的属性 colnames [sepal-length, sepal-width, petal-length, petal-width, class] # 读取数据 iris pd.read_csv(data\\i…

Elasticsearch入门笔记(一)

环境搭建 Elasticsearch是搜索引擎&#xff0c;是常见的搜索工具之一。 Kibana 是一个开源的分析和可视化平台&#xff0c;旨在与 Elasticsearch 合作。Kibana 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员可以轻松地执行高级数据分析…

消息队列总结(4)- RabbitMQ Kafka RocketMQ高性能方案

1.RabbitMQ的高性能解决方案 1.1 发布确认机制 RabbitMQ提供了3种生产者发布确认的模式&#xff1a; 简单模式&#xff08;Simple Mode&#xff09;&#xff1a;生产者发送消息后&#xff0c;等待服务器确认消息已经被接收。这种模式下&#xff0c;生产者发送消息后会阻塞&am…

leetcode-647-回文子串

题意描述&#xff1a; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成…

论文笔记--Skip-Thought Vectors

论文笔记--Skip-Thought Vectors 1. 文章简介2. 文章概括3 文章重点技术3.1 Skip Thought Vectors3.2 词表拓展 4. 文章亮点5. 原文传送门6. References 1. 文章简介 标题&#xff1a;Skip-Thought Vectors作者&#xff1a;Ryan Kiros, Yukun Zhu, Ruslan Salakhutdinov, Rich…

JavaSE复盘2

Collection接口的接口对象集合&#xff08;单列集合&#xff09; List接口&#xff1a;元素按照先后有序保存&#xff0c;可重复 LinkList接口实现类&#xff0c;链表&#xff0c;随机访问&#xff0c;没有同步&#xff0c;线程不安全ArrayList接口实现类&#xff0c;数组&…

element时间选择器的默认值

概览&#xff1a;vue使用element组件&#xff0c;需要给时间选择器设置默认值&#xff0c;场景一&#xff1a;默认时间选择器&#xff0c;场景二&#xff1a;时间范围选择器&#xff0c;开始时间和结束时间。 一、默认时间选择器 实现思路&#xff1a; element组件的v-model绑…

“深入探究Spring Boot:从入门到精通“

标题&#xff1a;深入探究Spring Boot&#xff1a;从入门到精通 摘要&#xff1a;本文将介绍Spring Boot框架的基本概念和特点&#xff0c;以及详细讲解如何使用Spring Boot进行快速开发。通过深入学习Spring Boot的各个方面&#xff0c;读者将能够全面掌握这个强大的开发框架…

忘记安卓图案/密码锁如何解锁?

如何解锁Android手机图案锁&#xff1f;如何删除忘记的密码&#xff1f;Android 手机锁定后如何重置&#xff1f;这是许多智能手机用户在网上提出的几个问题。为了回答这些问题&#xff0c;我们想出了一些简单有效的方法来解锁任何设备而不丢失数据。 忘记手机密码可能会令人恐…

Git基础入门

git基础入门 Git是一款免费、开源的分布式 版本控制系统 &#xff0c;用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 git的安装 下载地址 注意&#xff1a; 不要安装在中文目录不要使用桌…

web服务器(Tomcat)

目录 一、web服务器 1. 常见web服务器 2. web服务器简介 二、 Apache Tomcat服务器 1. Tomcat服务器简介 2. Tomcat服务器基本使用 3. 启动tomcat常见问题 &#xff08;1&#xff09;启动tomcat控制台乱码 &#xff08;2&#xff09;启动tomcat闪退问题 &#xff08;…

DevOps系列文章 之 Springboot单元测试

在没有代码生成工具或尝试一门新的 ORM框架时&#xff0c;当我们希望不去另外写 Service 和 Controller 来验证 DAO 层的代码不希望只通过接口请求的方式来验证时&#xff0c;这时候单元测试的方式就可以帮助我们满足这一需求。 在我们开发Web应用时&#xff0c;经常会直接去观…

爬虫003_pycharm的安装以及使用_以及python脚本模版设置---python工作笔记021

这里我们用ide,pycharm来编码,看一看如何下载 这里我们下载这个社区办,这个是免费的,个人版是收费的 然后勾选以后 安装以后我们来创建一个项目 这里可以选择python的解释器,选择右边的... 这里我们找到我们自己安装的python解释器

Android Hook系统 Handler 消息实现

前言 主线程的Handler 主要依赖于 ActivityThread&#xff0c;Android是消息驱动&#xff0c;比如view的刷新&#xff0c;activity的创建等&#xff0c;如果能打印系统层Handler消息日志&#xff0c;就需要对于系统层的Handler 进行Hook 原理 ActivityThread中 mH对象主要负责…

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境4

7、使用串口工具 &#xff08;1&#xff09;连接硬件 连接 Type C 线&#xff0c; 一端电脑一端开发板 查看设备是否已经正确识别&#xff1a; 在 Windows 下可以打开设备管理器来查看 如果没有发现设备&#xff0c; 需要确认有没有装驱动以及接触是否良好 &#xff08;2&a…

【JVM】详解JVM的五大内存模型、可能出现的异常以及堆栈引用易错点

文章目录 1、堆(线程共享)2、方法区(线程共享)3、虚拟机栈&#xff08;线程私有&#xff09;4、本地方法栈(线程私有)5、程序计数器(线程私有)6、易错点 源自&#xff1a;深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践&#xff08;第3版&#xff09; 周志明 1、堆(线程…

C语言第十一课--------操作符的使用与分类-------基本操作

作者前言 作者介绍&#xff1a; 作者id&#xff1a;老秦包你会&#xff0c; 简单介绍&#xff1a; 喜欢学习C语言和python等编程语言&#xff0c;是一位爱分享的博主&#xff0c;有兴趣的小可爱可以来互讨 个人主页::小小页面 gitee页面:秦大大 一个爱分享的小博主 欢迎小可爱们…