内表详细讲解.docx
- 文档编号:6830891
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:13
- 大小:20.13KB
内表详细讲解.docx
《内表详细讲解.docx》由会员分享,可在线阅读,更多相关《内表详细讲解.docx(13页珍藏版)》请在冰豆网上搜索。
内表详细讲解
一、内表是什么
用处:
当程序中处理有固定结构的数据时候,就需要使用内表,特别是内表是在程序中存储数据库表的载体。
内表:
Internalmemorytable内存中的表,是外设(屏幕、磁盘,打印机等)和数据库表数据交换的中介。
注意:
在ABAP语言中不提供二维数组,内表相当于二维数组,它是一个表示内存的二维数据结构(m行*n列)。
与传统二维数组的区别,二维数组的m*n在编译期就已经确定多少个房间了,而内表的行数量是可以动态拓展的.
二、内表的属性
内表和其他ABAP数据结构一样,包括数据类型(datatypes)和数据对象(dataobjects)。
内表类型是内表在程序或者字典库(ABAPdictionary)的抽象描述,可以用内表类型来创建一个具体的内表对象。
ABAP中有两种数据类型:
内表和结构体(structure)。
一个内表的数据类型包括:
行类型(linetype)、主键(key)、表类型(tabletype)。
(一)、Linetype内表行类型
1. 确定行类型就是确定行中的字段和字段类型
2. 用结构体或透明表可以作为内表的行类型
3. 内表可以当成数组.
4. 采用只有一个字段的结构体或一个不可再分的类型作为行类型,此内表就相当于一个数组
(二)、Keydefinition.键定义(和主键很像)
1. Tablekey表键
2. Tablekey:
unique(唯一)/non-unique(不唯一,区别数据库,可以有重复记录)
3. Components:
构成键的字段,顺序敏感,顺序不同 tablekey也就不一样
(三)、Dataaccesstype数据访问类型
1. Indexaccess根据行号访问
2. Keyaccess根据tablekey访问
三、内表的三种类型
1. Standardtable
适合通过index访问表的每条记录情形。
访问时间和表的记录数目大小成线性关系。
访问:
indexaccess(推荐),keyaccess
Tablekey:
non-unique
2. Sortedtable
适合当你输入记录时就根据主键排序的情形。
天生就有排序的功能,插入数据后就会按照tablekey排序
访问:
indexaccess,keyaccess(推荐)
Tablekey:
unique/non-unique
3. Hashedtable
适合于通过主键来访问操作表的记录的情形。
无论表记录的多少,访问时间是常量。
当你想要创建一个类似数据库表的内表时,就使用Hashedtable。
数据量相当大时考虑用这种内表。
访问:
onlykeyaccess
Tablekey:
unique.
四、内表的操作
(一)、创建内表
DATA:
BEGINOFTY_OUTLIST,
USERLIKEAGR_USERS-UNAME,"用户名
NAMELIKEADRP-NAME2,"用户姓名
DEPARTLIKEADCP-DEPARTMENT,"部门
ROLENAMELIKEAGR_USERS-AGR_NAME,"用户角色
ROLETEXTLIKEAGR_TEXTS-TEXT,"角色描述
ENDOFTY_OUTLIST.
DATA:
T_OUTLISTLIKESTANDARDTABLEOFTY_OUTLISTWITHHEADERLINE.
(二)、整个内表的操作
1、内表赋值
内表的整体赋值:
如果想一次将内表的全部内容复制到另一内表中,请使用MOVE语句或赋值操作符(=),用法如下:
MOVE
report:
zdz.
DATA:
BEGINOFLINE,
COL1,
COL2,
ENDOFLINE.
DATAETABLIKELINEOCCURS10WITHHEADERLINE.
DATAFTABLIKELINEOCCURS10.
LINE-COL1='A'.LINE-COL2='B'.
APPENDLINETOETAB.
*因为ETAB是带表头行的,所以ETAB[]才是内表,ETAB是工作区
*所以MOVEETABTOFTAB.会报错(类型不匹配)
MOVEETAB[]TOFTAB.
LOOPATFTABINTOLINE.
WRITE:
/LINE-COL1,LINE-COL2.
ENDLOOP.
2、内表初始化
初始化内表的作用是清空内表所有的数据行,将内表恢复到填充或赋值之前的状态。
初始化内表要注意的问题仍然是初始化有表头行和无表头行的内表的区别,以及初始化内表和表头行的区别。
(1). Clear用法:
clearitab。
正确的应该是:
对与一个有工作区的内表itab,clearitab清空的是工作区,而不清空内表;clearitab[]是清空内表,而不清空工作区。
REPORTdemo_int_tables_append.
*append...to
DATA:
BEGINOFwa,
col1
(1)TYPEc,
col2TYPEi,
ENDOFwa.
DATAitabLIKEstandardtableofwawithheaderline.
DO3TIMES.
itab-col1=sy-index.itab-col2=sy-index**2.
APPENDitab.
ENDDO.
LOOPATitab.
WRITE:
/itab-col1,itab-col2.
ENDLOOP.
skip.
*不是说带表头行的内表,itab代表表头行(工作区),itab[]才代表内表吗?
*在loopat循环中itab就代表内表,而不是表头行(工作区)
loopatitabintowa.
write:
/wa-col1,wa-col2.
endloop.
skip.
*不管什么时候itab[]都代表内表本身
loopatitab[]intowa.
write:
/wa-col1,wa-col2.
endloop.
skip.
*在不在loop循环中的时候才是itab代表表头行,而itab[]代表内表本身
write:
/itab-col1,itab-col2.
skip.
*对与有表头行的内表,clearitab和clearitab[]的区别
clearitab.
clearitab[].
LOOPATitab.
WRITE:
/itab-col1,itab-col2.
ENDLOOP.
*下边会多输出一个零,是工作区中的默认值(字符型默认值为空,数值型默认值为0)
write:
/itab-col1,itab-col2.
(2) . Refresh和Free
这两个关键字的作用基本相同,都是只能清空内表中的数据,而不能清空内表同名工作区中的数据。
区别就是refresh并不会同时将预先分配给内表的内存释放,而free则同时释放了预先分配给内表的内存(默认的是8K)。
clear也不释放掉内存。
REPORTdemo_int_tables_append.
*append...to
*定义工作区wa
DATA:
BEGINOFwa,
col1
(1)TYPEc,
col2TYPEi,
ENDOFwa.
*下边定义了一个内表itab,(noworkarea,noheaderline)
DATAitabLIKEstandardTABLEOFwawithheaderline.
DO3TIMES.
wa-col1=sy-index.wa-col2=sy-index**2.
APPENDwaTOitab.
ENDDO.
LOOPATitabINTOwa.
WRITE:
/wa-col1,wa-col2.
ENDLOOP.
itab-col1='x'.
itab-col2=100.
*refresh和free一样都只是清空内表中数据,而不清工作区
refreshitab.
*freeitab只是清空了内表中数据,没清空工作取中数据
*freeitab.
*用ifitabisnotinitial来判别内表工作区是否为空
ifitabisnotinitial.
write/'itabisnotempty'.
endif.
*ifitab[]isinitial来判别内表是否为空
ifitab[]isinitial.
write/'itab[]isempty'.
endif.
write:
/itab-col1,itab-col2.
3、内表比较
“内表的表关键字在访问内表和内表排序中起着相当重要的作用,在内表定义语句中,使用WITHkey指定内表关键字,该项为可选项,如果不指定,则系统会使用默认(标准)关键字,如果程序员指定,则有以下形式:
1. 如果内表行是结构体,则可以指定结构体中的某几个字段作为内表关键字,该字段不能是内表或者引用类型,但是可以是嵌套的结构体。
REPORTdemo_structure.
types:
BEGINOFname,
title(5)TYPEc,
first_name(10)TYPEc,
last_name(10)TYPEc,
ENDOFname.
types:
BEGINOFmylist,
clientTYPEname,
numberTYPEi,
ENDOFmylist.
DATA:
listtypetableofmylist
withnon-uniquekeynumber
withheaderline.
2.如果内表的整行都是由基本类型字段组成,则可以将内表的整个行定义为表关键字。
如果内表字段本身是结构化类型,则不宜指定整行作为关键字段。
所以下边的做法是不好的。
REPORTdemo_structure.
types:
BEGINOFname,
title(5)TYPEc,
first_name(10)TYPEc,
last_name(10)TYPEc,
ENDOFname.
types:
BEGINOFmylist,
clientTYPEname,
numberTYPEi,
ENDOFmylist.
DATA:
listtypetableofmylist
withnon-uniquekeytableline
withheaderline.
3.如果不指定任何关键字,则系统会默认的选择关键字段。
(扁平结构内表的默认关键字段为非数字和非内表的组件字段)如果内表行是由单个基本类型组成,则默认关键字为整个行。
如果内表行中包含有内表类型字段,则没有默认关键字。
4.关键UNIQUEKEY(不可以出现关键字相同的数据行)/NON-UNIQUEKEY(可以出现关键字相同的数据行)是决定了内表中具有相同关键字的数据行是否可以重复出现,在标准内表中不能用UNIQUEKEY,而且不需要特别指定NON-UNIQUEKEY。
所以这个关键字在标准内表中一般都不需要写。
REPORT:
ZDZ.
DATA:
BEGINOFITABOCCURS10,
LAND(3)TYPEC,
NAME(10)TYPEC,
AGETYPEI,
WEIGHTTYPEPDECIMALS2,
ENDOFITAB.
ITAB-LAND='USA'.ITAB-NAME='Nancy'.
ITAB-AGE=35.ITAB-WEIGHT='45.00'.
APPENDITAB.
ITAB-LAND='USA'.ITAB-NAME='Howard'.
ITAB-AGE=40.ITAB-WEIGHT='95.00'.
APPENDITAB.
ITAB-LAND='GB'.ITAB-NAME='Jenny'.
ITAB-AGE=18.ITAB-WEIGHT='50.00'.
APPENDITAB.
ITAB-LAND='F'.ITAB-NAME='Michele'.
ITAB-AGE=30.ITAB-WEIGHT='60.00'.
APPENDITAB.
ITAB-LAND='G'.ITAB-NAME='Karl'.
ITAB-AGE=60.ITAB-WEIGHT='75.00'.
APPENDITAB.
SORTITAB.
LOOPATITAB.
WRITE:
/ITAB-LAND,ITAB-NAME,ITAB-AGE,ITAB-WEIGHT.
ENDLOOP.
SKIP.
SORTITABDESCENDINGBYLANDWEIGHTASCENDING.
LOOPATITAB.
WRITE:
/ITAB-LAND,ITAB-NAME,ITAB-AGE,ITAB-WEIGHT.
ENDLOOP.
在此创建有表头行的内表ITAB并用5行对其进行填充。
首先根据其标准关键字(LAND和NAME)进行排序。
然后根据定义为LAND和WEIGHT的排序关键字进行排序。
一般排序顺序定义为降序,但对于WEIGHT,定义为升序。
这就是为什么在第二个SORT语句之后包含NAME字段“NANCY”的行在包含NAME字段“HOWARD”的行之前输出。
4、内表排序
对于
(EQ、=、NE、<>、><、GE、>=、LE、<=、GT、>、LT、<)。
进行内表比较的第一个条件是它们包含的行数。
内表包含的行数越多,则内表就越大。
如果两个内表行数相同,则逐行、逐个组件进行比较。
如果表格行的组件本身就是内表,则进行递归比较。
如果使用等于操作符以外的操作符,则系统找到一对不相等的组件后就立即停止比较并返回该结果。
对于有表头行的内表,则可在表格名之后使用方括号([])以将表格工作区域和表格体区别开来。
DATA:
BEGINOFLINE,
COL1TYPEI,
COL2TYPEI,
ENDOFLINE.
DATA:
ITABLIKELINEOCCURS10,
JTABLIKELINEOCCURS10.
DO3TIMES.
LINE-COL1=SY-INDEX.
LINE-COL2=SY-INDEX**2.
APPENDLINETOITAB.
ENDDO.
MOVEITABTOJTAB.
LINE-COL1=10.LINE-COL2=20.
APPENDLINETOITAB.
IFITABGTJTAB.
WRITE/'ITABGTJTAB'.
ENDIF.
APPENDLINETOJTAB.
IFITABEQJTAB.
WRITE/'ITABEQJTAB'.
ENDIF.
LINE-COL1=30.LINE-COL2=80.
APPENDLINETOITAB.
IFJTABLEITAB.
WRITE/'JTABLEITAB'.
ENDIF.
LINE-COL1=50.LINE-COL2=60.
APPENDLINETOJTAB.
IFITABNEJTAB.
WRITE/'ITABNEJTAB'.
ENDIF.
IFITABLTJTAB.
WRITE/'ITABLTJTAB'.
ENDIF.
其输出为:
ITABGTJTAB
ITABEQJTAB
JTABLEITAB
ITABNEJTAB
ITABLTJTAB
在此创建两个内表:
ITAB和JTAB。
用3行填充ITAB并将其复制到JTAB中。
然后将另一行附加给ITAB并且第一个逻辑表达式测试ITAB是否大于JTAB。
在将同一行附加给JTAB之后,第二个逻辑表达式测试两个表格是否相等。
然后将另一行附加给ITAB,第三个逻辑表达式测试JTAB是否小于或等于ITAB。
然后将一行附加给JTAB,其此组件内容与ITAB最后一行中组件的内容不相等。
下一逻辑表达式测试ITAB是否与JTAB不相等。
从中找到ITAB和JTAB不同之处的第一个组件是最后一个表格行中的COL1。
ITAB是30列而JTAB则是50列。
因此在最后一个逻辑表达式中,ITAB小于JTAB。
5、内表属性
如果在处理过程中想知道内表一共包含多少行,或者想知道定义的OCCURS参数的大小,请使用DESCRIBE语句。
DATA:
BEGINOFLINE,
COL1TYPEI,
COL2TYPEI,
ENDOFLINE.
DATAITABLIKELINEoccurs10.
DATA:
LINTYPEI,
OCCTYPEI.
DESCRIBETABLEITABLINESLINOCCURSOCC.
WRITE:
/LIN,OCC.
DO1000TIMES.
LINE-COL1=SY-INDEX.
LINE-COL2=SY-INDEX**2.
APPENDLINETOITAB.
ENDDO.
DESCRIBETABLEITABLINESLINOCCURSOCC.
WRITE:
/LIN,OCC.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 详细 讲解