SAP-ITAB(内表)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

内表:1:ABAP中有三种类型的内表:IndexTablesHashedTableTableTypeSTANDARDTABLESORTEDTABLEHASHEDTABLE通过索引访问√√通过键访问√√√KEY唯一性键不唯一可唯一或不唯一键必须唯一相同值关键字行可从复可从复或不可从复不可从复通常访问方式主要通过索引主要通过关键字只能通过关键字STANDARDTABLE:DATAITAB_STANDARDTYPESTANDARDTABLEOFMARA.SORTEDTABLE:DATAITAB_SORTEDTYPESORTEDTABLEOFMARAWITHNON-UNIQUEKEYTABLE_LINE.WITHUNIQUEKEY或WITHNON-UNIQUEKEY都可以。HASHEDTABLE:DATAITAB_HASHEDTYPEHASHEDTABLEOFMARAWITHUNIQUEDEFAULTKEY.只能为WITHUNIQUEKEY。SORTEDTABLE和HASHEDTABLE必须制定KEY字段的名称如果只是这样写报错:×DATAITAB_HASHEDTYPEHASHEDTABLEOFMARAWITHUNIQUEKEY.×DATAITAB_SORTEDTYPESORTEDTABLEOFMARAWITHNON-UNIQUEKEY.2:表关键字○1….WITH[UNIQUE|NON-UNIQUE]KEYCOMP1……COMPn○2….WITH[UNIQUE|NON-UNIQUE]KEYTABLELINE如果内表整行都是由基本字段组成的,则可以吧内表整行指定为表关键字。○3….WITH[UNIQUE|NON-UNIQUE]KEYDEFAULTKEY如果不指定任何关键字,则可以使用默认的标准关键字。3:OCCURSN的含义DATA:BEGINOFITABOCCURS10,NAME(20)TYPEC,ADDRESSESTYPEADDRESS,ENDOFITAB.该语句声明了一个标准内表,OCCURS10代表分配初使内存大小为10行4:内表的初始大小设定DATAITABTYPESTANDARDTABLEOFMARAWITHNON-UNIQUEDEFAULTKEYINITIALSIZEnINITIALSIZEn声明内表的初始大小WITHHEADERLINE.先定义工作区与内表:DATAIT_MARATYPESTANDARDTABLEOFMARA.DATAIS_MARATYPEMARA.IS_MARA-MANDT=SY-MANDT.IS_MARA-MATNR='000000000000000059'.IS_MARA-ERSDA=SY-DATUM.IS_MARA-ERNAM='44444'.5:INSERT语句○1通过索引插入单行:INSERT工作区INTO内表INDEXN.INSERTIS_MARAINTOIT_MARAINDEX2.○2一般性插入单行的语法:INSERT工作区INTOTABLE内表.INSERTIS_MARAINTOTABLEIT_MARA.加入TABLE关键字,对于不同类型的内表,其意义用法是有区别的:对于标准表而言,该形式不指定索引值,附加至表的最后一行,与APPEND语句效果完全一致;对于排序表来说,插入的行不可以打乱按照关键字排序的顺序,否则插入不成功;对于哈希来说,插入过程中系统按照关键字对行进行定位INSERTINITIALLINEINTOIT_MARAINDEX1.效果是用行结构中各类型的初始值组成数据行添加到内表中。○3插入内表INSERTLINESOFitab1[FROMN1][TON2]INTOitab2[INDEXIDX].如果没有FROM和TO选项,该语句将整个表格ITAB1附加到ITAB2中。如果使用这些选项,则可通过索引n1或n2指定ITAB1中要附加的第一行或最后一行。DATA:BEGINOFLINE,COL1TYPEI,COL2TYPEI,ENDOFLINE.DATA:ITAB1LIKELINEOCCURS10,ITAB2LIKELINEOCCURS10.DO3TIMES.LINE-COL1=SY-INDEX.LINE-COL2=SY-INDEX**2.APPENDLINETOITAB1.LINE-COL1=SY-INDEX.LINE-COL2=SY-INDEX**3.APPENDLINETOITAB2.ENDDO.INSERTLINESOFITAB1INTOITAB2INDEX1.LOOPATITAB2INTOLINE.WRITE:/SY-TABIX,LINE-COL1,LINE-COL2.ENDLOOP.6:APPEND语句只能操作索引表(哈希表不是以索引作为行的寻找方式,没有系统索引,因此也就不能通过索引进行操作)APPEND默认插入到最后一行所以不用+INDEX。APPEND工作区TO内表.APPENDIS_MARATOIT_MARA.APPENDINITIALLINETOIT_MARA(内表).原理与INSERT只是APPEND是插入到最后一行。*附加内表行:APPENDLINESOFITAB1[FROMN1][TON2]TOITAB2.如果没有FROM和TO选项,该语句将整个表格ITAB1附加到ITAB2中。如果使用这些选项,则可以通过索引n1或n2指定ITAB1中要附加的第一行或最后一行。6:COLLECT语句COLLECTIS_MARA(工作区)INTOIT_MARA(内表).图解:内表ITAB已经存在4行数据,其中CARR,CONN是表的关键字段,是一个航空数据系统中公司ID和航线ID,UMSATZ代表总的机票收入。如果此时添加一行新的数据,该数据仍然是LH的400航班。如果使用APPEND语句,则内表变为5行,如果使用COLLECT语句,则在LH的0400航班原有基础上将收入累加。6:READ语句读取内表中的某一行,而不是循环读取内表,可以使用READ语句。○1:用索引读取单行:READTABLEITAB[INTOWA]IDEEXIDX.DATA:BEGINOFITABOCCURS10,COL1TYPEI,COL2TYPEI,ENDOFITAB.DO20TIMES.ITAB-COL1=SY-INDEX.ITAB-COL2=2*SY-INDEX.APPENDITAB.ENDDO.READTABLEITABINDEX17.WRITE:SY-SUBRC,SY-TABIX.WRITE:/ITAB-COL1,ITAB-COL2.如果INDEX数大于DO循环数INDEX=21WRITE输出结果SY-INDEX(循环次数);SY-TABIX(索引数)也就是INDEX后的数○2读取有关键字的单行:READTABLEITAB[INTOWA]INTOKEYKEY[BINARYSEARCH]DATA:BEGINOFLINE,COL1TYPEC,COL2TYPEPDECIMALS5,COL3TYPEI,COL4TYPEI,ENDOFLINE.DATAITABLIKELINEOCCURS10.DO10TIMES.LINE-COL1=SY-INDEX.LINE-COL2=SQRT(SY-INDEX).LINE-COL3=SY-INDEX**2.LINE-COL4=SY-INDEX**3.APPENDLINETOITAB.ENDDO.READTABLEITABINTOLINEWITHKEYCOL3=9COL4=36.WRITE:/SY-SUBRC,SY-TABIX.READTABLEITABINTOLINEWITHKEYCOL3=9COL4=27.WRITE:/SY-SUBRC,SY-TABIX.READTABLEITABINTOLINEWITHKEY'2'.WRITE:/SY-SUBRC,SY-TABIX.DO循环后ITAB表结构:第一个READ:没有COL3=9COL4=36的数据。所以SY-SUBRC=4SY-TABIX=0.第二个READ:READ语句找到索引为3的行符合第三个READ:READ语句搜索以’2’开始的表格行并找到索引为2的行。○3二分法查找READTABLEITAB[INTOWA][BINARYSEARCH]查找之前需要先对表进行排序。○3只读取内表READTABLEIT_MARA_MARDTRANSPORTINGNOFIELDSBINARYSEARCHWITHKEYMATNR='000000000000000058'.IFSY-SUBRC=0.ENDIF.TRANSPORTINGNOFIELDS表示只读取内表,用SY-SUBRC进行判断。7:MODIFY语句根据索引进行更新内表MODIFYITAB[FROMWA][INDEXIAX][TAANSPORTINGF1F2……]MODIFYIT_MARAFROMIS_MARAINDEX1.使用表关键字更新内表MODIFYITABFROMWATRANSPORTINGF1F2………..WHERECOND.F1F2………..中必须为关键字。如果只希望更新部分字段的值,可以使用TRANSPORTINGMODIFYIT_MARAFROMIS_MARATRANSPORTINGMATNRWHEREMATNR=''.7:DELETE语句用索引删除行:DELETEIT_MARAINDEX1.在循环中删除行:DATA:BEGINOFLINE,COL1TYPEI,COL2TYPEI,ENDOFLINE.DATAITABLIKELINEOCCURS10.DO30TIMES.LINE-COL1=SY-INDEX.LINE-COL2=SY-INDEX**2.APPENDLINETOITAB.ENDDO.LOOPATITABINTOLINE.IFLINE-COL128.DELETEITAB.ENDIF.ENDLOOP.LOOPATITABINTOLINE.WRITE:/SY-TABIX,LINE-COL1,LINE-COL2.ENDLOOP.在创建内表ITAB并用30行对其进行填充。在第一个LOOP-ENDLOOP中,删除COL1字段中所有小于28的行。DELETEIT_MARAWHEREMATNR=''.删除邻近重复条目DATA:BEGINOFLINE,COL1TYPEI,COL2TYPEC,ENDOFLINE.DATAITABLIKELINEOCCURS10.LINE-COL1=1.LINE-COL2='A'.APPENDLINETOITAB.LINE-COL1=1.LINE-COL2='A'.APPENDLINETOITAB.LINE-COL1=1.LINE-COL2='B'.APPENDLINETOITAB.LINE-COL1=2.LINE-COL2='B'.APPENDLINETOITAB.LINE-COL1=3.LINE-COL2='B'.APPENDLINETOITAB.LINE-COL1=4.LINE-COL2='B'.APPENDLINETOITAB.LINE-COL1=5.LINE-COL2='A'.APPENDLINETOITAB.LOOPATITABINTOLINE.WRITE:/LINE-COL1,LINE-COL2.ENDLOOP.ULINE.DELETEADJACENTDUPLICATESFROMITABCOMPARINGALLFIELDS.LOOPATITABINTOLINE.WRITE:/LINE-COL1,LINE-COL2.ENDLOOP.ULINE.ALLFIELDS含义:所有字段同时比较,只有完全一样是删除从复。DELETEADJACENTDUPLICATESFROMITABCOMPARINGCOL2.LOOPATITABINTOLINE.WRITE:/LINE-COL1,LINE-COL2.ENDLOOP.

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功