《2022年abap学习视频 .pdf》由会员分享,可在线阅读,更多相关《2022年abap学习视频 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、课程目标:(1)理解什么是内表(2)内表如何定义(3)如何定义和使用工作区(4)如何处理内表中的单个记录、记录集一、什么是内表(大家看 abap入门.pdf 应该有了一定的认识)内表与结构体基本相似,它同样是程序运行中被临时创建的一个存储空间,是一个可以含多条记录的数据表。内表是一种数据对象,可以在该表中于运行时存储多个相同的结构化数据记录(表变量)。数据记录的数量仅由特定系统安装的容量所限制。ABAP 运行时系统会动态管理内部表的大小,也就是说,开发人员不必进行任何内存管理操作。下列几个属性完全描述了一个内表行类型:行类型描述了表行的结构,一般使用一个结构来定义行类型,不过实际上可以用任何类
2、型。键:内表的键由若干个指定顺序的键字段组成,内表就会根据几个键字段的先后顺序自动排序。根据访问类型,键可以分为唯一的和不唯一的,唯一的意味着表中的键字段的值组合在内表中只能出现一次。表类型:有三种不同的表类型,标准表、排序表和哈希表(散列表),根据使用的访问类型,可以使用相应的表定义以获得更好的性能。内表中的各数据集称为表行 或 表项。出于这个原因,行中的各组件称为内表的字段 或列。内部表的 行类型 可通过任意数据类型进行指定,并可描述表项的行结构。因此,内部表是一种以结构化方式处理大型数据集的简单方法。典型用途包括:(1)保留数据数据库表或序列文件的数据进行后续处理(2)进行数据格式化,用
3、以屏幕或打印机输出(如:排序)(3)进行数据格式化,用以使用其它服务(例如:用于方法、函数模块或子例程调用)内表有 3 中类型:(1)标准表:standard(2)排序表:sorted(3)哈希表(散列表):Hashed 根据不同的访问类型,应选用不同的内表类型。标准表:以内部方式维护行编号(索引),可进行索引访问和关键字访问如果大多使用索引访问内部表则应选择标准表。排序表:数据记录会自动以关键值升序进行排序,此处同样以内部方式维护索引。可进行索引访问和关键字访问。如果通常借用关键字访问内表或希望表按关键字进行自动排序,则应选择排序表。哈希表(散列表):使用散列程序管理数据记录,用以快速进行关
4、键字访问。此处需要使用唯一值。针对散列表,只可进行关键字访问。如果内表很大并且只希望通过关键字进行访问,就应该选择此散列表。如下图所示:名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 12 页 -也就是说,排序表和标准表都可以进行索引访问和关键字访问,其中,排序表主要是进行索引访问,标准表主要是进行关键字访问;但是,哈希表只能进行关键字访问,不能进行索引访问。二、内表的定义【在程序中慢慢理解吧】内表定义方式一:独立定义。如下图所示,在程序中先定义局部结构类型,然后通过DATA 关键字定义内表。优点:可采用任意结构类型实施内部表,而不必参考现有数字字典中的类型。内表定义方式二:da
5、ta 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 对内表进行创建,内表的定义可以直接参考结构体、参考其它内表、参考透明表、直接调用字段。三、内表单一记录的操作
6、:APPEND、INSERT、READ TABLE、MODIFY、DELETE、COLLECT 名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 12 页 -(1)APPEND:追加行,将结构内容附加到内部表【只有标准表才能进行本操作】APPEND to 【在本文档中的程序ZABAPLEAN4_2中有使用方式】(2)INSERT:在指定的内表行位置插入行Insert into table 【在本文档中的程序ZABAPLEAN4_2中有使用方式】(3)READ TABLE:读取内表指定位置的行READ TABLE itab INDEX n INTO wa。从索引表(标准表和排序表统称
7、索引表)中读一个表行。(4)MODIFY:利 用 工 作 区 中 的 内 容,修 改 内 表 中 的 数 据【在 本 文 档 中 的 程 序ZABAPLEAN4_4.中有使用方式】(5)DELETE:删除内表中数据完全相同的行,只保留一行:delete duplicates from itab2 comparing /comparing all fields(6)COLLECT:将结构内容累计到拥有相通关键字的内表的表行中。在这个过程中,添加的只是非关键字字段。因此,此语句仅可以用于非关键字字段均为数值的表,并且该内表必须具有扁平结构。REPORT ZABAPLEAN4_6.DATA:BEGI
8、N OF ITAB OCCURS 3,COL1(3)TYPE C,COL2 TYPE I,END OF ITAB.ITAB-COL1=ABC.ITAB-COL2=10.COLLECT ITAB.ITAB-COL1=XYZ.ITAB-COL2=20.COLLECT ITAB.ITAB-COL1=ABC.ITAB-COL2=80.COLLECT ITAB.loopat itab.write:/ITAB-COL2.endloop.输出结果为:名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 12 页 -四、内表-处理记录集:LOOP AT ENDLOOP、DELETE、INSERT、AP
9、PEND(1)LOOP AT .ENDLOOP.LOOP AT INTO .LOOP 语句一条一条的读出内表的数据行,写入INTO 字句指定的结构中,结构的内容可用于输出,或者修改后写回内表。在LOOP 语句块中,系统字段sy-tabix 指示了当前循环到内表的哪一行。注意:想修改内表的某一行只能先把那行读到工作区,修改工作区后再写回内表,而不能以数组的方法访问到内表的指定一行,这是跟其他语言很不一样的地方。(2)DELETE DELETE 删除内表中满足条件的所有行。(3)INSERT INSERT LINES OF INTO 将内表中若干行的内容复制给另一个内表。(4)APPEND APP
10、END LIENS OF TO 将内表中若干行的内容附加到另一个标准表。【在本文档中的程序ZABAPLEAN4_4.中有使用方式】五、使用索引读表(只针对索引表即排序表和标准表)(1)LOOP 中用 FROM-TO 子句可以读指定索引段的记录。(2)READ 中用 INDEX 子句可以读指定索引的一条记录。(3)六、使用条件读表(1)LOOP 中用 WHERE 子句可以读满足一定条件的记录。(2)READ 中用 WHERE TABLE KEY 子句可以读满足主键条件的记录。这些基本上在下面的程序中都有例子,没有的话,欢迎大家补足分享到群空间中。名师资料总结-精品资料欢迎下载-名师精心整理-第
11、4 页,共 12 页 -(3)七、使用SORT 语句对内表进行排序(只针对索引表即排序表和标准表)(1)标准表和排序表可以使用SORT 语句对指定字段进行排序,如果没有指定升序或者降序就默认使用升序。(2)如果使用 STABLE 子句,则排序时排序字段具有相同值的记录的顺序在排序后仍保持不变。八、内表初始化【这个要理解】(1)REFRESH:清除整个内表的内容,但是只释放部分内存,保留一些内存以备后续操作(2)CLEAR:对于没有表头的内表,跟REFRESH 一样,清除整个内表的内容;对于有表头的内表,则只初始化表头。(3)FREE:清除整个内表的内容,释放所有内存。在程序里,当内表以后不再使
12、用的时候可以使用FREE,这样能尽量多释放一些不用的内存。九、内表表头【SAP 建议舍弃内表表头,原因看本文档的说明,为了使大家能够读懂历史代码,所以在这个文档中详细介绍了,带表头的内表,大家可以参考一下。但是,在实际的开发中大多都不使用表头了】在内表的定义中,通过WITH HEDER LINE可创建含表头的内表。完成后,将自动创建工作区(表头就作为工作区),所以对工作区不必重复定义。此操作还可简化表命令的语法,因为系统会始终参考自动生成的工作区,也因此不哦那个明确指定工作区。下图是带表头的内表和不带表头的内表的不同操作方式的比较,可以发现 with header line 子句可以在定义表的
13、时候指定表头,会自动建立一个与内表同名并且具有相同结构的工作区,同时也可以简化很多内表语句。名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 12 页 -但是,新的SAP 标准建议舍弃表头,为什么建议舍弃呢?因为:(1)表头与内表同名,影响阅读(2)有表头的内表不允许使用复杂数据对象,即:不能把其它内表作为表的组件)(3)有表头的内表不允许使用ABAP 对象(面向对象的ABAP 扩展)(4)在面向对象的上下文中,只能使用不带表头的内表十、测试程序(共三个测试程序,大家自己看看,有不足的地方,欢迎在群里指出)例 1:共三个测试程序,大家自己看看,第三个程序有待大家完善REPORT Z
14、ABAPLEAN4_2.独立定义 定义局部结构类型types:beginof gty_s_type,carrid type s_carr_id,firtName type pa0002-VORNA,lastName type pa0002-NACHN,endof gty_s_type.定义带表头的内表data :gt_itab typestandardtableof gty_s_type withheaderline .往内表中写入数据gt_itab-carrid=001.gt_itab-lastName=李.gt_itab-firtName=强.append gt_itab.gt_itab-
15、carrid=002.gt_itab-lastName=王.gt_itab-firtName=凡.APPEND gt_itab.输出内表中的数据(针对带表头的内表)loopat gt_itab.write :/gt_itab-carrid,|,gt_itab-lastName,|,gt_itab-firtName.名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 12 页 -uline.ENDLOOP.定义不带表头的内表gt_itab2data :gt_itab2 typestandardtableof gty_s_type.定义工作区 gt_itab2_waDATA:gt_ita
16、b2_wa type gty_s_type.使用工作区及insert into table 往内表中写入数据gt_itab2_wa-carrid=001.gt_itab2_wa-lastName=李.gt_itab2_wa-firtName=强.insert gt_itab2_wa intotable gt_itab2.gt_itab2_wa-carrid=002.gt_itab2_wa-lastName=王.gt_itab2_wa-firtName=凡.insert gt_itab2_wa intotable gt_itab2.输出内表中的数据(针对不带表头使用工作区的内表)LOOP AT
17、gt_itab2 INTO gt_itab2_wa.write:/gt_itab2_wa.ENDLOOP.这段程序的作用就是,定义个内表(带表头,和不带表头的),然后往内表中加入数据,并打印到屏幕上输出结果为:例 2:修改内表中的数据(内表是带表头的)REPORT ZABAPLEAN4_4.tables:pa0002.data :t_pa0002_2 typetableof pa0002 withheaderline.data :t_pa0002_3 typetableof pa0002 withheaderline.select*from pa0002 into CORRESPONDING
18、FIELDSOF TABLE t_pa0002_2 upto5 rows.appendlinesof t_pa0002_2 to t_pa0002_3.【内表复制的方法,】uline.LOOP AT t_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.MODIFY t_pa0002_2 INDEX1.WRITE:/修改第一条记录后的内表.名师资料总结-精品资料欢迎下
19、载-名师精心整理-第 7 页,共 12 页 -LOOP AT t_pa0002_2.WRITE:/t_pa0002_2-pernr,t_pa0002_2-NACHN,t_pa0002_2-VORNA.ENDLOOP.uline.t_pa0002_3 内表中的数据LOOP AT t_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.modify t_pa0002_3 tra
20、nsporting nachn where pernr=22000002.write:/修改 pernr=22000002那条内表记录中字段nachn后的值 .LOOP AT t_pa0002_3.WRITE:/t_pa0002_3-pernr,t_pa0002_3-NACHN,t_pa0002_3-VORNA.ENDLOOP.输出结果为:例 3:修改内表中的数据(内表是不带表头的)REPORT ZABAPLEAN4_5.TABLES:pa0002.参照透明表 pa0002,创建名称为t_pa0002的内表DATA:t_pa0002 TYPETABLE OF pa0002.DATA:t_pa0
21、002_wa LIKELINEOF t_pa0002.data :t_pa0002_2 typetableof pa0002,t_pa0002_2_wa likelineof t_pa0002_2.从表 pa0002中读取前 5 条数据SELECT*FROM pa0002 INTO CORRESPONDING FIELDSOF TABLE t_pa0002 UP TO 5ROWS.appendlinesof t_pa0002 to t_pa0002_2.将内表 t_pa0002中的值复制到t_pa0002_2中loopat t_pa0002_2 into t_pa0002_2_wa.write
22、:/t_pa0002_2_wa-PERNR,t_pa0002_2_wa-NACHN,t_pa0002_2_wa-VORNA.endloop.名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 12 页 -write:/输出 pernr=22000002那条内表记录中数据的值.LOOP AT t_pa0002 INTO t_pa0002_wa where pernr=22000002.WRITE:/t_pa0002_wa-PERNR,t_pa0002_wa-NACHN,t_pa0002_wa-VORNA.ENDLOOP.uline.t_pa0002_wa-pernr=JJJ.t_pa0
23、002_wa-NACHN=OOO.t_pa0002_wa-VORNA=HHH.t_pa0002_wa-begda=20111004.日期是 20111001这种格式输入的,但是以2011.10.04的格式输出”修改不带表头的内表t_pa0002 中 pernr=22000002 的记录的值(只修改nachn和 vorna字段)modify t_pa0002 from t_pa0002_wa transporting vorna nachn begda where pernr=22000002.write:/修改 pernr=22000002那条内表记录中字段vorna后的值 .LOOP AT
24、t_pa0002 INTO t_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)注意尖括号()是字段符号名的一部分,就
25、是说字段符号名是。要把字段符号指向数据对象,必须使用ASSIGN TO data_object 语句把它复制给对象data_object.(5)可以使用字段符号访问它指向数据对象的内容,可以读取或修改。(6)在运行时可以使用ASSIGN 语句“重定向”字段符号到一个不同的数据对象。REPORT demo_field_symbols_type.【在 abapdocu中的实例程序】DATA:BEGINOF line,col1(1)TYPE c,col2(1)TYPE cVALUE X,END OF line.FIELD-SYMBOLS LIKEline.ASSIGN lineTO .MOVE -c
26、ol2 TO-col1.WRITE:-col1,-col2.REPORT ZABAPLEAN4_7.【是在 BC402_ZH.中第 179 页很好的示例程序】types :beginof t_conn,cityfrom type spfli-cityfrom,cityto type spfli-cityto,名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 12 页 -carrid type spfli-carrid,connid type spfli-connid,endof t_conn.data :conn_list typestandardtableof t_conn,st
27、artline like sy-tabix.data :beginof wa_travel,dest type spfli-cityto,cofl_list like conn_list,endof wa_travel.data :travel_list likesortedtableof wa_travel withuniquekey dest.field-symbols:type t_conn,type t_conn,like wa_travel.parameters pa_start type spfli-cityfrom defaultCITY1.select carrid conni
28、d cityfrom cityto from spfli into corresponding fieldsoftable conn_list.conn_list 这个内表用来缓冲所有转接航班并对其进行适当的排序sort conn_list by cityfrom cityto ascendingastext.*build up nested tableloopat conn_list assigning where cityfrom=pa_start.使用用户输入的cityfrom继续过滤clear wa_travel.wa_travel-dest=-cityto.readtable con
29、n_list withkey cityfrom=wa_travel-dest transportingno fieldsbinarysearch.startline=sy-tabix.loopat conn_list assigning from startline.if -cityfrom wa_travel-dest.exit.endif.append to wa_travel-cofl_list.endloop.sort wa_travel-cofl_list by cityto carrid ascendingastext.insert wa_travel intotable trav
30、el_list.endloop .loopat travel_list assigning.write:/-dest.loopat -cofl_list assigning.名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 12 页 -atnew cityto.write:/8-cityto.endat.write:/16-carrid,-connid.endloop.endloop.十二、内表在面向对象中的应用BC401_zh.PDF如果想从程序的相同类中控制多个对象,可以定义一个内表,其中包含具有该类对象参考的列。可在内表中使用内表的常规语句(APPEND、READ TABL
31、E、LOOP)来管理这些对象。如 下 图 所 示,要 使 用 逻 辑 条 件,则 使 用 单 一 列 内 表 时 必 须 使 用 虚 拟 组 件TABLE_LINE。但是要执行此操作,必须具有公共的相关属性。十三、内表记录数Lines()名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 12 页 -如果在程序属性指定了一个逻辑数据库并且声明了附加选择项,但是并未给动态选择指明字段的引用,就必须使用CHECK 语句查看是否当前数据记录满足选择条件。如果数据记录不满足这些选择条件,当前事件块的处理结束。十四、内表调试名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 12 页 -