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参数赋予字段相应的初始值。
l 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按钮添加图标,并且在给按钮赋值之前,否则将会把文字替换。
l MOVE source {TO|?TO} destination.
l destination1 = destination2 = ... = destination = source.
l MOVE-CORRESPONDING struc1 TO struc2.
l 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.
l 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.字符串处理
l
l CONCATENATE
{dobj1 dobj2
...}|{LINES OF itab}
INTO result
[IN
{BYTE|CHARACTER} MODE]
[SEPARATED BY sep] ”用sep分割
l SPLIT
dobj AT sep INTO
{
{result1 result2 ...} | {TABLE result_tab} }
[IN
{BYTE|CHARACTER} MODE].
[RESPECTING
BLANKS].“对于c, d, n, t类型的字符串有一个RESPECTING BLANKS选项可使用,表示尾部空格也会保留。
l 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 ...比分组的数量少,则多余的分组将被忽略;且只存储第一次或最后一次匹配到的结果
l 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;数据对象文本保持不变,若hex是xstring类型,则其长度将自动调整。
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 ) ...
ADD 10 to int.
SUBSTRACT 10 from int.
MULTIPLY int by 10.
DIVIDE int by 10.
函 数 名 |
说 明 |
ABS |
返回输入参数的绝对值 |
SIGN |
返回输入参数的符号:正数返回1,0返回0,负数返回-1 |
CEIL |
返回不小于输入参数的最小整数 |
FLOOR |
返回不大于输入参数的最大整数 |
TRUNC |
返回输入参数的整数部分 |
TRAC |
返回输入参数的小数部分 |
ACOS(X) |
反余弦函数,结果范围为[-PI/2,PI/2],X的范围为from[-1,1](PI为三角函数:3.14) |
ASIN(X) |
反正弦函数,结果范围为[0,PI],X的范围为from[-1,1] |
ATAN |
反正切函数,结果的范围为[-PI/2,PI/2] |
COS |
余弦函数 |
SIN |
正弦函数 |
TAN |
正切函数 |
COSH |
余弦曲线函数 |
SINH |
正弦曲线函数 |
TANH |
正切曲线函数 |
EXP |
底数为e的幕函数(2=2.7182818284590452) |
LOG |
底数为e的自然对数 |
LOG10 |
底数为10的对数 |
SQRT |
平方根 |
STRLEN |
获取字符串长度函数 |
Function func |
Return value |
charlen |
Length of the first character of arg in the code page used: 1 for non-Unicode single-byte code; 1 or 2 for non-Unicode double-byte code; 1 for Unicode with single Unicode characters; 2 for Unicode with double unicode characters; |
dbmaxlen |
Maximum length of a string defined in the ABAP Dictionary (RAWSTRING, SSTRING, STRING). If the string is unlimited, the constant abap_max_db_string_ln or abap_max_db_rawstring_ln is returned from the type group ABAP. |
numofchar |
Same as for the function strlen, except that in this case when a non-Unicode double-byte code is used, a character that occupies 2 bytes is only counted once. |
strlen |
Number of characters in arg; blanks at the end of data objects with a fixed length are not counted, although they are counted in type string data objects. If you use a non-Unicode double-byte code, a character that occupies 2 bytes is counted twice. |
xstrlen |
Number of bytes in arg. |
语法示例:
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两个变量地址起始位置的距离