1.内表的类型及定义:7~1kZ:p0z#p'ZC'V(@*\!y.J1G&x(1).ANYTABLE:即任意表类型,此种定义方式只能在传递参数的时候定义。+n%W)]5F#u!G'H例如:FORMXXXUSING/CHANGINGTYPEANYTABLE.(2).ANYTABLE包括了两种类型:INDEXTABLE和HASHEDTABLE。&W3I9j_9W0j%w%i/[:b9c5~-lw《1》.INDEXTABLE:包括了STANDARDTABLE和SORTEDTABLE3I5B-X+g'OA.STANDARDTABLE:其实就是一个线性表,通过key访问内表是线性查找的,也就是说,随着表中记录的增加,对表的?*`+u0t&z5\8Q/?0p操作的时间开销也相应的增加。1j6_!}&Y2h3m*d%c6{%|7?2O(^1m;g|!e定义方法:TYPES/DATA:LIKE/TYPESTANDARDTABLEOF.9R,c$[0L'P;J0b'^%IB.SORTEDTABLE:顾名思义,表中的记录是按照一定的顺序排列的。访问表的主要方式是表中定义的key,如果key不唯(w4})^!~-m-P一,则选择index最小的那个。也可以通过index来访问排序表,如果你想通过index插入一条记录,系统会自动检查你插入的'O3Y!R$G)l'[位置是否正确。所以,如果插入的时间比插入到标准表的时间会长。因此,尽量选择key来对排序表进行操作。*I-D$h6o!x/?*k8k&l:e%`;q*Q1T定义方法:TYPES/DATA:LIKE/TYPESORTEDTABLEOF.《2》.HASHEDTABLE:对哈希表只能用你定义的key进行操作,而不能使用index进行操作。因此,定义哈希表必须定义unique)v2t5s1C0l8o,Y!i%|1t9R)[3j&D1g5bkey。注意:所有关于使用index操作表的语句都不能用于操作哈希表。例如:sort,loop等。定义方法:TYPES/DATA:LIKE/TYPEHASHEDTABLEOF.9b'N&U0k,^:g7R8W&`8X9X0G-S.I3P;a5P2.内表的操作:#y'X2U.V2e,A(?8y$\8`V(1).创建:*{+r9?$v*^0sFA.定义一个结构,然后type/like这个结构2r2K#`#@1r$a7m4Z例如:;};V(c'V,N9R8^TYPES:BEGINOF,+g(q4u-v;z2t;D....h+O+N(K,D,|2C$P0n5hi...,...ENDOF.DATATYPESTANDARDTABLEOFw%a'`3W#l,E8RWITHNON-UNIQUEDEFAULTKEYs0J.a4K%M_INITIALSIZEWITHHEADERLINE.-D;T:u/Va*e3?;\*u$U(t1m-L;K,W,MB.type/like系统表或者数据库表或者结构DATATYPESTANDARDTABLEOF系统表名INITIALSIZE8A9R1c5J!t6`WITHHEADERLINE.(2).添加数据:,R!L&n+T1wA.APPEND:直接向表中添加数据0}!g+B(N8S2K/~1.APPEND[waTO|INITIALLINETO]itab[ASSIGNING|REFERENCEINTOdref].!O-Y,Q&Iu!^F7\.V2.APPENDLINESOFitab1[FROMidx1][TOidx2]TOitab2.3.APPEND[waTO]itabSORTEDBYf[ASSIGNINGB.向表中插入数据:1{,f.f.p@1.INSERT[waINTO|INITIALLINEINTO]itab[INDEXidx][ASSIGNING|REFERENCEINTOdref].2.INSERT[waINTO|INITIALLINEINTO]TABLEitab[ASSIGNING|REFERENCEINTOdref].?.J.K%j3^&M:at7z-^%D4M'h3M9Y3.INSERTLINESOFitab1[FROMidx1][TOidx2]INTOitab2[INDEXidx3].4.INSERTLINESOFitab1[FROMidx1][TOidx2]INTOTABLEitab2.%J)u%z!Z2LC.相同字段求和向表里添加:0K9]9b*l&cl1D0W%h$wBasicformCOLLECT[waINTO]itab.!vU1v#h3w'p$b#ZExtras:%j],bW9i,j+i%Y$b0m#Jq7w/a$R5D1....ASSIGNING!`/h4a1|0c$e:h.Z2....REFERENCEINTOdref8Z$j0R1G(j3....SORTEDBYf(3).删除数据:+_2J7O1x)Y+N&^4f1.DELETEitab.2.DELETETABLEitabWITHTABLEKEYk1=v1...kn=vn.(_8L)S%j&y'l3.DELETETABLEitab[FROMwa].5n+{2b+a'U&m4.DELETEitabINDEXidx.2S*m.r(z)q#h6Sr5.DELETEitabFROMidx1TOidx2.6.DELETEitabWHERElogexp.7.DELETEADJACENTDUPLICATESFROMitab.'h(K0D)`!qa3U'J-K*_(4).修改数据:'h9v%t6N.b1.MODIFYitab[FROMwa][INDEXidx][ASSIGNING|REFERENCEINTOdref][TRANSPORTINGf1...fn].8e'C#q7V7T+SP3l6T9X4\!x7m%Q2.MODIFYTABLEitab[FROMwa][ASSIGNING|REFERENCEINTOdref][TRANSPORTINGf1...fn].)b!I:j&V$~w;w)?2m3.MODIFYitab[FROMwa]TRANSPORTINGf1...fnWHEREcond.-P+]!b0{$g%k#U0b;wh8a'}&^1N(P8M刚开始学ABAP的时候,学到iternaltable时,感觉一阵混乱.,b8w/u'S5I搞不清楚什么是workarea,什么是headerline,以及occurs是干什么用的.今天终于差不多搞明白了(我还是太弱啊...BS自己一下)4~9K6R7a5Gc所以还是记录下来..省得自己以后再忘记.../b'U+R9O9O,Z$m1~:^q#\1{0vO.t/A!Z%{;d+m先是用TYPES关键字定义一个行(row)的类型.如下:TYPES:BEGINOFline,field1TYPEi,field2TYPEi,'\+A9t#L*Z,IENDOFline.这里的line,就相当于一个自定义的类型,表示一行(row)的字段(field).这里一行有两个字段field1和field2.7e(t:Y5g+y$}'^4|7d,I:G8I.Y7_:p/{然后是声明一个workarea:,d2i8m#Y7P#M-gDATAwaTYPEline.3t/U0{)?9|我用C++(还是对cpp最有好感^^)的概念理解就是,4q,`G,?1j1U,O2E:Yline是一个class,而wa是一个object.2H/Y-w)YS接着是声明一个每一行的类型是line的internaltable:DATAitabTYPElineOCCURS0.我在暂时把OCCURS作为了区别工作区和内表的标志.OCCURS应该有更深层次的意义,但我目前只能领悟至此...1n$Dx1[,N5q当我们用以上这个方法来声明一个iternaltable时,可以选择是否有无headerline.%t/QQ5D$g7`4|-P!V上面这句就是没有headerline的.改成如下就有了:DATAitabTYPElineOCCURS0WITHHEADERLINE.有无headerline的区别就是,headerline可以当作一个workarea来使用(参照我之前的一个日志).有一下两种方式操作itab:1).wa-field1=1.wa-field2=2.3S$F#O(K7j7o4OAPPENDwaTOitab.2).itab-field1=1.itab-field2=2.4K+C)M:x,NW-g/xAPPENDitab.这里wa就是上面那个已经定义的workarea.有headerline的时候,这两种都可以.无headerline的时候,只能用第1种.2Y3a,W5~A7w0|+?0~第2种里,itab的意义是一个headerline,而不是内表.&O3n9R,\:R#t,Rl-UF因为DATAitabTYPElineOCCURS0WITHHEADERLINE.这样的声明,-{7f.rk.A!B(Z.}#Q+N已经隐式声明了一个与内表同名的headerline.所以OCCURS用来声明内表可能造成二义性(ambiguous).;Z5t3P+h,V于是,OCCURS被认为是old的东西,采用一下方式声明一个内表比较好:DATAitabTYPESTANDARDTABLEOFline.%W#]6U)t:h?/^9|&z还有一种声明内表的方法:DATA:BEGINOFitabOCCURS0,field1TYPEi,/Bq'?1j,t&Ufield2TYPEi,ENDOFitab.7bA,l1Q&U*U$Q7Q.gX这样的itab就自动有了一个同名的headerline.3q9S+M$\-ip6S'o好像不会有WITHOUTHEADERLINE或者NOTWITHHEADERLINE这样的用法...如果没有OCCURS0,比如这样:#s&u2P*q!i&?$h$B4HDATA:BEGINOFitab,5A'^2f/zB:i+E8c/ufield1TYPEi,field2TYPEi,ENDOFitab.那么这个itab就不是内表咯,只是一个structure,可以作为itab的workarea.写到这里发现,归根到底就是TYPES和DATA这两个关键字的区别嘛.9\(k.O$V/?$z*f还有有无OCCURS的区别.这样一想,简单明了~~3o&e(u8P:j*s'{'T,H3zOCCURS是在3.0以前申明内表的关键字。意思是内表初始的时候有多少行。现在不提倡使用。看到了认识就行。9P;J'Y$T,]3t:x6D0mM8v:w$m=======================================================/o,T-B-A.D#]#^1GABAPWorkArea&HeaderLine-8S4@;{S1E%y9j0x1k1.DifferencebetweenWorkAreaandHeaderLine工作区与标题行的不同之处4tW6w&hH7r原文地址:,嘿嘿在对内表进行一些操作的时候,比如增加或者取回一条记录.我们必须暂时保存这条记录.-E3S/\%_4W9Z:VZ&u这条记录就保存在内表的工作区里(workarea).内表的工作区必须和内表有相同的结构.内表由主体(body)和一个可选的标题行(headline)组成.(K+H(b%b/Z标题行是一个隐式的(implicit)工作区.在内表声明的时候,可以选择有无标题行.e.g.data:beginofitaboccurs10,abtypec,,J.`8K:X2D,o$t/J1fcdtypei,endofitab.这样的内表itab,是有标题行的.(n!}!@-f+}8Rdata:wa_itablikeitab.5t6l(^2d/g;u8k:R0w4S这样的wa_itab是显式(e