1.引用类型z_ref数据对象myref在程序中的声明方式:
DATA myref TYPE z_ref.
CREATE DATA myref TYPE z_ref.
2.参照数据字典中的表类型生成内表对象或结构体:
DATA mytable TYPE z_table,”数据字典表类型,声明内表.
myline TYPE LINE OF z_table.”表类型的行结构,声明结构体.
3.取系统日期:SY-DATUM,
4.取系统时间:SY-UZEIT.0
5.系统字段定位:SY-FDPOS.字符比较结果为真时,此字段将给出偏移量信息.
6.系统字段SY-FDPOS给出字符的位置信息.(P109)
7.系统字段SY-INDEX记录循环语句中的循环次数
8.操作内表行结束后系统字段SY-TABIX返回该行索引.对于所有行操作,如果
操作成功,系统变量SY-SUBRC返回0,否则返回非0值.
9.系统用户名:SY-UNAME.
10.SY-HOST?屏幕序号:sy-dynnr.
11.OK代码:SY-UCOMM或SYST-UCOMM
12.屏幕组ID:SY-DYNGR.
13.常量声明:CONSTANT const(len) TYPE type|LIKE dobj [DECIMALS dec]
[V ALUE val].
14.确定数据对象属性:DESCRIBE FIELD f [LENGTH l] [TYPE t [CONPONENTS
n]] [OUTPUT-LENGTH o] [DECIMALS d] [EDIT MASK m] [HELP-ID h].
15.数据赋值:MOVE source TO destination.或destination = source.
16.设定初始值:CLEAR F.
17.检查字段是否为初始值:f IS INITIAL….
18.检查字段是否被分配:fs IS A SSIGNED…..
19.检查过程中的参数是否被实参填充:p IS [SUPPLIED|REQUESTED]….
20.检查数据对象的值是否属于某范围之间:f1 BETWEEN f2 AND f3…..
21.检查数据对象f的内容是否遵从某个选择表的逻辑条件:f in seltab….
22.WRITE: /10 g,”在10个空格后输出变量g
/(8) time using edit mask ‘__:__:__’.”输出的变量time保持8位的长度.
23.将光标移动到下一行:SKIP.
24.强制结束循环:EXIT,STOP或REJECT.
25.循环的中止:CONTINUE无条件中止当前循环并开始下一轮循环,CHECK条
件为真时循环,为假时结束本次循环并开始下一轮循环,EXIT无条件中止并退出整个循环.
26.将字符串左移:SHIFT string.
27.连接字符串:CONCATENATE s1 s2 …..sn INTO s_dest [SEPARATED BY sep].
如果结果出现被截断的情况,将SY-SUBRC返回4,否则返回0.符号&用于在字
字符串换行时的连接.
28.根据分隔符sep拆分字符串:SPLIT s_source AT sep INT O s1 s2 ……sn.使用内
表操作可以避免被截断的情况:SPLIT s_source AT sep INTO TABLE itab.此语句根据子串数目生成n行的内表.
29.循环输出内表的每一行数据:LOOP AT itab INTO text.ENDLOOP.
30.替换字段内容:REPLACE str1 WITH str2 INTO s_dest [LENGTH len]. 字段
SY-SUBRC的返回值为0时表示己成功替换.
31.确定字段长度:[COMPUTE] n = STRLEN( str ).
32.删除字符串中的多余空格:CONDENSE
33.字符转换,如将ABC转换为abc:TRANSLATE
34.创建一个可以排序的格式:CONVERT TEXT.
35.用一个字符串覆盖另一个字符串:OVERLAY
36.WRITE TO赋值时将忽略数据对象的类型,而将其视为字符类型数据.
37.字符串比较中的换码字符:#,用于转换比较时使用的通配符:*或+.及进行区分
大小写,空格的比较,如#A表示比较大写的A.
38.定位操作子串:strName[+0][(1)].
39.字段符号,数据引用:动态数据对象.
40.子过程定义:FORM subroutine_name USING parameters1
parameters2…. ….ENDFORM.
41.子程序调用:PERFORM subroutine_name USING actual_parameters1 p2…. (其
中USING可换成CHANGING)
42.ULINE.输出下划线.
43.错误查看:ST22
44.程序打包release:SE01:找到对应的程序,点开后点上面小汽车,再选中上面的
后再点小汽车.点check.程序修改后需要重新打包.
45.制作T-CODE:SE93,TCODE应按顺序编号:ZMF+流水号,我的程序名
46.创建table:t-code:se11,attributes:Delivery class:C.开发类别:ZFI,当自定义Field
type时,名称需为Z+…..格式.->设置技术属性(Technical Setting):Logical
storage parameters中Data class:APPL1,Size category:4 创建function
group:SE80,创建好后将创建的TABLE挂接到function grouph上去:用se11查出table,点utilites->table maintenance generator:Authorization
groups:&NC&,Function group中填刚才创建的功能组名称->one
step->overview screen中必须填未使用的number,此处screen number与table 是一一对应的关系,也可让点系统上面的按钮:find screen number来自动搜索适合的scr. Number.->create,成功后,找到对应的function group中的screen number双击即可看到生成的代码.需要修改域名可在function group中的
element list或layout中.-->se93创建t-code,start object选transaction with
parameters(parameter transaction)->default values
for->transantion:SM30->Default Values->name of screen
field:viewname\update,value:table name\X.
47.field-sign:,field—option:,field-low:表示选择条件中起始值
48.在where子句中如果只有一个表的话,可以不用指定表名.
49.获取用户IP地址及用户名:
call function 'TH_USER_INFO' " Get user IP,hostname
importing
hostaddr = iporg”转化前的IP地址
terminal = host”计算机名
exceptions
others = 1.
"Conv.IP addr to format 'xxx.xxx.xxx.xxx'
call function 'ZGJ_IPADR2STRING' "Conv.IP addr
exporting
ipadr = iporg”转化前的IP地址
importing
string = ipdec.”转化后的最终需要的IP地址
50.删除内表中数据完全相同的行,只保留一行: delete adjacent duplicates
from itab1 COMPARING
51.spro:后台设定
52.输出选择框write:/ itab1-flag as checkbox
第四章ABAP基础
4.1.5 程序运行
例:
REPORT z_calling_program.
START-OF-PROGRAM.
WRITE ‘This program calls another program.’.”此内容在输出界面看不到SUBMIT z_simple_program.”上面的输出被此程序覆盖.
如果改用SUBMIT AND RETURN来调用则可以输出以上内容.
2.结束程序:LEA VE PROGRAM.可在任意点强制结束当前运行的程序.
4.1.6 内存管理
SAP程序同一个用户和系统可进行最多6个SAPGUI主会话.
4.2.1 数据定义
TYPES:BEGIN OF t_staff,
S_no(3) type n,
Name(20),
END OF t_staff.
DATA staff TYPE t_staff.
上例中定义了一个结构类型t_staff,并根据其声明了一个结构体对象staff.
数据类型中的扁平结构与纵深结构:
扁平类型:运行时长度固定的类型.
纵深类型:运行时长度可峦的类型.
注意:
1.其中C,N,T,D,I,F,P,X为定长类型,即在运行期间长度不能改变.
2.类型T,D,I,F的数据存储长度是固定的,不能指定参照其生成的数据对象占用的内存字节数.
3.基于类型C,N,P,X生成的数据对象需要在声明时指定其长度.否则取默认值.
4.如果在声明一个数据对象时未指明其数据类型,则该数据默认为C类型.
5.类型I的数值范围:-231到231-1的整数.如果运算时出现非整型结果则进行四舍五入取值.而不是截断小数.
6.类型P用于声明小数字固定的压缩数,其占据内存字节数和数值范围取决于定义时指定的整个数据的大小和小数点后位数,如果不指定小数字,则将其视为I类型数据.有效大小可以是从1~16字节的任意值,小数点后最多允许14个数字. 7,类型F为浮点数,浮点意思是数字在内存中以字节形式表示,数值范围:1*10-307到1*10308,因系统将F类型转换为二进制数,所以可能出现舍入误差,若用户要求较高精度且数值较大时,应使用P类型数据.
8.长度可峦的内置类型String, XString是通过引用实际动态的数据对象的固定内存地址来操作.
4.2.3 程序内部数据定义
参照自定义类型或内置类型生成数据的语法格式:
TYPE S|DATA …TYPE l_type…
参照程序中已经声明的数据对象生成新数据语法:
TYPES|DATA …LIKE dobj…
3.结构类型和结构体
参照结构类型生成的数据对象称为结构体.
TYPES|DATA:BEGIN OF structure.
k1[TYPE type |LIKE dobj]…,
k2[TYPE type |LIKE dobj]…,
…
k n[TYPE type |LIKE dobj]…,
END OF structure.
参照生成:
参照结构生成:TYPES|DATA structure TYPE str_type |LIKE str_dobj...
参照数据库表生成:TYPES|DATA structure TYPE dbtab.
4.表类型和内表
表类型的对象称为内表.
4.2.4 数据字典中的类型
●数据元素(Data elements),相当于ABAP中的基本类型和引用类型.
●结构(Structures),由数据元素字段构成,对应ABAP中的结构类型.
表类型(Table types),对应ABAP中的表类型.
数据字典中的数据类型与ABAP中的中数据类型对应关系:
4.2.5 程序中的数据对象
1.文字对象
当字符文字长度超过编辑器的一行时,可以使用”&”进行连接,避免因换行而产生的多余空格,如:long = ‘This is ‘&
‘a long sentence’.
如果需要输出“’”,则需要在前面多加一个“’”转回愿意.
2.有名称的数据对象
常量声明:
CONSTANT: const(len) TYPE|LIKE dobj [DECIMALS dec] V ALUE val.
结构体常量声明(每个组件必须指定初始值):
CONSTANT:BEGIN OF structure,
str1 TYPE|LIKE dobj [DECIMALS dec] V ALUE val,
str2 TYPE|LIKE dobj [DECIMALS dec] V ALUE val,
...,
strn TYPE|LIKE dobj [DECIMALS dec] V ALUE val,
END OF structure.
3.系统数据对象(见附表)
4.查明数据对象属性
DESCRIBE FIELD f LENGTH len.此语句将字段f的长度写入变量len.
●LENGTH:确定数据对象长度.
●TYPE: 确定数据对象类型.
●OUTPUT-LENGTH:确定实际输出长度.
●DECIMALS:确定P类型小数位长.
●EDIT MASK:确定在数据字典中定义转换例程.
●HELP-ID:确定在数据字典中定义的F1帮助信息.
4.3 基本数据操作
4.3.1数据赋值
●MOVE source TO incept.等介于:incept = source.
●CLEAR dobj.将数据对象dobj还原为初始值.
●结构体间赋值:struct2 = struct1.(组件结构相同).
●MOVE-CORRESPONDING struct1 TO struct2.(部分组件结构相同).
4.3.2类型转换(见附表).
4.3.3数值运算
两个结构体的同名字段之间可以整体进行算术运算:
ADD-CORRESPONDING struct1 TO struct2.
SUBTRACT-CORRESPONDING struct1 FROM struct2.
MULTIPLY-CORRESPONDING struct2 BY struct1.
DIVIDE-CORRESPONDING struct2 BY struct1.
以上将对两个结构体中的同名字段进行相应运算(非数值类型数据会引起错误).
2.数学函数
任意类型参数的函数列表:
注意:函数名与左括号间不能有空格,括号与参数间必须有空格.
4.3.4数据输出
输出格式化选项:
注:用户主记录System->User profile->Own data(SU01).
4.3.5逻辑表达式
通用逻辑表达式列表:
3.IS操作符
●...f IS INITIAL...:检查字段f是否为初始值.
●...fs IS ASSIGNED...:检查字段符号是否被分配.
●...p IS [SUPPLIED|REQUESTED]...:检查过程中的参数是否被实参填充.
4.BETWEEN操作符
●...f1 BETWEEN f2 AND f3...:检查数据对象的值是否属于特定范围之间.
5.IN操作符(P110)
●...f IN seltab...:检查一个数据对象的内容是否遵从某个选择表的逻辑条件.
6.组合逻辑表达式
●AND:与.
●OR:或.
●NOT:非.
注:括号与操作数间至少要有一个空格,如:IF ( c > n ) AND ( c < f ).
4.4结构控制
程序代码分三种结构:
●顺序结构:语句逐行执行.
●分支结构:根据不同的条件执行不同语句块.
●循环结构:反复执行某个语句.
4.4.1分支控制
1.IF/ENDIF结构:
IF
ELSEIF
......
ELSE.
ENDIF.
注:可嵌套.
2.CASE/ENDCASE结构:
CASE f.
WHEN f11 [OR f12 OR ...].
......
[WHEN OTHERS.]
ENDCASE.
其中,f为变量,f ij可以是变量或者固定值.
4.4.2循环控制
1.无条件循环
DO [n TIMES].
ENDDO.
说明:n为循环次数,可以是文字或变量,如果没有限定n值,则必须用EXIT,STOP 或REJECT等语句强制结束循环.DO循环可嵌套,SY-INDEX为当前循环次数.
2.条件循环
WHILE
ENDWHILE.
注:可嵌套,其它同上.
3.循环中止
●CONTINUE:无条件中止当前本轮循环,开始下一轮循环.
●CHECK:条件中止当前本轮循环(条件为假时), 开始下一轮循环.
●EXIT:无条件完全中止当前循环,继续循环结束语句(ENDDO,ENDWHILE等)
后面的代码,如果在嵌套循环中,系统仅退出当前循环.
4.5处理字符数据
4.5.1字符数据
1.连接字符串
CONCATENATE s1 s2 ... sn INTO s_dest [SEPARATED BY sep].
注:所有字符串操作将忽略s1....sn中的尾部空格(如需保留空格,可使用指定偏移量).
如果出现截断情况,将SY-SUBRC设为4,否则返回0.
2.拆分字符串
SPLIT s_source AT sep INTO s1 s2 ... sn.
如果所有子串足够长且不必截断任何部分,则将SY-SUBRC设为0,否则返回4, 如果源字符串能够拆分的子串多过指定的数目,则源子串最后的剩余部分包括其后的分隔符都将写入最后一个子串,要避免这种情况,需要使用内表进行操作: SPLIT s_source AT sep INTO TABLE itab.在该形式中,根据子串数目生成n行的内表.例如:
DATA:text type string,
itab TYPE TABLE OF string.
text = ‘ABAP is a programming language’.
SPLIT text AT space INTO TABLE itab.
LOOP AT itab INTO text.
WRITE / text.
ENDLOOP.
3.查找子串模式
SEARCH c FOR str.在字段c中查找字符串str.如果找到,则将SY-SUBRC返回0,SY-FDPOS返回字段c中该字符串的位置(从左算起的字节偏移量),否则
SY-SUBRC返回4,查找模式有以下几种:
●str 搜索str并忽略尾部空格.
●.str. 搜索str,但不忽略尾部空格.
●*str 搜索以str结尾的单词.
●str* 搜索以str开始的单词.
REPORT z_string_search.
DATA string(30) TYPE c VALUE 'This is a testing sentence.'. WRITE: / 'searched','sy-subrc','sy-fdpos'.
SEARCH string FOR 'X'.
WRITE: / 'X', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER
'sy-fdpos'.
SEARCH string FOR 'itt '.
WRITE: / 'itt ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER
'sy-fdpos'.
SEARCH string FOR '.e .'.
WRITE: / '.e .', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER
'sy-fdpos'.
SEARCH string FOR '*e '.
WRITE: / '*e ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER
'sy-fdpos'.
SEARCH string FOR 's* '.
WRITE: / 's* ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER
'sy-fdpos'.
输出结果如下:
searched sy-subrc sy-fdpos
X 4 0
itt 4 0
.e . 4 0
*e 0 18
s* 0 18
4.替换字段内容.
REPLACE str1 WITH str2 INTO s_dest [LENGTH len].搜索s_dest中前len个字符中的子串str1,用str2来替换它,如果成功,SY-SUBRC返回0,否则还回非0值. REPORT z_replace.
DATA name TYPE string.
name = 'Michael-Cheong'.
WHILE sy-subrc = 0.
REPLACE '-' WITH ' ' INTO name.
ENDWHILE.
WRITE / name.
输出结果: Michael Cheong
5.确定字段长度
n = STRLEN( str ).函数将str作为字符数据类型处理,不考虑其实际类型,也不进行转换.计算其首字符到最后一个非空字符的长度,不包括结尾空格.
6.其它操作语句
●SHIT:将字符串整体或子串进行位移.
●CONDENSE:删除字符串中的多余空格.
●TRANSLATE:字符转换,如将ABC转换为abc.
●CONVERT TEXT:创建一个可以排序的格式.
●OVERLAY:用一个字符串覆盖另一个字符串.
注:CO,CN,CA,NA比较时区分大小写,且尾部空格也在比较范围之
内,CS,NS,CP,NP比较时忽略尾部空格且不区分大小写,比较结束后,如果结果为真,SY-FDPOS将给出s2在s1中的偏移量信息.模式表示可以使用通配符,”*”用于替代任何字符串,”+”用于替代单个字符.
换码字符使用:
●指定大小写(如#A,#b).
●通配符”*”(输入#*),将其转回原义.
●通配符”+”(输入#+),将其转回原义.
●换码符本身”#”(输入##),将其转回原义.
●字符串结尾空格(输入#__),指定比较结尾空格.
4.5.3定位操作子串
str[+position][(len)].从字符串str中的position位开始取出长度为len的子串.
可动态指定偏移量及长度的情况(即position及len可为变量):
●用MOVE语句或赋值运算符给字段赋值时.
●用WRITE TO语句向字段写入值时.
●用ASSIGN将字段分配给字段符号时.
●用PERFORM将数据传送给子程序时.
off = 6.
len = 2.
date+off(len) = ‘01’.
4.6使用内表
types定义的并不是结构体对象,只是结构类型,不能作为工作区,当定义的内表没有表头行(工作区)时,必须为其定义一个结构体作为工作区,否则无法使用此内表.如果没有给内表定义工作区,则在定义内表时必须声明表头行(with header line). DATA:BEGIN OF line, "work area(structure)结构类型且结构体对象
num TYPE i,
sqr TYPE i,
END OF line,
"无表头行内表,内表定义都使用data关键词.
itab TYPE(LIKE) STANDARD TABLE OF line WITH KEY table_line. DATA DIRTAB LIKE CDIR OCCURS 10 WITH HEADER LINE.定义标准内表DO 5 TIMES.
line-num = sy-index.
line-sqr = sy-index ** 2.
APPEND line TO itab.
ENDDO.
LOOP AT itab INTO line.
WRITE:/ line-num,line-sqr.
ENDLOOP.
CLEAR itab.
注:
1.TYPES与DATA区别:TYPES是用来定义某种类(型)的,需(用DATA语句)实例化以后才可以使用,而DATA是用来定义数据对象(实例变量)的,对于用DATA直接定义的结构体对象(不参照其它结构类型),其同时也是一个结构类型.
2.TYPE与LIKE区别:TYPE后面跟随的只能是某种类(型),而LIKE后面可以跟随类型或实例对象,参照结构体对象生成内表时只能用LIKE,不能用TYPE,因为结构体对象不是类型,只是一种实例对象,参照结构类型生成内表时可以用LIKE也可以用TYPE.其中通过LIKE定义的内表直接拥有参照结构类型的元素结构,而通过TYPE定义的内表只能间接拥有被参照结构类型的元素结构,结构类型不能作为内表的工作区,只有结构体对象才可以.
内表定义语法:
1.标准表:可指定或不指定关键词,可重复.逻辑索引,操作数据时数据内存位置不峦,系统只重排数据行的索引值.
DATA itab TYPE|LIKE [STANDARD] TABLE OF structure [WITH KEY comp1 ... compn(DEFAULT KEY) WITH HEADER LINE INITIAL SIZE n].
2.排序表:可指定唯一或不唯一的关键词,也可不指定,逻辑索引,按关键词升序存储.
DATA itab TYPE|LIKE SORTED TABLE OF structure [WITH
NON-UNIQUE(UNIQUE) KEY comp1 ... compn(DEFAULT KEY) WITH HEADER LINE INITIAL SIZE n].
3.哈希表:必须指定唯一关键词.无索引
DATA itab TYPE|LIKE HASHED TABLE OF structure WITH UNIQUE KEY comp1 ... compn(DEFAULT KEY) [WITH HEADER LINE INITIAL SIZE n].
注:如果n值为0或不指定的话,程序会为内表对象分配8KB大小内存,所以,如果内表比较小,不要把该值设为0,以避免内存浪费.
旧版标准表定义语法:
DATA itab TYPE|LIKE [STANDARD] TABLE OF structure OCCURS n.或者DATA:BEGIN OF itab OCCURS n,
...,
fi...,
END OF itab.
注:CLEAR itab[].表示操作的是内表对象.而CLEAR itab.当itab有表头行时表示操作表头行,如无表头行时表示操作内表对象.
当一个操作语句结束后,SY-TABIX返回该行的索引值,对于所有行操作,如果访问成功,SY-SUBRC返回0,否则返回非0值.
4.插入行—INSERT
●INSERT structure INTO itab INDEX idx.无表头行索引表,itab的行数应大于或
等于idx-1.否则失败
●INSERT itab INDEX idx.有表头行索引表.
●对于哈希表,系统按关键词将新行插入特定位置.
●INSERT structure INTO|INITIAL LINE INTO TABLE itab.此语句对于标准表
来说与append效果相同,对于排序表来说,插入的行不可以打乱按照关键词排序的顺序,否则插入不成功,对于哈希表来说,插入过程中系统按照关键词对行进行定位.INITIAL关键词是用于向内表中插入结构中各类型的初始值的.
●INSERT LINES OF itab1 [FROM n1] [TO n2] INTO [TABLE] itab2 [INDEX
idx].将内表中部分或全部数据行整体插入到另一内表中,指定行数时
itab1,itab2必须为索引表,指定TABLE关键词时,itab2可以是任意内表.此方式比其它方式快20倍左右.
5.附加行—APPEND(只能操作索引表)
APPEND [structure TO|INITIAL LINE TO] itab.
APPEND LINES OF itab1 [FORM n1] [TO n2] TO itab2.
6.聚集附加—COLLECT
COLLECT line INTO itab.对于需要附加的数据,如果在内表中存在关键词内容与其相同的数据行,则此语句将需要附加的数据累加到内表中的这一行上,而不会另外再添加一行,操作成功后,SY-TABIX返回被处理过的行的索引.
注:关键词以外的所有字段必须是数字类型
7.读取行—READ(可用于任何类型内表)
●READ TABLE itab [INTO wa|ASSIGNING
表中的单行数据. ASSIGNING表表示指派给字段符号.
●READ TABLE itab FROM structure [INTO wa|ASSIGNING
相同的工作区中的关键词内容全部相同的内表数据.
●READ TABLE itab WITH TABLE KEY field1 = v1 ... field2 = v2 [INTO
wa|ASSIGNING
●READ TABLE itab WITH KEY field1 = v1 ... field2 = v2 [INTO
wa|ASSIGNING
8.修改行—MODIFY
●MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1 f2 ...].如果内表
包含的行数少于idx,则不更改任何行.
●MODIFY TABLE itab FROM wa [TRANSPORTING f1 f2 ...].根据工作区wa
中关键词修改内表行, TRANSPORTING表示修改指定字段值.
●MODIFY itab FROM wa TRANSPORTING f1 f2 ... WHERE condition.修改符
合WHERE子句中条件的内表中的指定字段值.
9.删除行—DELETE
●DELETE itab INDEX idx.根据索引删除内表行.
●DELETE TABLE itab FROM wa.根据工作区关键词删除行.
●DELETE TABLE itab WITH TABLE KEY field1 = v1 ... field2 = v2.根据指定
关键词值删除行.
●DELETE itab [FROM n1] [TO n2] [WHERE
10.循环处理--LOOP
LOOP AT itab [INTO wa] [FROM n1] [TO n2] [WHERE condition].
ENDLOOP.
4.6.3操作整个内表
1.排序
SORT itab [ASCENDING|DESCENDING] [AS TEXT] [STABLE]
[BY f1 [ASCENDING|DESCENDING] [AS TEXT]
......
f1 [ASCENDING|DESCENDING] [AS TEXT]]
说明:
●ASCENDING|DESCENDING:升序或降序.默认升序.
●AS TEXT:根据当前语言按字母顺序排序字符字段,否则按字符平台相关内部
编码进行排序.
●STABLE:保持排序前后不需要改变的数据行的相对顺序.
2.控制级操作(用于总计,缩进,格式控制等)
AT FIRST|LAST|NEW f|END OF f.
ENDAT.
说明:
●FIRST:当循环为内表的第一行时,执行语句块中语句.在工作区中,系统用*填
充所有关键词内容.
●LAST: 当循环为内表的最后一行时,执行语句块中语句. 在工作区中,系统用
*填充所有关键词内容.
●NEW f:字段f前面(即左边)的全部字段内容之一不同于上一行时, 执行语句
块中语句.在工作区中,系统用*填充f后面所有关键词内容.
●END OF f:如果下一行行组中的任何字段内容不同于上一行, 执行语句块中
语句.在工作区中,系统用*填充f后面所有关键词内容.
注:在控制级操作期间,在工作区中,对于非标准关键词段,将全部进行初始化,在执行完控制操作后(即ENDAT语句后)工作区中的数据将全部还原到进入控制级操作语句前(即进入AT前)状态.
3.初始化内表
●CLEAR itab.:带表头行时只清空表头行,不带表头行时清空整个内表.
●CLEAR itab[].:只清空整个内表对象数据.不清空表头行.
●REFRESH itab或REFRESH itab[].:只清空整个内表对象数据.不清空表头行.
●FREE itab.或FREE itab[].:只清空整个内表对象数据.不清空表头行,同时释放
内存.
●......itab IS INITIAL....:检查内表是否为空.
4.整体复制内表
●MOVE itab1 TO itab2.:如果两表都存在表头行,则此语句只复制了表头行.
●MOVE itab1[] TO itab2[].:指定表体复制.
●MOVE itab1[] TO itab2.:表itab2无表头行时才成立.
●itab2 = itab1.同上1
●itab2[] = itab1[].同上2
●itab2 = itab1[].同上3
5.比较内表大小
... itab1
4.6.4Extract Datasets
●FIELD-GROUP fg.行结构分配.
●INSERT f1 f2 ... INTO fg.生成字段组fg的具体字段结构.
●EXTRACT fg.将字段组填充给EXTRACT.
●SORT.排序.
●LOOP.
4.7动态数据对象
4.7.1字段符号
●FIELD-SYMBOLS
●ASSIGN f TO
●ASSIGN f[+i] [(j)] TO
●ASSIGN (f) TO
4.7.2数据引用
TYPES t_dref TYPE REF TO DATA.
DATA dref TYPE REF TO DATA.
4.8模块化技术
4.8.2子程序
1.定义:
FORM subr [[USING [V ALUE(p1)]... ] [TYPE t|LIKE f]...] [TYPE ANY]
[CHANGING [V ALUE(p1)] ... ] [TYPE t|LIKE f]...] [TYPE ANY].
ENDFORM.
注:
●V ALUE参数表未示值传递,此方式在子程序调用后实参的值不会被改变.
●无V ALUE参数时表示引用传递,会改变实参的值.
●USING与CHANGING无任何区别.
●位于两个子程序间的代码不属于任何事件块.
●参数传递时不存在类型转换,要求必须兼容.
2.调用:
PERFORM subr [USING p1 ... pn] [CHANGING pi ... pj].
4.8.3功能模块(p153)
4.8.5源代码复用
1.包含程序
包含程序是单纯的代码复用,不是可执行程序,不能单独运行,必须被其它程序调用,包含程序不能调用自身.
INCLUDE incl.包含程序调用,此语句必须独占一行.
2.宏:(语句块中最多只能包含9个占位符&1...&9).
例:
DATA:result TYPE i,
int1 TYPE i VALUE 1,
int2 TYPE i VALUE 2.
DEFINE operation.
result = &1 &2 &3.
output &1 &2 &3 result.
END-OF-DEFINITION.
DEFINE output.
write: / 'The result of &1 &2 &3 is',&4.
END-OF-DEFINITION.
operation 1 + 2.
operation int2 - int1.
4.9.1静态错误检查
1.语法检查:用Check键.
2.扩展语法检查(SLIN):在ABAP初台界面输出程序名后,选择
Program->Check->Extended Syntax Check. Standard.
4.9.2运行时错误控制
1.可捕捉的错误
CATCH SYSTEM-EXCEPTIONS exc1 = rc1 ... excn = rcn.
...
ENDCATCH.
其中exci表示一个单一可捕捉错误或者一个ERROR类,rci则代表一个数字.如果其中错误之一在CATCH和ENDCATCH语句之间出现,程序就不会中止,而是直接跳至ENDCATCH后,把系统指定的错误代码rci赋给字段SY-SUBRC.此语句可嵌套.例如:
DATA:result1 TYPE p DECIMALS 3,
number TYPE i VALUE 11.
CATCH SYSTEM-EXCEPTIONS arithmetic_errors = 5.
DO.
number = number - 1.
result1 = 1 / number.
WRITE: / number,result1.
ENDDO.
ENDCATCH.
IF sy-subrc = 5.
WRITE / 'division by zero!'.
ENDIF.
2.不可捕捉的错误(通过ST22查看,在SAP系统中保存14天,可通过Keep功能保存更长时间).
第六章数据库操作
6.2.1表字段
在数据字典中,每创建一个数据库表后,都将同时生成一个同名的结构化数据类型.
6.2.2外部关键词
外部关键词内容必须在其对应的约束表(check table)中存在,否则无法插入.
6.2.3技术设定
1.数据类型(data class):
●APPL0(Master data),较少需要被修改的系统数据表,如员工个人信息.
●APPL1(Transaction data),需要经常被修改的数据表,如产品库存量表.
●APPL2(Organization and customizing),系统定制数据表,在系统安装后很少需
要修改,如国家代码等.
2.数量级别:
0 0 to 6,600
1 6,600 to 26,000
2 26,000 to 100,000
3 100,000 to 420,000
4 420,000 to 34,000,000
3.缓冲(Buffering)机制
如果在缓冲设定中选择了Buffering switched on项,则需要设定其缓冲类型(有Full,Single-record和Generic三种).
缓冲机制的意义在于首次查询时将数据表中的数据放入应用服务器缓冲区,以提高后续查询效率,要注意最好不要对经常需要的数据库表设置该机制,对于经常读取但很少更新或者通常只有在60秒后才可能被其他应用服务器程序修改的数据库表,开启缓冲机制可以上百倍地提高效率.
4.Log data changes用于设定表中的数据修改时是否在系统日志中记录.
6.2.4索引
一个数据库表可以包含一个主索引(Primary Index)和多个附属索引(Secondary Indexes).主索引只包含表关键词和指向整个数据条目的指针,由系统自动生成并在添加数据库条目时进行维护.索引中的数据已经排序.
6.3.1SELECT语句
SELECT
[WHERE
[HA VING
●HA VING子句用于限定ORDER BY子句中数据条目组的选择条件
1.选择单行数据:
●SELECT SINGLE * FROM tab INTO wa_tab WHERE
据.