tangToms

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.

 

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2021-08-09
  • 2021-12-11
  • 2021-12-26
  • 2021-10-05
  • 2021-12-19
  • 2022-01-05
  • 2021-10-29
猜你喜欢
  • 2018-09-11
  • 2021-08-06
  • 2021-12-02
  • 2022-12-23
  • 2022-12-23
  • 2021-12-26
  • 2019-01-15
相关资源
相似解决方案