ABAP学习
ABAP学习基本资料整理。
ABAP基本语法
ABAP中不区分大小写,例如:Type 和type表示一个意思。
1基本数据类型
ABAP基本数据类型:
I : 整形数据;
C:字符型数据;
N:只包含数字的字符串;
P:包装数据类型;
F:浮点类型;
D:日期类型;
T:时间类型;
X:十六进制数据。
F和P类型都保存浮点数,P的精度比F更高,一般使用P类型。
示例:
"整型 DATA:num1 type I. "字符型 DATA:num2(3) type C. "数字字符型 DATA:num3(4) type N. "包装类型,decimals指定小数位数,只有P类型可用 DATA:num4(10) type P DECIMALS 4. "浮点型 DATA:num5 type F. "日期型 DATA:num6 type D. "时间型 DATA:num7 type T. "16进制型 DATA:num8(10) type X. "字符串 DATA:num9 type string. "C,N,X,P可以使用length定义长度 DATA:num10 TYPE C LENGTH 14. "赋值操作 "move to 语句 "MOVE 1333 TO num1. num1 = 1234567890. num2 = 'abc'. num3 = '0010'. num4 = '1.23456789'. num5 = '12.3456789'. num6 = sy-datum. num7 = sy-uzeit. num8 = 1234567890. write :/ 'num1=',num1,'num2=',num2,'num3=',num3,'num4=',num4,'num5=',num5,'num6=',num6,'num7=',num7,'num8=',num8. "字符串转I, "不能有汉字,不能是科学计数法 "num9 = '1.23300000E+2'. num9 = '12.33334'. num1 = num9. WRITE:/ 'num1',num1. "字符串转C num9 = '中'. num2 = num9. WRITE:/ 'num2',num2. "字符串转N,会将小数点去掉 num9 = '22.33'. num3 = num9. WRITE:/ 'num3',num3. "字符串转P, num9 = '12.3456'. num4 = num9. WRITE:/ 'num4',num4. "字符串转F,会变成科学计数法显示 num9 = '12.34567'. num5 = num9. WRITE:/ 'num5',num5. "字符串转D,MMDDYYYY "输出:09302018 num9 = '20180930'. num6 = num9. WRITE:/ 'num6',num6. "字符串转T,hhmmss num9 = '014423'. num7 = num9. WRITE:/ 'num7',num7. "字符串转X,长度超过20位,截取前20字符 num9 = '123456789012345678901234'. num8 = num9. WRITE:/ 'num8',num8. "科学计数法转换 DATA:str TYPE char25 VALUE '4.3999999999999997E-2'. DATA:m_str LIKE CHA_CLASS_DATA-SOLLWERT. DATA:c_str(16) TYPE C. DATA:c_num(16) TYPE P DECIMALS 3. MOVE str to m_str. "科学计数法字符串转换成数字 CALL FUNCTION 'QSS0_FLTP_TO_CHAR_CONVERSION' EXPORTING I_NUMBER_OF_DIGITS = 3 I_FLTP_VALUE = m_str I_VALUE_NOT_INITIAL_FLAG = 'X' I_SCREEN_FIELDLENGTH = 16 IMPORTING E_CHAR_FIELD = c_str. IF sy-subrc = 0. WRITE:/ c_str. c_num = c_str. WRITE:/ c_num. ENDIF. "不用function转换,QSOLLWERTE作为中间数据 "将科学计数法字符串转换为其他数据 DATA:mid_str TYPE QSOLLWERTE. mid_str = str. c_num = mid_str.
2 type定义数据类型
语法结构:Types :<类型名> type <数据类型>
Types :<类型名> like <数据对象或数据类型>
定义结构体
Types: begin of <结构名>,
<资料名> type <数据类型>,
…………
end of <结构名>.
Data: begin of <结构名>,
<资料名> type <数据类型>,
…………
end of <结构名>.
"****************************************************************** "type定义数据类型 "****************************************************************** TYPES: length TYPE I. TYPES: str(20) TYPE C. TYPES: BEGIN OF person, Name(10) type C, Age type I, END OF person.
3变量声明
相关语法:data: <变量名> type <数据类型> [value <值>] 。value值是指定初始值,也可以不指定初始值。
多个变数声明,以逗号隔开,最后句号结尾。
示例:
"****************************************************************** "基本数据类型和变数声明 "****************************************************************** data: num1 type I value 12, num2 type C value 1, num3(4) type N value '2333', num4 type P, num5 type F, num6 type D, num7 type T, num8 type X.
4常量定义
语法:constants <变量名> type <变量类型> [value 值]
"****************************************************************** "常量定义constants "****************************************************************** CONSTANTS Pi TYPE F VALUE '3.1415926'.
5系统相关变量
系统定义的相关变量。sy-变量名,可以获取系统的相关变量。
状态信息:
sy-subrc:系统执行命令后,是否成功变量,执行成功为0;
例如:
查询语句是否查询到相应记录,
如果sy-subrc=0,查询成功;
sy-subrc=4,没有查询到记录;
sy-subrc=8,使用“select single for update”,没有查询到记录;
插入语句是否插入成功,
如果sy-subrc=0,插入成功;
sy-subrc = 4,插入失败;
Loop循环语句,是否有循环记录,
如果sy-subrc=0,至少循环一次;
sy-subrc=4,没有循环记录;
删除语句,delete语句是否删除成功,
如果sy-subrc=0,删除成功;
sy-subrc=4,没有符合条件,删除失败;
更新语句,update语句是否更新成功,
如果sy-subrc=0,找到记录更新成功;
sy-subrc=4,没有找到记录,没有更新;
系统信息:
sy-uname:SAP系统账号;
sy-sysid:当前系统R/3名称;
sy-mandt:当前系统编号
sy-tcode:当前执行程序的Transaction code
sy-repid:ABAP程序名;
sy-cprog:ABAP程序名;
日期:
sy-datum:系统当前日期;
sy-uzeit:系统当前时间;
内表操作记录:
sy-index:当前do循环次数;
sy-tabix:当前处理内表第几笔记录;
sy-dbcnt:被处理过的记录的笔数;
sy-tmaxl:当前内表的总记录数;
示例:
sy-index只在do循环中有效,sy-tabix在loop循环内表有效
"******************************测试sy-index sy-tabix "sy-index 和sy-tabix记录内表循环次数 DATA:BEGIN OF people, name TYPE string, index TYPE I, tabix TYPE I, END OF people. "不带表头行的内表 *DATA:t_people LIKE TABLE OF people. "创建带表头行的内表 DATA:t_people LIKE TABLE OF people WITH HEADER LINE. "sy-index只在do循环中有效 DO 2 TIMES. t_people-name = 'tom'. t_people-index = sy-index. APPEND t_people. ENDDO. "sy-tabix在loop循环中有效 LOOP AT t_people. WRITE:/ sy-tabix,t_people-name,t_people-index. ENDLOOP. DATA:test_spfli LIKE TABLE OF spfli. SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE test_spfli. "sy-dbcnt记录查询到的记录数 WRITE:/ sy-dbcnt. "返回当前处理内表记录数 WRITE:/ sy-tfill. "返回当前内表记录数 DATA:lines TYPE I. DESCRIBE TABLE test_spfli LINES lines "返回当前内表行数 DATA:line TYPE I. line = lines( test_spfli ).
屏幕相关:
sy-ucomm:屏幕,PAI驱动功能命令
sy-lisel:选择行内容;
sy-linno:当前行;
sy-srows:屏幕总行数;
sy-scols:屏幕总列数;
sy-curow:屏幕上行
sy-cucol:游标列
sy-vline:画竖线;
sy-uline:画横线;
sy-pagno:当前页号;
sy-linsz:当前报表宽度;
sy-linct:当前报表长度;
sy-cpage:列表当前显示页;
sy-staro:真实行号;
6赋值语句
通过value关键子,可以声明变量时,给变量一个初始值。
语法:move <变量1> to <变量2>
将变量1赋值给变量2
示例:
"****************************************************************** "变数赋值语句 "****************************************************************** write :/'****************'. Write:/'变数赋值语句'. Data: number1 type I value 10, number2 type I. Move number1 to number2. write :/'赋值number2=',number2. "从第7个位置,后面5个字符 Data: Str1 type String value 'hello world!', Str2 type String. Str2 = Str1+6(5). WRITE :/'Str2=',Str2. "结构体赋值 DATA: BEGIN OF p1, name(10) value '1111113i3', age(2) value '10', addr(20) value 'chongqing', END OF p1. DATA: BEGIN OF p2, name type String, age type I, email type String, End of p2. MOVE-CORRESPONDING p1 to p2. WRITE: /'name=',p2-name,'age=',p2-age,'email=',p2-email.
7算术运算函数
运算符:
算术运算符:加+、减-、乘*、除/、div整除、mod取余、x**y 乘方
运算函数:
ABS(N): 传回数值 N 的绝对值;
SIGN(N):
1 if N > 0
0 if N = 0
-1 if N < 0
CEIL(N): 传回大于数值N的最小整数 ;
FLOOR(N): 传回小于数值N的最大整数;
TRUNC(N): 传回数值N的整数部分;
FRAC(N): 传回数值 N 的小数部分
COS(A),SIN(A),TAN(A):传回三角函数 cos A, sin A, tan A 的值, A 为角度量;
EXP(N): 传回 e^N 值;
LOG(N): 传回 log eN 值;
LOG10(N): 传回 log N值;
SQRT(N): 传回 N 的平方根值。
示例:
"****************************************************************** "算术运算函数 "****************************************************************** num5 = ceil( num5 ). write :/ num5. "ceil 获取不小于num5的最小整数。 num5 = '4.33'. num5 = floor( num5 ). write :/ num5. "floor获取不大于num5的最大整数。 num5 = '4.33'. num5 = trunc( num5 ). write :/ num5. "trunc获取整数部分。
8移位操作
语法:shift <变量名>
对变数做移位元操作,默认移动一位
语法:shift <变量名> by <位数> places <left|right> [circular]
使用位数指定移动多少位,left,right指定左移或者右移,circular关键子表示是否循环移动。
语法:shift <变量名> <left deleting leading | right deleting trailing> <子串> [in (byte|character) mode]
通过移位操作去掉指定重复的子串
“ABCDEFG”移位操作,每次移位操作过后,会将改变的值赋给被处理变量。
输出示例:
左移一位:BCDEFG
左移两位:DEFG
循环左移:EFGD
循环右移:DEFG
示例:
DATA: Str type String value 'ABCDEFG'. "shift,只能是C,N,D,T,STRING支持 "默认左移一位 SHIFT Str. write :/ Str. "左移两位 shift Str by 2 PLACES LEFT. WRITE :/ Str. "默认循环左移 shift Str by 1 PLACES CIRCULAR. write :/ Str. "设置为循环右移 shift Str by 1 places RIGHT CIRCULAR. WRITE :/ Str. "shift去掉前导0 DATA:str(10) TYPE C VALUE '000233'. SHIFT str LEFT DELETING LEADING '0'. "调用function CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING INPUT = str IMPORTING OUTPUT = str.
使用unpack语句增加前导0
"增加前导0 DATA: str(5) TYPE C. UNPACK '123' to str. "调用function,增加前导0 CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = '123' IMPORTING OUTPUT = str.
9字符串操作
字符串相关操作:
1、获取字符串长度
语法:strlen( str ),注意变量和括号之间需要使用空格隔开;
语法:describe field <字符串> length <变量> [in byte|character mode]
这种方式获取字符串长度,就是定义的类型的长度,因为如果值的长度小于定义长度,系统会自动填充字符到指定长度。
示例:
DATA: Str TYPE String VALUE 'abcdef', len TYPE I. len = strlen( Str ). WRITE :/'字符长度为',len. "这种方式str类型只能是C,N,D,T类型 DATA: str(10) TYPE C VALUE 'abcdef', len TYPE I. DESCRIBE FIELD str LENGTH len in BYTE MODE. WRITE:/ len. DESCRIBE FIELD str LENGTH len in CHARACTER MODE. WRITE:/ len.
2、字符串替换
语法:replace <子串1> with <子串2> into <被操作字符串>
使用将字符串中的子串1替换为子串2
语法:replace section [offset <数字>] [length <数字>] of <被操作字符串> with <子串> [in (byte|character) mode]
使用子串替换字符串offset指定位置开始后length长度的字符串。
语法:replace
[first occurrence | all occurrences of]
[substring]
<被替换子串> in <被操作字符串> with <新字符串>
[in (byte|character) mode]
[respecting|ignoring case]
[replacement count <变数>]
[replacement offset <变数>]
[replacement length <变数>]
语法:overlay <字符串> with <字符串> [ only patterm]
示例:
"字符串替换 DATA :Str01 type String value 'abcdefg', Str02 type String value 'def', Str03 type String value '234'. REPLACE Str02 WITH Str03 INTO Str01. "字符串替换 DATA:str TYPE string VALUE 'hello world,welcome'. REPLACE SECTION OFFSET 5 LENGTH 8 of str with '123'. WRITE:/ str. "字符串替换 DATA:str TYPE string VALUE 'hello world,welcome'. "将第一个 o 替换成 2 REPLACE 'o' in str WITH '2'. "substring关键词可有可无 REPLACE SUBSTRING 'o' in str WITH '2'. "替换所有出现的'o' REPLACE ALL OCCURRENCES OF 'o' in str WITH '2'. DATA:count TYPE I. DATA:offset TYPE I. DATA:length TYPE I. REPLACE ALL OCCURRENCES OF 'o' in str WITH '22' "替换次数 REPLACEMENT COUNT count "最后一次替换位置 REPLACEMENT OFFSET offset "替换字符串长度 REPLACEMENT LENGTH length.
3、字符串大小写转换
语法:
转换成大写
translate <字符串> to upper case.
转换成小写
translate <字符串> to lower case.
4、查找字符串
search语法:
search <被操作字符串> for <子串>
[in (byte|character) mode]
[starting at <数字>]
[ending at <数字>]
[ABBREVIATED]
[and mark]
Starting at:指定查询范围
Ending at :指定查询范围
查找字符串中是否有对应子串,如果查找到sy-subrc = 0,没找到sy-subrc=4。在sy-fdpos中存放查找到子串字符开始位置。
find语法:
find <查找字符串> in section
[offset <数字>] [length <数字>] of <字符串>
[in (byte|character) mode]
[respecting|ignoring case]
[match offset <变数a>]
[match length <变数b>]
查找指定字符串在字符串中位置,
respecting case :严格匹配,区分大小写;
ignoring case :不严格匹配,不区分大小写;
match offset <数字> 比较分段;
match length <数字>比较的范围;
变量a保存查找字符串在匹配的位置;
变量b,查找字符串长度,如果没有找到为0。
示例:
"查找字符串,找到sy-subrc为0,没有找到sy-subrc为4.sy-fdpos存放找到字符开始位置 DATA: Str05 type String value 'abcdefg', Str06 type String value 'de'. SEARCH Str05 for Str06. WRITE:/'sy-subrc=',sy-subrc,'sy-fdpos=',sy-fdpos. DATA:begin_index TYPE I, char_len TYPE I. "查找字符串 FIND 'name' IN SECTION OFFSET 5 LENGTH 18 OF 'hello everyone my name is tom' "查找到匹配开始位置 MATCH OFFSET begin_index "匹配字符串长度 MATCH LENGTH char_len. WRITE:/ 'begin_index:',begin_index,';char_len=',char_len.
5、字符串截取
语法:<字符串>+a(b),从a位置开始,读取b长度字符串
示例:
"字符串截取操作 Data str07 type String value 'hello world'. str07 = str07+6(5). WRITE :/'截取字符串:',str07.
6、字符串去除空格
语法:condense <字符串>
示例:
"字符串去除空格(字符串后面的无论多少空格都不计算位数) Data: str08 type String value ' hello world ', lenth type I. lenth = strlen( str08 ). write:/'原长度',lenth. CONDENSE str08. lenth = strlen( str08 ). write:/'去除前后空格',lenth. "去除所有空白 CONDENSE str08 NO-GAPS. lenth = strlen( str08 ). write:/'去除所有空白',lenth.
7、字符串拼接
语法:concatenate <子串1> <子串2> [<子串3>……] into <字符串>
[in (byte|character) mode] [separated by <字符串>]
将子串1和子串2等多个字符串通过指定字符串连接,然后赋值给字符串。
语法:使用’&&’也可以连接字符串
示例:
"字符串连接 DATA: Str09 type String value 'hello', Str10 type String value 'world', Str11 type String. CONCATENATE Str09 Str10 INTO str11. WRITE :/'连接后字符串',str11. CONCATENATE Str09 Str10 INTO str11 SEPARATED BY ','. “CONCATENATE Str09 Str10 INTO str11 SEPARATED BY SPACE. WRITE :/'连接后字符串',str11. DATA:Str14(12) TYPE c VALUE 'hello'. DATA:Str15(5) TYPE c VALUE 'world'. DATA:Str16(17) TYPE c. DATA:Str17(17) TYPE c. CONCATENATE Str14 '|' Str15 INTO Str16. WRITE:/'concatenate连接:',Str16. Str17 = Str14 && '|' && Str15 . WRITE:/'&&连接:',Str17.
8、字符串分割
语法:split <字符串> at <分割字符串> into <子串1> <子串2> [in (byte|character) mode]。
将字符串根据指定字符串分割成子串1和子串2。
split <字符串> at <分割字符串> int table <内表> [in (byte|character) mode]。
分割字符串到指定内表,内表中一定要有C类型字段。
示例:
"字符串分割 DATA: str12 type String, str13 type String. SPLIT Str11 at ',' INTO str12 str13. DATA:BEGIN OF res_tab OCCURS 0, str(12) TYPE C, END OF res_tab. "将字符串分割进内表,内表字段必须是C类型,String类型不行 SPLIT str11 at ' ' INTO TABLE res_tab.
9、字符串模式匹配
CO / CN contains only or not
CA / NA contains any or not any
CS / NS contain string or not
CP / NP contains pattern or not
比较时,如果str1和str2中有前置空格,可以加入比较,后置空格不加入比较。
<str1> co <str2>:str1包含于或等于str2,返回true;区分大小写,str1中字符在str2中都能找到,顺序不要求。
<str1> cn <str2> :str1 不仅包含于或等于str2,str1中有str2中没有的字符,返回true;区分大小写,顺序无要求。
示例:
DATA text1 type string value 'dea'. DATA text2 type string value 'abcde'. "text1的内容包含于或等于text2内容,不会比较空格 IF text1 co text2. WRITE / 'co true'. ELSE. WRITE / 'co false'. ENDIF. "text1不仅包含text2内容,除了text2内容还包括其他内容" text1 = ' defo'. text2 = 'def,helo'. IF text1 cn text2. WRITE / 'cn true'. ELSE. WRITE / 'cn false'. ENDIF.
<str1> ca <str2>: str1 包含任何str2字符,返回true;区分大小写,顺序无要求。
<str1> na <str2>:str1 不包含任何str2字符,返回true;区分大小写,顺序无要求。
示例:
"text1只要含text2任何一点内容,为true" text1 = ' g'. text2 = ' abcdG'. IF text1 ca text2. WRITE / 'ca true'. ELSE. WRITE / 'ca false'. ENDIF. "text1不包含text2任何内容" text1 = 'G'. text2 = 'ag'. "使用大写G为false. IF text1 na text2. WRITE / 'na true'. ELSE. WRITE / 'na false'. ENDIF.
CS和NS字符串整体匹配:不区分大小写,顺序一致
<str1> cs <str2> :str1 包含str2字符串,返回true;不区分大小写,顺序有要求。
<str1> ns <str2> :str1 不包含str2字符串,返回true;不区分大小写,顺序有要求。
示例:
"text1包含text2,连续字符串匹配,不区分大小写" text1 = 'defG'. text2 = 'fg'."大小写都为true IF text1 cs text2. WRITE / 'cs true'. ELSE. WRITE / 'cs false'. ENDIF. "text1不包含text2,连续字符串匹配,不区分大小写" text1 = 'abcdefG'. text2 = 'fG'. IF text1 ns text2. WRITE / 'ns true'. ELSE. WRITE / 'ns false'. ENDIF.
CP和NP是模式匹配:不区分大小写,顺序一致,#表示区分大小写,*代表任意字符。
<str1> cp <str2> :str1包含str2字符串,返回true;
<str1> np <str2> :str1不包含str2字符串,返回true;
示例:
"text1包含text2,模式匹配。#用来表示区分大小写,*任意字符" text1 = 'BcdefG'. text2 = '*b*'. IF text1 cp text2. WRITE / 'cp true'. ELSE. WRITE / 'cp false'. ENDIF. "text1不包含text2,模式匹配。#用来表示区分大小写,*任意字符" text1 = 'BcdefG'. text2 = 'b*'. IF text1 np text2. WRITE / 'np true'. ELSE. WRITE / 'np false'. ENDIF.