ABAP基础语法

1.数据类型及属性

类型

说明

C

 

N

0到9之间字符组成的数字字符串

D

日期格式必须为 YYYYMMDD

T

格式为 24-hour的 HHMMSS

I

-2.147.483.648 to +2.147.483.647

F

小数位最大可以到17位,即可精确到小数点后17位

P

两个数字位压缩后才占一个字节,由于0-9的数字只需要4Bit位,所以一个字节实质上允许存储二位数字,这就是P数据类型为压缩数据类型的由来。并借用半个字节来存储小数点位置、正号、负号相关信息

X

十六进制字符 0-9, A-F具体的范围为:00~FF

类型X是十六进制类型,可表示内存字节实际内容,使用两个十六制字符表示一个字节中所存储的内容。但直接打印输出时,输出的还是赋值时字面意义上的值,而不是Unicode解码后的字符

如果未在 DATA 语句中指定参数<length>,则创建长度为 1

注:如果值是字母,则一定要大写

语法示例:

DATA: number(16) TYPE p DECIMALS 14 VALUE '12345678901234567.89012345678901'.

"16 * 2 = 32表示了整个字面意义上允许的最大字面个数,而14表示的是字面上小数点后面允许的最大小数位,而不是指14个字节,只有这里定义时的16才表示16个字节

 

predefined ABAP types

Type

Length

Standard length

Description

b

1 Byte

 

1 byte integer (internal)

c

1 to 65,535 characters

1 character

Text field

cursor

as i

as i

Database cursor

d

8 characters

 

Date field

f

8 bytes

 

Floating point number

i

4 bytes

 

4 byte integer

n

1 to 65,535 characters

1 character

Numeric text

p

1 to 16 bytes

8 bytes

Packed number

string

variable

 

Text string

s

2 bytes

 

2 byte integer (internal)

t

6 characters

 

Time field

x

1 to 65,535 bytes

1 byte

Byte field(hexadecimal)

xstring

variable

 

Byte string

 

数据字典预置类型与ABAP类型对应关系。

数据字典预置类型

ABAP类型

运行长度

说明

ACCP

N(6)

6

会计计算周期

CHAR

C(n)

1-255

字符

CLNT

C(3)

3

集团,数据区域代码

CUKY

C(5)

5

货币代码

CURR(n,m)

P((n+1)/2)DECIMALm

42736

货币金额

DATS

D(8)

8

日期

DEC n,m

P((n+1)/2)DECIMALm

n(1-31)m(1-17)

数值计算

FLTP

F(8)

18

浮点数

INT1

X(1)(类型b)

3

单字节整形数

INT2

X(2)(类型s)

5

双字节整形数

INT4

X(4)(类型i)

10

四字节整形数

LANG

C(1)

内部1位外部2位

语言代码

LCHR

C(n)

256-最大值

长字符

LRAW

X(n)

256-最大值

长位字串

NUMC n

N(n)

1-255

数值文字

PREC

X(2)

16

精确度

QUAN n,m

P((n+1)/2)DECIMALm

42736

数量

RAW n

X(n)

1-255

位字串

TIMS

T(6)

6

时间

VARC n

C(n)

255-最大值

长字符(仅3.0前可用)

STRING

STRING

1-最大值

字符串

RAWSTRING

XSTRING

1-最大值

位字符串

UNIT

C(n)

2~3

单位

SAP系统变量

SY-SUBRC: 系统执行某指令后,表示执行成功与否的变量,’0’ 表示成功

SY-DBCNT: 在open SQL语句中,表示执行影响到的数据条数 
SY-DBLNT: 被处理过的记录的笔数 
SY-UNAME: 当前使用者登入SAP的USERNAME;
SY-DATUM: 当前系统日期;
SY-UZEIT: 当前系统时间;
SY-TCODE: 当前执行程序的Transaction code
SY-INDEX :
SY-TABIX:
SY-TMAXL: Internal table的总笔数
SY-SROWS: 屏幕总行数;
SY-SCOLS: 屏幕总列数;
SY-MANDT: 當前系統編號(CLIENT NUMBER)
SY-VLINE: 画竖线
SY-ULINE: 画横线
SY-PAGNO: 当前页号
SY-LINSZ: 当前报表宽度
SY-LINCT: 当前报表长度
SPACE: 空字符串
SY-LSIND: 列表索引页
SY-LISTI: 上一个列表的索引
SY-LILLI: 绝对列表中选定行的行号
SY-CUROW: 屏幕上的行
SY-CUCOL: 光标列
SY-CPAGE: 列表的当前显示页
SY-STARO:真实行号
SY-LISEL: 选择行的内容,长度为255
SY-LINNO: 当前行

q  系统内部有一个专门存放系统变量的结构SYST,其中最常用的系统变量有:
SY-SUBRC: 系统执行某指令后,表示执行成功与否的变量,’0’ 表示成功
SY-UNAME: 当前使用者登入SAP的USERNAME;
SY-DATUM: 当前系统日期;    

SY-DATAR:如果屏幕上至少有一个输入字段的值被用户或其他数据传输所更改, 值为X。但如果没有修改,回车后的值是空。
SY-UZEIT: 当前系统时间;
SY-TCODE: 当前执行程序的Transaction code
SY-REPID: ABAP 程式名,目前的主程式
SY-DYNNR: 画面号

SY-CPROG: ABAP 程式名
SY-SYSID: R/3 系統,R/3 系統名稱
SY-UCOMM: PAI 驱动的功能代码,一般用来参照定义变量
SY-INDEX(DO) : 当前LOOP循环过的次数
SY-TABIX(LOOP READ): 当前处理的是internal table 的第几笔

sy-langu:记录登陆系统的语言。

 

 

2.数据与变量声明

l  变量以字母作为首字符,长度不超过30字节(SPACE是预定义字段constant with C)。

l  如果没有指定类型,默认使用类型C。

l  LIKE参数,既可以参照内部字段,也可以参照数据库中的字段。只要在程序的一个地方中数据属性发生改变,其他使用LIKE参数定义的数据也发生改变。

l  透明表(还有其它数据词典中的类型,如结构)即可看作是一种类型,也可看作是对象,所以即可使用TYPE,也可以使用LIKE

TYPES:定义数据类型

-       数据类型是纯粹的说明。

-       没有与数据类型相关联的内存。

-       数据类型描述数据对象的技术属性。

-       数据类型是数据对象的属性并与数据对象联系紧密。

DATA:声明数据对象(变量、常量)

-       数据对象是程序在运行时使用的物理单元。

-       每个数据对象都有分配给它的特定数据类型。

-       每个数据对象占据一些内存空间。

-       ABAP/4 根据数据对象的数据类型处理数据对象。

l  TABLES: spfli.

DATA spfli TYPE spfli.

以上两个语句等价。即在定义内存变量时,可以将透明表当做结构体来使用

l  CONSTANTS 利用<value>参数指定的初始值,在程序的执行期间不能更改。

 

DATA 语句

用于创建变量

CONSTANTS 语句

用于创建常量(必须赋值),数字常量有数据类型P与I,文本常量有C与N。

STATICS语句

用于创建变量,这些变量在程序运行期间一直存在,但仅在过程中可见

TABLES语句

用于创建表工作区

TYPES 语句

用于创建用户定义的数据类型

 

语法示例:

DATA : BEGIN OF address2,
  street(20) TYPE c,
  city(20) TYPE c,
  END OF address2.
DATA obj4 TYPE STANDARD TABLE OF address2."这里使用的实质上是词典中的类型address2
DATA obj5 LIKE STANDARD TABLE OF address2."这里使用是的上面定义的变量address2

3.数据赋值

l  Value参数赋予字段相应的初始值。

WRITE {source|(source_name)} TO destination.

The data objects source_name and destination must be character type and flat.

语法示例:

DATA: date_short TYPE c LENGTH 8,
      date_long  TYPE c LENGTH 10,
      date_mask  TYPE c LENGTH 8.
WRITE sy-datum TO: date_short,
                   date_long,
                   date_mask DD/MM/YY.

WRITE ICON_OKAY AS ICON TO PUBU2. "给PUBU2按钮添加图标,并且在给按钮赋值之前,否则将会把文字替换。

 

MOVE source {TO|?TO} destination.

destination1 = destination2 = ... = destination = source.

MOVE-CORRESPONDING struc1 TO struc2.

UNPACK source TO destination.

For source, the data type p of length 16 without decimal places is expected. The data type of destination must be character-type and flat.

READ LINE line_num FIELD VALUE num.

4.数据清除.

CLEAR dobj [ {WITH val [IN {BYTE|CHARACTER} MODE] } 所有的space被var替代
           | {WITH NULL} ].
如果使用有表头行的内表,CLEAR 仅清除表格工作区域,CLEAR dobj[] 都清除

 

REFRESH itab.清除内表所有行

FREE  dobj.”内存释放

5.字符串处理

CONCATENATE

{dobj1 dobj2 ...}|{LINES OF itab}
INTO result
[IN {BYTE|CHARACTER} MODE]
[SEPARATED BY sep] ”用sep分割

SPLIT dobj AT sep INTO
      { {result1 result2 ...} | {TABLE result_tab} }
      [IN {BYTE|CHARACTER} MODE].


[RESPECTING BLANKS].“对于c, d, n, t类型的字符串有一个RESPECTING BLANKS选项可使用,表示尾部空格也会保留。

FIND [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF]  pattern
IN [section_of] dobj     
pattern:{[SUBSTRING] sub_string} | {REGEX regex}” sub_string in pattern is an empty string or is of type c, d, n, or t and only contains empty characters,  regex in pattern contains a regular expression that is the same as the empty character string,
[IN {BYTE|CHARACTER} MODE]
[{RESPECTING|IGNORING} CASE]
[MATCH COUNT  mcnt]
“成功匹配次数
{ {[MATCH OFFSET moff] [MATCH LENGTH mlen]} ”
最后一次整体匹配到的串(整体串,最外层分组,而不是指正则式最内最后一个分组)起始位置与长度
|[RESULTS result_tab|result_wa]}
result_tab接收所有匹配结果,result_wa只能接收最后一次匹配结果
[SUBMATCHES s1 s2 ...].
通常与前面的MATCH OFFSET/ LENGTH一起使用。只会接收使用括号进行分组的子组。如果变量s1 s2 ...比分组的数量多,则多余的变量被initial;如果变量s1 s2 ...比分组的数量少,则多余的分组将被忽略;且只存储第一次或最后一次匹配到的结果

REPLACE [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF] pattern
IN [section_of] dobj WITH new
[IN {BYTE|CHARACTER} MODE]
[{RESPECTING|IGNORING} CASE]
[REPLACEMENT COUNT rcnt]
{ {[REPLACEMENT OFFSET roff] [REPLACEMENT LENGTH rlen]}
| [RESULTS result_tab|result_wa] }.

l   SHIFT dobj {BY num PLACES} | {UP TO sub_string} “sub_string开始

[LEFT|RIGHT][CIRCULAR]  ” CIRCULAR:将移出的字符串放在左边或者左边

{ {LEFT DELETING LEADING}|{RIGHT DELETING TRAILING} } pattern

执行结果返回给系统变量SY-SUBRC,若执行成功时,返回值为"0",倘若子串与原字符串不匹配,返回值为"4"。

l   CONDENSE text [NO-GAPS]. 如果是C类型只去掉前面的空格(因为是定长,即使后面空格去掉了,左对齐时后面会补上空格),如果是String类型,则后面空格也会被去掉;字符串中间的多个连续的空格使用一个空格替换(String类型也是这样);NO-GAPS:字符串中间的所有空格都也都会去除(String类型也是这样);空格去掉后会左对

l   CONVERT TEXT text INTO SORTABLE CODE hex. 数据对象文本(X)的内容被转换为可排序的字节序列,结果被分配给变量hex;数据对象文本保持不变,若hexxstring类型,则其长度将自动调整。

l   TRANSLATE text {TO {UPPER|LOWER} CASE}
             | {USING pattern}.

l   SEARCH <c> FOR <str>.

语法示例:

DATA text TYPE string.
text = `Barbcbdbarb`.
TRANSLATE text USING 'rVcX'. ”BaVbXbdbaVb
TRANSLATE text TO UPPER CASE. ”BABVXBDBAVB
WRITE:/ text.

6.PARAMETERS语句

PARAMETERS {para[(len)]}|{para [LENGTH len]}
           [
type_options]
           [
screen_options]
           [
value_options]
           [
ldb_options].

l  type_options:

{ TYPE type [DECIMALS dec] } | { LIKE dobj } |{ LIKE (name)}.

 TYPE type:参照某一类型对象定义PARAMETERS。
 ...DECIMALS dec:定义小数位,对输入参数自动格式化,该语法只对P类型有效(参数某一类型定义关键字TYPE)。
 ...LIKE dobj:參照某一字典对象定义PARAMETERS。

l  screen_options:

{ {[OBLIGATORY|NO-DISPLAY] [VISIBLE LENGTH vlen]}
    | {AS CHECKBOX [USER-COMMAND fcode]}
    | {RADIOBUTTON GROUP group [USER-COMMAND fcode]}
    | {AS LISTBOX VISIBLE LENGTH vlen [USER-COMMAND fcode]
                                      [OBLIGATORY]} }
    [MODIF ID modid].

 ...MEMORY ID pi:将PARAMETERS存储在SAP内存,参数名长度不能超过三位 ...NO-DISPLAY:将PARAMETERS设置为隐藏,不会的屏幕上输出。
 ...OBLIGATORY:限制该PARAMETERS为必填,否则会提示输入。...AS CHECKBOX:创建CHECKBOX对象。

...RADIO BUTTON GROUP radi:创建(RADIO)单选框。...VISIBLE LENGTH vlen:定义显示长度。
 ...USER-COMMAND ucom:为创建对象分配对象名,该值保存在内表中可供其它对象操作。 ...AS LISTBOX VISIBLE LENGTH vlen:创建一个下拉框,并指定长度.

l   value_options

... [DEFAULT val]
    [LOWER CASE]
    [MATCHCODE OBJECT search_help]
    [MEMORY ID pid]
    [VALUE CHECK] ... .若要使值表检查生效,则首先需要将此 Domain 引用到表字段,再对此表字段通过 按钮进行外键分配,并且外键一定是来自的值表的主键,最后使用 PARAMETERS 定义屏幕参数时要参照此表字段,

AS CHECKBOX, RADIOBUTTON, or NO-DISPLAY 不能同时使用...DEFAULT f:定义默认值。 ...LOWER CASE:输入值中不允许输入小写字符,否则会自动转换为大写。

l   ldb_options

... FOR {TABLE|NODE} node
    [HELP-REQUEST]
    [VALUE-REQUEST]
    [AS SEARCH PATTERN] ... .

... ON <field>:该语法用于控制屏幕元素输入时的遇错处理,检查具体输入字段(SELECTION-OPTIONS或PARAMETERS)是否完整或正确,若输入有错或不满足条件,其它屏幕元素会变成灰色,不接受输入直到该字段输入正确为止。
      ...ON VALUE-REQUEST FOR <field low/high>:SELECT-OPTIONS按选择帮助<F4>键时触发该事件。
      ...ON HELP-REQUEST FOR <field low/high>:SELECTION-OPTIONS按选择帮助<F1>键时键发该事件。

LISTBOX下拉列表

   FUNCTION ”F4IF_INT_TABLE_VALUE_REQUEST”

   FUNCTION ”VRM_SET_VALUES”.

语法示例:

PARAMETERS:          P1 RADIOBUTTON GROUP GRP1 DEFAULT 'X',
                             P2 RADIOBUTTON GROUP GRP1.

7.字段符号

FIELD-SYMBOLS <fs> { typing | STRUCTURE struc DEFAULT dobj }.

l   FIELD-SYMBOLS:<fs>.

l   FIELD-SYMBOLS <fs> TYPE itab."将<fs>定义成了具体限定类型

8.字段的动态分配

ASSIGN ... TO <fs>:将某个内存区域分配给字段符号,这样字段符号就代表了该内存区域

l   ASSIGN name TO <fs>."结果是<fs>与name变量等同"静态分配:编译时就知道要分配的对象

l   ASSIGN (name) TO <fs>."结果是是<fs>的值为str变量值 "通过变量名动态访问变量

l   UNASSIGN:该语句是初始化<FS>字段符号,执行后字段符号将不再引用内存区域

l    CLEAR:与UNASSIGN不同的是,只有一个作用就是初始化它所指向的内存区域,而不是解除分

语法示例:

DATA: BEGIN OF line,
  col1 TYPE i VALUE '11',
  col2 TYPE i VALUE '22',
  col3 TYPE i VALUE '33',
END OF line.
DATA comp(5) VALUE 'COL3'.
FIELD-SYMBOLS: <f1>, <f2>, <f3>.
ASSIGN line TO <f1>.
ASSIGN comp TO <f2>.

"还可以直接使用以下的语法访问其他程序中的变量
ASSIGN ('(ZJDEMO)SBOOK-FLDATE') TO <fs>.

"通过索引动态的访问结构成员
ASSIGN COMPONENT sy-index OF STRUCTURE <f1> TO <f3>.

"通过字段名动态的访问结构成员
ASSIGN COMPONENT <f2>OF STRUCTURE <f1> TO <f3>.

9.预置函数

... func( arg ) ...

l   数值运算及算术运算函数

ADD 10 to int.

SUBSTRACT 10 from int.

MULTIPLY int by 10.

DIVIDE int by 10.

语法示例:

DATA: i1 TYPE I,i2 TYPE I,i3 TYPE I,
      f1 TYPE p DECIMALS 1, f2 TYPE p VALUE '2.3' DECIMALS 1,f3 TYPE p DECIMALS 1,
word1 TYPE string VALUE 'ABCD',word2 TYPE string VALUE 'EFG',xstr TYPE XSTRING.
 f1 = ( i1 + EXP( f2 ) ) * i2 / SIN( 3 - i3 ).
    COMPUTE f3 = SQRT( SQRT( ( i1 + 12 ) * i3 ) + f2 ).”注意符号间间距
     i1 = STRLEN( word1 ) + STRLEN( word2 ).
WRITE:/ i1,i2,i3,f1,f2,f3.

10. DESCRIBE

DESCRIBE TABLE itab[KIND knd][LINES lin][OCCURS n].

KIND knd :T 时代表标准表,为S时代表排序表,为H时代表哈希表

 LINES lin  内表表行数量

 OCCURS n在内表用选项initial size 或者老式的选项ocurs创建期间决定内表所需要的初始化内存大小

DESCRIBE DISTANCE

DESCRIBE DISTANCE BETWEEN dobj1 AND dobj2 INTO dst
                          IN {BYTE|CHARACTER} MODE.

dobj1 and dobj2两个变量地址起始位置的距离

ABAP基础语法

全文结束