ABAP中内表的定义方法
分类:SAP 2006.9.22 10:14 作者:ericbu | 评论:1 | 阅读:4387
老师在上课的时候是这样定义的:
DATA: BEGIN OF itab_personel OCCURS 10,
name(20) TYPE c,
age TYPE i,
END OF itab_personel.
但今天看到《SAP程序设计》一书中有如下描述:
实际上这段语句也声明了一个标准内表,并分配初始内存大小为10行,OCCURS是ABAP3.0之前声明内表的关键字选项,不建议读者使用
TYPES: BEGIN OF itab occurs n,
...
f1...,
...
1
END OF itab.
相当于:
DATA itab TYPE STANDARD TABLE OF itab
WITH NON-UNIQUE DEFAULT KEY
INITIAL SIZE n
WITH HEADER LINE.
类似的还有语句:
TYPES TAB TYPE|LIKE linetype OCCURS n.
DATA ITAB TYPE|LIKE linetype OCCURS n [WITH HEADER LINE].
相当于:
TYPE|DATA itab TYPE|LIKE STANDARD TABLE OF linetype
WITH NON-UNIQUE DEFAULT KEY
INITIAL SIZE n
[WITH HEADER LINE].
2
上述几种形式均只适用于创建标准表,因为在旧的SAP版本中,标准表是唯一的内表类型
而在新版本的SAP中已经支持多种内表,如下图所示
ABAP中有下列三种内表类型 1.)标准表,表类型关键字为STANDARD TABLE,系统为该表的每一行数据生成一个逻辑索引。填充标准表时,可以将数据附加在现有行之后,也可以插入到指定的位置,程序对内表行的寻址可以通过关键字或者索引进行。在对表进行插入、删除等操作时,各数据行在内存中的位置不变,系统仅重新排列各数据行的索引值。
2.)排序表,表类型关键字为SORTED TABLE,也具有一个逻辑索引,不同之处是排序表总是按其表关键字升序排序后再进行存储,其访问方式于标准表相同。
3.)哈希表,表类型关键字为HASHED TABLE,没有索引,只能通过关键字来访问。系统使用哈希算法管理表中的数据,因而其寻址一个数据行的时间与表的行数无关。
注意点: 3
1.)扁平结构内表的默认(标准)表关键字是非数字和非内表的组件字段;
2.)选项NON-UNIQUE|UNIQUE(非特有|特有)决定了内表中具有相同关键字的数据行是否可以重复出现,其中,标准表不能用UNIQUE关键字,且无需特别指定NON-UNIQUE关键字,排序表可以用NON-UNIQUE或者UNIQUE关键字;哈希表不能用NON-UNIQUE关键字,且必须指定UNIQUE关键字(不难理解,因为哈希表仅通过关键字的hash值进行寻址)
3.)使用INITIAL SIZE n为内表分配初始内存大小时,尽量给n指定一个合适的值,如果初始n值小于所需,系统会根据需要自动要求增加内存大小,这个过程需要占用一定的时间(消耗系统资源),如果n值过大,实际数据的行数少于定义,则会造成内存分配的浪费。所以应该尽量使n值接近实际需要。如果n值为0或者不指定的话,程序会为内表对象分配8KB大小的内存。所以,如果内表比较小,不要把该值设为0,以避免内存浪费!
内表定义示例
TYPES: BEGIN OF address,
street(20) TYPE c,
city(20) TYPE c,
END OF address.
DATA: BEGIN OF company,
name(20) TYPE c,
addresses TYPE address,
4
END OF company.
DATA itab_company LIKE HASHED TABLE
OF company
WITH UNIQUE KEY name.
DATA itab_company_sorted LIKE SORTED TABLE
OF company
WITH UNIQUE KEY name.
看了《SAP程序设计》这本书才知道老师当时给我们讲的内容实在是用点过时,而且也比较肤浅,新的排序表和Hash表都没有给我们讲到,看来还是得靠自己啊!
参考文献:《SAP程序设计》 黄佳 机械工业出版社
5