ABAP学习(1):基本语法介绍

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.
View Code

 

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.

 

posted @ 2019-09-28 14:05  渔歌晚唱  阅读(3424)  评论(0编辑  收藏  举报