abap学习视频4(内表)_第1页
abap学习视频4(内表)_第2页
abap学习视频4(内表)_第3页
abap学习视频4(内表)_第4页
abap学习视频4(内表)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程目标:(1)理解什么是内表 (2)内表如何定义 ( 3)如何定义和使用工作区 (4)如何处理内表中的单个记录、记录集一、 什么是内表(大家看abap入门.pdf应该有了一定的认识)内表与结构体基本相似,它同样是程序运行中被临时创建的一个存储空间,是一个可以含多条记录的数据表。内表是一种数据对象,可以在该表中于运行时存储多个相同的结构化数据记录(表变量)。数据记录的数量仅由特定系统安装的容量所限制。ABAP运行时系统会动态管理内部表的大小,也就是说,开发人员不必进行任何内存管理操作。下列几个属性完全描述了一个内表行类型:行类型描述了表行的结构,一般使用一个结构来定义行类型,不过实际上可以用任何类型。键:内表的键由若干个指定顺序的键字段组成,内表就会根据几个键字段的先后顺序自动排序。根据访问类型,键可以分为唯一的和不唯一的,唯一的意味着表中的键字段的值组合在内表中只能出现一次。表类型:有三种不同的表类型,标准表、排序表和哈希表(散列表),根据使用的访问类型,可以使用相应的表定义以获得更好的性能。 内表中的各数据集称为表行或表项。出于这个原因,行中的各组件称为内表的字段或列。内部表的行类型可通过任意数据类型进行指定,并可描述表项的行结构。因此,内部表是一种以结构化方式处理大型数据集的简单方法。典型用途包括:(1) 保留数据数据库表或序列文件的数据进行后续处理(2) 进行数据格式化,用以屏幕或打印机输出(如:排序)(3) 进行数据格式化,用以使用其它服务(例如:用于方法、函数模块或子例程调用)内表有3中类型:(1) 标准表:standard(2) 排序表:sorted标准表和排序表统称为索引表(3) 哈希表(散列表):Hashed根据不同的访问类型,应选用不同的内表类型。标准表:以内部方式维护行编号(索引),可进行索引访问索引访问:通过指定相应行编号进行表项访问的情况和关键字访问 关键字访问:通过输入关键值进行表项访问的情况 如果大多使用索引访问内部表则应选择标准表。排序表:数据记录会自动以关键值升序进行排序,此处同样以内部方式维护索引。可进行索引访问和关键字访问。如果通常借用关键字访问内表或希望表按关键字进行自动排序,则应选择排序表。哈希表(散列表):使用散列程序管理数据记录,用以快速进行关键字访问。此处需要使用唯一值。针对散列表,只可进行关键字访问。如果内表很大并且只希望通过关键字进行访问,就应该选择此散列表。如下图所示:也就是说,排序表和标准表都可以进行索引访问和关键字访问,其中,排序表主要是进行索引访问,标准表主要是进行关键字访问;但是,哈希表只能进行关键字访问,不能进行索引访问。二、 内表的定义【在程序中慢慢理解吧】 内表定义方式一:独立定义。 如下图所示,在程序中先定义局部结构类型,然后通过DATA关键字定义内表。 优点:可采用任意结构类型实施内部表,而不必参考现有数字字典中的类型。 内表定义方式二:data gt_itab type 例子:BC430_zh.pdf 第33页内表定义方式三: standard data gt_itab type sorted table of with . key hashed 内表定义方式四:data gt_itab type table of . 这种方式是定义的是包含非唯一关键字的标准表,是一个缩写形式。也就是说,在没有明确通过type指定表类型的时候,缺省默认为标准表。 【这些在后面的程序中有例子,大家也可以自己写例子进行测试学习】 通过关键字DATA对内表进行创建内表是个变量,而变量的定义是通过DATA,内表的定义可以直接参考结构体、参考其它内表、参考透明表、直接调用字段。 三、 内表单一记录的操作:APPEND、INSERT、READ TABLE、MODIFY、DELETE、COLLECT(1) APPEND:追加行,将结构内容附加到内部表【只有标准表才能进行本操作】APPEND to 【在本文档中的程序ZABAPLEAN4_2中有使用方式】(2) INSERT:在指定的内表行位置插入行 Insert into table 【在本文档中的程序ZABAPLEAN4_2中有使用方式】(3) READ TABLE :读取内表指定位置的行READ TABLE itab INDEX n INTO wa。从索引表(标准表和排序表统称索引表)中读一个表行。(4) MODIFY:利用工作区中的内容,修改内表中的数据【在本文档中的程序ZABAPLEAN4_4.中有使用方式】(5) DELETE:删除内表中数据完全相同的行,只保留一行:delete duplicates from itab2 comparing /comparing all fields(6) COLLECT:将结构内容累计到拥有相通关键字的内表的表行中。 在这个过程中,添加的只是非关键字字段。因此,此语句仅可以用于非关键字字段均为数值的表,并且该内表必须具有扁平结构。REPORTZABAPLEAN4_6.DATA:BEGINOFITABOCCURS3,COL1(3)TYPEC,COL2TYPEI,ENDOFITAB.ITAB-COL1=ABC.ITAB-COL2=10.COLLECTITAB.ITAB-COL1=XYZ.ITAB-COL2=20.COLLECTITAB.ITAB-COL1=ABC.ITAB-COL2=80.COLLECTITAB.loopatitab.write:/ITAB-COL2.endloop.输出结果为:四、 内表-处理记录集:LOOP AT ENDLOOP、DELETE、INSERT、APPEND(1) LOOP AT .ENDLOOP.LOOP AT INTO .LOOP 语句一条一条的读出内表的数据行,写入INTO 字句指定的结构中,结构的内容可用于输出,或者修改后写回内表。在LOOP 语句块中,系统字段sy-tabix 指示了当前循环到内表的哪一行。注意:想修改内表的某一行只能先把那行读到工作区,修改工作区后再写回内表,而不能以数组的方法访问到内表的指定一行,这是跟其他语言很不一样的地方。(2) DELETEDELETE 删除内表中满足条件的所有行。(3) INSERTINSERT LINES OF INTO 将内表中若干行的内容复制给另一个内表。(4) APPENDAPPEND LIENS OF TO 这个表必须是标准表 将内表中若干行的内容附加到另一个标准表。【在本文档中的程序ZABAPLEAN4_4.中有使用方式】五、 使用索引读表(只针对索引表即排序表和标准表)(1) LOOP 中用FROM - TO 子句可以读指定索引段的记录。(2) READ 中用INDEX 子句可以读指定索引的一条记录。(3)六、 使用条件读表(1) LOOP 中用WHERE 子句可以读满足一定条件的记录。(2) READ 中用WHERE TABLE KEY 子句可以读满足主键条件的记录。这些基本上在下面的程序中都有例子,没有的话,欢迎大家补足分享到群空间中。(3)七、 使用SORT语句对内表进行排序(只针对索引表即排序表和标准表)(1) 标准表和排序表可以使用SORT 语句对指定字段进行排序,如果没有指定升序或者降序就默认使用升序。(2) 如果使用STABLE 子句,则排序时排序字段具有相同值的记录的顺序在排序后仍保持不变。八、 内表初始化【这个要理解】(1) REFRESH:清除整个内表的内容,但是只释放部分内存,保留一些内存以备后续操作(2) CLEAR:对于没有表头的内表,跟REFRESH 一样,清除整个内表的内容;对于有表头的内表,则只初始化表头。(3) FREE:清除整个内表的内容,释放所有内存。在程序里,当内表以后不再使用的时候可以使用FREE,这样能尽量多释放一些不用的内存。九、 内表表头【SAP建议舍弃内表表头,原因看本文档的说明,为了使大家能够读懂历史代码,所以在这个文档中详细介绍了,带表头的内表,大家可以参考一下。但是,在实际的开发中大多都不使用表头了】在内表的定义中,通过WITH HEDER LINE可创建含表头的内表。完成后,将自动创建工作区(表头就作为工作区),所以对工作区不必重复定义。此操作还可简化表命令的语法,因为系统会始终参考自动生成的工作区,也因此不哦那个明确指定工作区。下图是带表头的内表和不带表头的内表的不同操作方式的比较,可以发现with header line 子句可以在定义表的时候指定表头,会自动建立一个与内表同名并且具有相同结构的工作区,同时也可以简化很多内表语句。 但是,新的SAP标准建议舍弃表头,为什么建议舍弃呢?因为:(1)表头自动生成的表头作为工作区与内表同名,影响阅读(2) 有表头的内表不允许使用复杂数据对象,即:不能把其它内表作为表的组件)(3)有表头的内表不允许使用ABAP对象(面向对象的ABAP扩展)(4)在面向对象的上下文中,只能使用不带表头的内表 十、 测试程序(共三个测试程序,大家自己看看,有不足的地方,欢迎在群里指出)例1:共三个测试程序,大家自己看看,第三个程序有待大家完善REPORTZABAPLEAN4_2.独立定义定义局部结构类型types:beginofgty_s_type,carridtypes_carr_id是个数据字典中的数据元素(Data Element),在t-code : se11中可以查看,firtNametypepa0002-VORNA,lastNametypepa0002-NACHN是数据字典中透明表PA0002的一个字段,透明表PA0002是数据SAP HR模块中一个表,同样在t-code:Se11中可以查看,endofgty_s_type.定义带表头的内表data:gt_itabtypestandardtableofgty_s_typewithheaderline.往内表中写入数据gt_itab-carrid=001.gt_itab-lastName=李.gt_itab-firtName=强.appendgt_itab带表头的内表进行APPEND操作时候的省略书写形式,APPEND ( into ) ,因为带表头的内表,表头作为工作区,工作区与表头同名。.gt_itab-carrid=002.gt_itab-lastName=王.gt_itab-firtName=凡.APPENDgt_itab.输出内表中的数据(针对带表头的内表)loopatgt_itab.write:/gt_itab-carrid,|,gt_itab-lastName,|,gt_itab-firtName.uline.ENDLOOP.定义不带表头的内表gt_itab2data:gt_itab2typestandardtableofgty_s_type.定义工作区gt_itab2_waDATA:gt_itab2_watypegty_s_type.定义工作区的方式使用工作区及insertintotable往内表中写入数据gt_itab2_wa-carrid=001.没有表头的内表使用工作区进行赋值gt_itab2_wa-lastName=李.gt_itab2_wa-firtName=强.insertgt_itab2_waintotablegt_itab2.Insert into table gt_itab2_wa-carrid=002.gt_itab2_wa-lastName=王.gt_itab2_wa-firtName=凡.insertgt_itab2_waintotablegt_itab2.输出内表中的数据(针对不带表头使用工作区的内表)LOOPATgt_itab2INTOgt_itab2_wa.Loop at Into write:/gt_itab2_wa.ENDLOOP.这段程序的作用就是,定义个内表(带表头,和不带表头的),然后往内表中加入数据,并打印到屏幕上输出结果为:例2: 修改内表中的数据(内表是带表头的)REPORTZABAPLEAN4_4.tables:pa0002.声明程序中使用的表 pa0002.data:t_pa0002_2typetableofpa0002withheaderline.data:t_pa0002_3typetableofpa0002withheaderline.根据透明表pa0002,定义带表头的内表t_pa0003select*frompa0002intoCORRESPONDINGFIELDSOFTABLEt_pa0002_2upto5rows.使用Open SQL的up to n rows语法,读取数据的前5条数据appendlinesoft_pa0002_2tot_pa0002_3.将内表t_pa0002_2赋值给t_pa0003_3【内表复制的方法,】uline.LOOPATt_pa0002_2.WRITE:/t_pa0002_2-pernr,t_pa0002_2-NACHN,t_pa0002_2-VORNA.ENDLOOP.t_pa0002_2-pernr=12345.t_pa0002_2-NACHN=ABC.t_pa0002_2-VORNA=GHJ.MODIFYt_pa0002_2INDEX1.修改内表的第一条数据WRITE:/修改第一条记录后的内表.LOOPATt_pa0002_2.WRITE:/t_pa0002_2-pernr,t_pa0002_2-NACHN,t_pa0002_2-VORNA.ENDLOOP.uline.t_pa0002_3内表中的数据LOOPATt_pa0002_3.WRITE:/t_pa0002_3-pernr,t_pa0002_3-NACHN,t_pa0002_3-VORNA.ENDLOOP.t_pa0002_3-pernr=JJJ.t_pa0002_3-NACHN=OOO.t_pa0002_3-VORNA=HHH.modifyt_pa0002_3transportingnachnwherepernr=22000002.修改内表t_pa0002_3中pernr字段为22000002的那条记录中字段nachn的值write:/修改pernr=22000002那条内表记录中字段nachn后的值.LOOPATt_pa0002_3.WRITE:/t_pa0002_3-pernr,t_pa0002_3-NACHN,t_pa0002_3-VORNA.ENDLOOP.输出结果为:例3:修改内表中的数据(内表是不带表头的)REPORTZABAPLEAN4_5.TABLES:pa0002.参照透明表pa0002,创建名称为t_pa0002的内表DATA:t_pa0002TYPETABLEOFpa0002.定义不带表头的内表t_pa0002DATA:t_pa0002_waLIKELINEOFt_pa0002.data:t_pa0002_2typetableofpa0002,t_pa0002_2_walikelineoft_pa0002_2定义内表t_pa0002_2的工作区t_pa0002_2_wa.从表pa0002中读取前5条数据SELECT*FROMpa0002INTOCORRESPONDINGFIELDSOFTABLEt_pa0002UPTO5ROWS.appendlinesoft_pa0002tot_pa0002_2.将内表t_pa0002中的值复制到t_pa0002_2中loopatt_pa0002_2intot_pa0002_2_wa.write:/t_pa0002_2_wa-PERNR,t_pa0002_2_wa-NACHN,t_pa0002_2_wa-VORNA.endloop.write:/输出pernr=22000002那条内表记录中数据的值.LOOPATt_pa0002INTOt_pa0002_wawherepernr=22000002限定只输出pernr = 22000002那条内表记录中数据的值.WRITE:/t_pa0002_wa-PERNR,t_pa0002_wa-NACHN,t_pa0002_wa-VORNA.ENDLOOP.uline.t_pa0002_wa-pernr=JJJ.t_pa0002_wa-NACHN=OOO.t_pa0002_wa-VORNA=HHH.t_pa0002_wa-begda=20111004日期是20111001这种格式输入的,但是以2011.10.04的格式输出.日期是20111001这种格式输入的,但是以2011.10.04的格式输出”修改不带表头的内表t_pa0002中pernr = 22000002的记录的值(只修改nachn和vorna字段)modifyt_pa0002fromt_pa0002_watransportingvorna nachn begdawherepernr=22000002.修改不带表头的内表中特定记录的某几个字段的方式write:/修改pernr=22000002那条内表记录中字段vorna后的值.LOOPATt_pa0002INTOt_pa0002_wa.WRITE:/t_pa0002_wa-pernr,t_pa0002_wa-NACHN,t_pa0002_wa-VORNA, t_pa0002_wa-begda.ENDLOOP.十一、 后台信息:字段符号 FIELD-SYMBOLS (1) 在ABAP中可以用字段符号创建一个数据对象的指针(2) 首先使用FIELD-SYMBOLS 语句声明数据对象。这个数据对象可以包含运行时指向其他数据对象的指针。如果可能的话,要让字段符号的类型与数据对象相同。(3) 给字段符号一个结构类型就可以访问结构数据对象的独立组件。(4) 注意尖括号()是字段符号名的一部分,就是说字段符号名是。要把字段符号指向数据对象,必须使用 ASSIGN TO data_object语句把它复制给对象 data_object.(5) 可以使用字段符号访问它指向数据对象的内容,可以读取或修改。(6) 在运行时可以使用ASSIGN 语句“重定向”字段符号到一个不同的数据对象。REPORTdemo_field_symbols_type.【在abapdocu中的实例程序】DATA:BEGINOFline,col1(1)TYPEc,col2(1)TYPEcVALUEX,ENDOFline.FIELD-SYMBOLSLIKEline.ASSIGNlineTO.MOVE-col2TO-col1.WRITE:-col1,-col2.REPORTZABAPLEAN4_7.【是在BC402_ZH.中第179页很好的示例程序】types:beginoft_conn,cityfromtypespfli-cityfrom,citytotypespfli-cityto,carridtypespfli-carrid,connidtypespfli-connid,endoft_conn.data:conn_listtypestandardtableoft_conn,startlinelikesy-tabix.data:beginofwa_travel,desttypespfli-cityto,cofl_listlikeconn_list,endofwa_travel.data:travel_listlikesortedtableofwa_travelwithuniquekeydest.field-symbols:typet_conn,typet_conn,likewa_travel.parameterspa_starttypespfli-cityfromdefaultCITY1.selectcarridconnidcityfromcitytofromspfliintocorrespondingfieldsoftableconn_list.conn_list这个内表用来缓冲所有转接航班并对其进行适当的排序

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论