还有,这个章节实在太长,我只能写个标题,定期整理和更新内容了。这个靠自己整理,我也想复制粘贴啊
先上个基本语法,登录sapGUI,在命令栏输入SE38
输入程序名,点击新建,选择本地对象
注意:所有abap对象新建后保存,都会弹出下面对话框,测试的时候可以选择本地对象,非测试的程序需要选择类、传输TR等用于传输到测试、生产系统的对象。后面详细介绍,这里暂都用本地对象
下面在这个程序测试所有语法
(一)断句
1.程序语言跟语文有类似地方,说完一句话肯定需要标点符号断句。abap也是一样,程序是由上往下顺序执行,遇到调用FORM(定义的方法)会调到定义地方,执行完回来当前行继续执行
2.语句断句符号是".",大写的点号。(java等喜欢用分号“;”,abap有点特殊)
3.abap语言区别java,是不分小写的(大小写一样,建立表等都是大写的,小写要特殊设置才能支持)
4.输出代码是:write
5.其他语法常用的双引号的地方,abap一般用单引号:
DATA: L_STR TYPE CHAR10.
L_STR = '0010000001'. "JAVA等使用双引号定义string等,sap使用单引号,因为双引号已经有注释的作用
6.注释
(1)abap使用大写左双引号+注释内容:
write '右边文字注释不显示'. "这是注释
(2)行开头定格使用*注释整行:
* write '整行注释,显示不出来'
WRITE '可以显示'.
7.简单的去零(前导零)
WRITE '00000000990' NO-ZERO. "去零
8.跳过行:一行-skip ,多行-SKIP INT:
WRITE '1' .
SKIP.
WRITE '2'.
WRITE 'NO SKIP 对比:'.
WRITE '1' .
WRITE '2'.
WRITE 'SKIP 5行对比:'.
WRITE '1' .
SKIP 5.
WRITE '2'.
9.消息显示:
(1)消息类型:
E-错误,错误信息,显示后abap中断
S-成功,显示成功信息,不影响后续代码
W-警告,显示警告信息,往往需要用户点击回车后才会继续执行后续代码
I-信息,显示提示信息,往往需要用户点击回车后才会继续执行后续代码
A-取消,提示后直接取消使用者当前的事务(少用)
X-终止,提示终止文本后终止程序生成abap短缓存(少用)
(1)简单的自定义文本消息:MESSAGE ‘消息自定义文本’ TYPE ‘类型’ ,
(2)显示系统的信息:
se91创建MESSAGE对象:ZMSGTEST1 : 000 姓名由 (姓&)+(字辈&)+(名&)组成
*MESSAGE 消息类型+对象ID WITH '&变量1' '&变量2' ...
MESSAGE I000 WITH 'wang' 'lao' '5' .
(3)指定显示模式:MESSAGE ‘文本’ TYPE ‘E’ DISPLAY LIKE ‘I’ . "强行把E类型显示为I类型,后面代码也是会根据E类型影响中断
以上是通用的基础语法,当然语法方面还有字符创处理等代码,熟悉后可以自行找专题资料学习。
类似java的string char等,abap有int char等基础数据类型,abap最底层的数据类型类似java有I/C/STRING等:
类型 | 长度 | 范围 |
---|---|---|
X | 1 byte | Any byte values (00 to FF) |
C | 1 character | 1 to 65535 |
N (numeric text filed) | 1 character | 1 to 65535 |
D (character-like date) | 8 characters | 8 characters |
T (character-like time) | 6 characters | 6 characters |
I | 4 bytes | -2147483648 to 2147483647 |
F | 8 bytes | 2.2250738585072014E-308 to 1.7976931348623157E+308 positive or negative |
P | 8 bytes | [-10^(2len -1) +1] to [+10^(2len -1) 1] (where len = fixed length) |
STRING | Variable | Any alphanumeric characters |
XSTRING (byte string) | Variable | Any byte values (00 to FF) |
事务代码SE11,可以创建和调整
底层的数据类型按照某些规律如限制长度、组合成结构等就组成abap的数据类型(data types)。这里先介绍SE11基础数据类型:
类型 | 描述 |
---|---|
ACCP | 记帐周期 YYYYMM 6位 0小数 |
CHAR | char类型的字符串 1 to 65535 简称C |
CLNT | 集团 3位 |
CUKY | 货币关键字,被 CURR 字段引用 |
CURR | 货币字段,作为 DEC 存储 |
DF16_DEC | Decimal Floating Point, 16 Digits, DEC on Database |
DF16_RAW | Decimal Floating Point, 16 Digits, RAW on Database |
DF16_SCL | Decimal Floating Point. 16 Digits, with Scale Field |
DF34_DEC | Decimal Floating Point, 34 Digits, DEC on Database |
DF34_RAW | Decimal Floating Point, 34 Digits, RAW on Database |
DF34_SCL | Decimal Floating Point, 34 Digits, with Scale Field |
DATS | 日期字段(YYYYMMDD)用8个字符存入 |
DEC | 计数器或带有逗号和正负号的数值区 |
FLTP | 浮点数,精确到8个字节 |
INT1 | 1 字节整数, 整数 <= 255 |
INT2 | 2 字节整数,仅用于 LCHR 或 LRAW 前的长度字段 |
INT4 | 4 字节整数, 带符号的十进制数 |
LANG | 语言代码 |
LCHR | 长字节串,要求前面的 INT2 字段 |
LRAW | 长字节串,要求前面的 INT2 字段 |
NUMC | 只有数字的字符串 |
PREC | 一个QUAN 字段的精确 |
QUAN | 数量字段,指向带 UNIT 格式的单位字段 |
RAW | 不解释的字节排序 |
RAWSTRING | Byte String of Variable Length |
SSTRING | Short Character String of Variable Length |
STRING | 可变长度字符串 |
TIMS | 时间栏(小时分钟键秒),作为6位字符存储 |
UNIT | QUAN 字段单元键 |
VARC | 长字符串,从版本 3.0 起不再支持 |
SE11-dataDomain-新建
这里需要注意的是:sign-勾选支持负号,LowerCase-勾选后支持小写否则都是会自动大写
创建完毕,记得激活(SAP所有开发内容都要激活后才能使用,下同,请务必记住)
SE11-数据类型-新建:选择dataElement
选择数据域作为数据元素的元素类型
填写长短显示的文本,后面激活即可
有心的朋友可能留意到FurtherCharacteristics tab为什么没介绍,这个是搜索帮助等配置,留到后面
上面dataElement-dataDomain定义的其实是数据表的列的字段类型,现在可以新建表了(当然也可以使用基础数据类型作为列字段类型建表,不过abap不太建议直接使用基础数据类型,因为很多控件和屏幕可能不会支持,例如tring类型,控件无法显示也无法选择值)
SE11-透明表-新建
点击Fields tab,添加列字段和数据元素(SAP默认使用数据元素、数据域定义表,但也可以点击 PredefinedType直接使用char等基础数据类型定义表,只是有些sap控件不支持,所以不太鼓励)
如果是数量、金额等财务数据,还需要填写下面的tab,这里建议可以找类似的财务表字段参考填写,不用问原因了
点击工具栏的“技术设置”:
最后还是保存和激活,激活有黄色的警告,一般不用理会,入门后可以建立增强字段这样黄色警告都不会有了。
SE11-view-新建,分为四种视图
数据库视图:跟数据库的视图一样,使用数据表关联建立的视图,只能inner join关联
投影视图:类似上面,使用out join形式关联
维护视图:可以用来维护关联表的视图(一般可以在SE16N直接打开或者在SM30维护)
帮助视图:类似domain里面的域值,建立后数据表的FurtherCharacteristics tab里面维护后,就可以点击打开搜索帮助来选择具体的值(F4/F1)
视图功能相对简单这里不详细说明,帮助视图和维护视图后面会有相关章节说明
CONSTANTS 变量名 TYPE abap数据类型 VALUE ‘值’ 。
常量跟变量的区别:常量是一般不打算修改的全局常数,但如果修改一处则所有引用的地方的值都变;变量是引用的地方都可以分别赋值,赋值不同,该一个地方其他已经引用的不会随时改变
DATA <变量名>(长度) TYPE <数据类型> VALUE <默认值>.
TYPE-abap数据类型(前面SE11建立的那些),根据不同对象可以用LIKE(参考),REF TO-类。
另外修饰TYPE LIKE后面可以连接 LINE OF -定义行、工作区 TABLE OF-定义内表。
多个变量可以使用:DATA: <变量名2>(长度) TYPE <数据类型> VALUE <默认值>, <变量名2>(长度) TYPE <数据类型> VALUE <默认值>
清空变量可以使用:CREAL:变量名
内表方面的知识是一个重点,可以作为一个章节一一介绍才能透彻点,大家可以网上找找abap内表详解这类。所以这里只是整理一下项目中内表的常用操作。
操作 | 描述 | 代码举例 |
---|---|---|
定义内表 | 定义内表 | 1.types:begin of ty_tb,…end of ty_tb . data:lt_tb type table of ty_tb . 2. data:lt_tb type table of 透明表 |
定义工作区 | 定义内表的工作区(行),条件是内表必须包含表头 | data:wa_tb like line of lt_tb . |
定义指针 | 定义内表指针(一行),有没有表头都可以,性能比工作区好,不过不能del | field-symbol: like line of lt_tb |
表循环 | 逐行循环表 | loop at lt_tb . .修改、删除等操作和汇总到别的内表等… end loop . |
添加行 | 向内表添加行,或者多行 | append wa_tb to lt_tb .append lines of lt_tb1 to lt_tb |
修改行 | 修改内表的行数据 | 方法一:loop at lt_tb into wa_tb . wa_tb-列 = 值 .modify lt_tb from wa_tb . 方法二:loop at lt_tb ASSIGNING . -列 = 值 ."不用modify,因为直接修改内表的指针 |
删除行 | 删除内表的某行 | 类似修改行,在循环里面使用内表删除工作区行即可:delete lt_tb from wa_tb |
内表更新透明表 | 定义跟透明表结构一样的内表,使用该内表更新透明表相应的行 | data:lt_tb type table of mara . lt_tb赋值. modify mara from lt_tb |
结构可以简单理解为内表的一行。它只有表头结构+一行数据组成。多用于函数、接口等需要配置固定出入口参数的场景使用。
一般report类abap程序都可以通过菜单:“转到”——“文本元素”——“选择文本”/“清单标题”/文本符号,去定义该程序使用的文本。
可以使用TEXT-sym来使用,例如使用T01文本,可以使用TEXT-T01。可以作为write、alv的fieldcat的文本
主要是定义了select-options、parameters控件,就能自动生成,可以修改成自己需要的文本,可以直接勾选系统生成
write类语法会用到,目前我们多数使用dynpro屏幕或者alv,所以很少用文本符号
分类 | 描述 | 代码/符号 |
---|---|---|
1.比较 | 大小比较,条件比较 | =/EQ-等于, <>/NE-不等于, GT/>-大于,LT/<-小于,GE/>=-大于等于,LE/<=-小于等于 |
2.运算 | 数值运算 | ±加,-减,*-乘,/-除 mod-求余数 ,**-乘方 |
3.逻辑 | 逻辑是否等 | AND-且,or-或者,not-非,!-非 |
4.字符运算 | 字符类包含等 | CO-包含,CN-不包含;CA-任意包含,NA-不包含任意一个;CS-包含整个字符,NS-不包含整个字符;CP-包含字符(可以间隔开),NP-不包含(任意间隔开) |
loop at .
"行数据处理代码
endloop.
data i type i.
while i <99.
"your code
i+=1.
endwhile.
do 99 times.
"your code
enddo.
字符串相关处理函数整理如下:
1.字符串的包含运算:可以参考 3.运算符号-字符运算
2.字符连接:
CONCATENATE str1 str2 str3 into str4.
str4 = str1 & str2 & str3 & str4 .
3.位置:str+开始位置(位数):data:str(10) type c.str = ‘12345678a’ . write str+0(2) . "12
4.获取长度:strlen( str )
5.分隔:splite str at ‘符号’ into str1 str2
6.查找:find first/last/all occurent of str
7.替换:replace str with ‘’ into str1 length 2.
8.去零:shift str left deleting leading ‘0’.
9.消除间隔:condense str no-graps.
10.转换大小写:TRASLATE str UPPER/LOWER CASE
11.转换类型:CONVERT
日期和函数有加减天数、月份、年份等,都有sap标准函数处理。直接给网址吧:http://www.sapjx.com/abap-datetime-function.html
一般使用sy-subrc是否为0来区分异常,如果不为0则进行异常处理
CALL FUNCTION 'DD_DOMVALUES_GET'
EXPORTING
DOMNAME = 'ZYZZT' "域名
TEXT = 'X'
LANGU = SY-LANGU
IMPORTING
RC = LV_RETURN
TABLES
DD07V_TAB = I_DOM_APSTT
EXCEPTIONS
WRONG_TEXTFLAG = 1
OTHERS = 2.
IF SY-SUBRC <> 0."被动异常处理,按照标准的msg类型抛出
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
try .
"your code
catch 错误类 into 变量 .
"your code dosomething
catch 错误类2 into 变量2.
"your code
可以自己错误类具体有哪些内容,参考高手文章,整理成自己常用的:
https://blog.csdn.net/precipitant/article/details/42295387
可以在SE11上面建立表的锁对象。ABAP锁模式分为
其中比较重要的是:
S锁-共享锁(中文德文翻译不同shared /read lock)——修改时,其他人不能访问(读、写),同一时间不同用户加锁,不能跟其他排他类型叠加
E锁-write lock修改时候,其他人可以查看,但是不能修改。同一时间同一用户可以叠加,二同一事务代码内E/S可以叠加
X锁-写入但不叠加的锁——同一时间不能叠加,同一事务也是只有一次加锁机会
可以添加关联的表和指定具体需要锁定的字段:如果不指定则锁定整个表,锁定后锁定字段相同的记录(类似主键)
事务码:se37,按照是否标准函数,可以分为BAPI、普通函数,按照是否能远程调用可以分为RFC和非RFC。主要有如下几个tab:
Import:入口参数,输入供函数调用和运算的变量/结构
Export:出口参数,用于执行函数后输出的参数/结构
Changing:执行函数后,改变的值(类似输出)
Tables:内表变量,可以同时作为输入和输出变量(只有这里才能设置内表变量,其他只能设置结构和单个变量)
Exceptions:错误处理变量
Source Code:源代码,这个函数的abap代码
事务码:SE24,可以定义类,方便在abap代码中实现面向性开发。类似java。因为项目中用的比较多的都是标准类和复制类,用起来有点复杂,篇幅不少这里暂不详细说明
使用特殊标记插入本地sql:
data:c1 type mara-matnr value '123'.
EXEC SQL PERFORMING lt_tb ."返回表
select * from mara where matnr = :c1
ENDEXEC.
这类sql一般都是oracle、msssql等标准数据库的sql,没有sap技术优化已经在sap淘汰,用的比较少,十多个join这类语句可以尝试,否则一般使用open sql
篇幅较长,这里整理成表格
项目 | 主要功能点 | 说明 |
---|---|---|
select | 选择语句一般添加具体的字段名,遇到名称跟内表不同可以使用select as改为需要的字段名 | |
insert | 插入语句 | insert into 透明表 from 行(工作区) |
update | 更新语句 | update 透明表 from 行(工作区) |
delete | 删除语句 | delete 透明表from 行(工作区) |
modify | 自动修改和新增语句,根据主键是否相同决定新增或者修改 | 注意主键设置避免覆盖 |
into | into:把结果输入到相应的内表(会覆盖),一般使用结构相同的,如果不同可以使用 into corresponding;append into 新增到内表; | 有append不会覆盖,注意是否会重复 |
from | 表名,如果多个表联立查询可以使用as | 透明表/视图 |
for all | 联立内表 | 后面7.5新语法可以直接join内表,可能会替代for all;如果for后面内表为空则会显示所有记录要注意宕机 |
join联立查询 | 可以多个表联立查询 | 注意字段的元素位数是否相同,否则join起来会出问题 |
where条件 | 1.range类使用in 2.可以使用=<>等运算符 | open sql可以使用字段+开始位置(位数)作为where条件 |
以上就是今天要讲的内容,里面没提到的后面补充相应的专题。下一步计划是整理下report screen + alv实操,再而整理下项目常用的增强、批导等