总学习目录请点击下面连接
SAP ABAP开发从0到入职,冷冬备战-CSDN博客
目录
5.1.结构化数据对象
定义
如何引用结构化的数据对象
拷贝
实战练习
创建
拷贝
调试代码
5.2.内表
行类型
键
表种类
存取类型
表类型
如何在本地定义表类型
内表三种可能的定义
内表的5种操作
内表批量处理
标准表和哈希表排序
刷新
清除
释放
内表表头的好处和坏处
5.3.使用内表操作
内表三种定义方式
使用ABAP字典
如何创建内表对象
使用结构来定义内表
不使用ABAP字典中的类型来定义
5种内表操作
APPEND
INSERT
READ
使用with table key
MODIFY更新
DELETE删除
内表多行操作
循环LOOP
CLEAR
FREE
where
修改一个表中所有数据的某个字段。
删除特定的数据
5.1.结构化数据对象
目标:认识结构化的数据类型的定义,使用调试器来分析结构化的数据对象。
能定义结构化数据对象,能够使用ABAP语句进行操作数据对象。
定义
结构化数据变量,就是使用一个变量来对应多个值,现在感觉有点像数组或者set map什么的。
结构中的元素可以嵌套,还可以有内表。
有个gs_f变量,里面有6个空间。
定义方法,使用DATA+名字+type+类型
也可以使用
types BEGIN of 结构名
types。。。。
types EDN of 结构名,定义结构,类似C语言结构体。
定义中间使用逗号进行分割,最终以句号结尾。
中间定义的每个元素都需要指定类型。
如何引用结构化的数据对象
首先是有一个对象的名称,每个对象里面还有很多元素也都有名称。
引用时,如果要引用对象中一个单值的化,使用 “对象名”+“-”+“里面一个部件的名字”。
拷贝
MOVE-CORRESPONDING语句能够一次性拷贝一个结构中的内容到另一个结构中,使用这个语句的时候,只有两个结构中间同名的组件被有效拷贝,其他不同名的部分保持不变。对单个值的分配,可以使用MOVE语句。
如果两个对象结构完全一样,也可以使用等于号来进行赋值。
在调试的时候,双击结构化数据对象的名字,就会被复制到右边区域,可以看到它的一个结构图。
实战练习
创建
先创建好一个新项目
简单定义一个结构
有三个变量,名字,性别和高度。
用DATA创建对象,并使用对象名-元素,来获取内部元素。
拷贝
新创建一个对象,使用struc01的值对他进行赋值。
发现可行。再使用MOVE-CORRESPONDING进行拷贝
同样实现了拷贝操作。
调试代码
打好断点
调试进入代码
双击结构体名称,查看结构
5.2.内表
学习目标:如何定义内表,使用ABAP语句操作内表,调试器中调试查看内表结构和内容。
内表是一种数据对象,运行时可以在内表中保存多个同一结构数据对象,数据记录的数量只和系统安装的容量有关。
ABAP运行时系统动态管理内表的大小,作为开发,不需要做任何事情。
内表中的单个数据称为表行或者表的条目。
一行中单个组件被称为内表的字段或者列
内表行的类型能够通过任何数据类型被指定,表类型描述表条目的行结构。
内表中的数据都有相同结构,所以内表称为结构化方式处理大数据集的一个简单途径,
可应用于:
1.从数据库表或者顺序文件中存留数据为将来的处理
2.为屏幕或打印输出格式化
3.为使其他服务格式化数据
行类型
就是行的结构,下图列出了行有那些字段。一般是一个多字段的结构。甚至是多个更复杂的结构。
键
内表的键由键字段包括他们的顺序构成,键字段的顺序被用来为按照键排序。按照存取类型,键可以被定义为唯一或者不唯一。
表种类
内表的表种类一般是根据用途来区分的。
分为标准表,排序表,和哈希表。
根据用途,对这个三种表进行了不同的实现。
存取类型
如果表条目可以通过指定对应的行号来存取,就叫做,按索引存取。
如果通过键值来存取条目,就叫做按键存取。
基于存取类型,应该选择合适的表。
使用标准表:索引存取和行号存取都可以选。
使用排序表:表的记录以键的顺序自动排序。如果需要按键排序就选这个。
使用哈希表:使用散列法程序排序,不能按索引存取。如果内表很大,并且要只通过键存取。
表类型
内表的类型称为表类型。
表类型,能够在ABAP字典中进行定义,或者在本地进行定义
如何在本地定义表类型
types 后面跟表类型名字,然后type table of 后面跟with 。。这个可以省略,
内表类型是在结构的基础上面进行定义。
下面是更详细的代码。
第一个部分是一个结构类型。
第二个部分是应用上面的结构类型来定义了一个内表。然后由三个可选的表类型。后面with+键,这些是可选项。
内表三种可能的定义
第一种是表准表,很简洁。 名字+类型
第二种是详细的定义,是类型+键。
第三种后面跟的是结构类型,使用的是type table of。如果是普通类型就是type。
内表的5种操作
这5个操作可以处理内表单条的记录。
处理一行的时候,需要跟这个内表结构一样的结构变量,这个结构变量被称为工作区。
操作都是,操作关键字+工作区 +关键词+ 内表。
Append:追加结构的内容到内表最后。
Insert:插入一行记录到内表。标准表会放到最后,排序表会按顺序插入。
Read:将内表中的一行拷贝到工作区中。
Change:使用工作区中的内容来覆盖内表里面的内容。
Dlete:删除内表行。
除了这5种操作
Collect:累加,将结构中的内容加到具有相同键的一行。只能为非键字段都是数字的表所用。
内表批量处理
LOOP循环:从内表的第一行开始,逐行把内表中的行记录放到into后面指定的工作区中。
第二行是删除,删除满足逻辑条件的所有内表的行。
第三行是插入行,拷贝一个内表的内容到另一个内表,和插入的那个语句有很大区别,一个是操作单个内表,一个是操作多个内表
第四行是附加行,把一个内表多行的内容,附加到另一个标准表的后面。
可以把需要的数据写入工作区,然后使用insert语句把他插入到内表
可以使用loop逐行读取并编辑内表行的内容,在运行中,系统字段sy-subrc包含了当前表条目的行号。
在例子中,所有内表顺序的被处理并使用write打印
如果要在LOOP过程中修改当前表行的内容,首先在工作区中修改行的拷贝,并使用MODIFY语句把它写回到当前的表行,语法是。
MODIFY itab FROM wa.
loop循环中,可以使用from-to指定行来限制存取,read table中可以使用index来指定需要的行记录行号。
对于loop循环,可以使用where 语句来限制条件 ,不符合条件的就不进入
使用read读取内表行时,额可以使用with table key指定整个键值,如果有一个对应的被找到了,返回码,sy-subrc被设置为0. with key 返回符合条件的第一条记录,with table key 记录数据不唯一。
标准表和哈希表排序
可以按照表键或者列使用sort语句进行排序,如果都没有
ascending是升序,descending是降序,只作用于前面紧挨的一个字段。默认asc
刷新
删除内表的整个内容,部分先前用过的内存依然为将来插入可用。
语句 pefresh 表名
清除
对于没有表头的内白哦,相当于刷新,如果有就只是初始化表头。
释放
删除内表整个内存并释放使用过的内存。
语句free 内表名
在调试器中,可以通过双击来追踪和显示内表的内容。
在table标签下面显示内表内容。
在定义内表时,使用附加语句with header line 我们创建了带表头行的内表,那么这个内表就会带有一个表头
表头的名字和内表同名,是内表的一个工作区。
内表表头的好处和坏处
内表表头就是内表的一个工作区,我们不用单独定义了。但是现在不建议这种方式,会影响可读性。
1.自动生成的和内表同名,可读性差
2.嵌套数据对象不能使用表头,ABAP对象也不能使用表头。
如果带头行内表称为itbab,那么itab-表字段被用来定位工作区中对应的字段
我们使用itab访问表的主体。
内表前面的一些操作和效果:进行了表的复制。使用表头语法没有问题,但不提倡银行
5.3.使用内表操作
首先打开一个程序
内表三种定义方式
使用ABAP字典
可以通过表ABAP字典中的表类型来定义
进入字典
搜索这个表类型BC402_T_FLIGHTS,这个是ABAP字典中的一个表类型。但我这里没有搜搜到,有可能是主播自己创建的。
如何创建内表对象
语法: DATA + 对象名+type +表类型
使用结构来定义内表
同样从ABAP字典中找到一个结构
语法: DATA + 对象名+ type table of+表类型
区别使用结构定义需要table of
不使用ABAP字典中的类型来定义
先创建一个结构体,然后同样的语句。
5种内表操作
APPEND
创建一个工作区并进行复制,然后appen到内表里面
调试一下,看值部分是0*4表示目前里面存了0条数据
下一步
可以看到已经有一条信息存入了
刚才工作区的值都追加进去了。
值也变为了1*4
INSERT
在标准表中append和insert是一样的
运行发生了报错
原因是使用insert时,需要指定一个index
当不够3时会放到最后一个
测试放到第一位。
发现找到了合适的位置,插入了进去。插入的位置就是咋们指定的地方。
READ
通常习惯呢,在read的之前把工作区清理空。
直接clear+工作区
调试查看,clear之后,工作区直接被清空,只有初始值。
确实取到了正确的值
使用with table key
使用前也需要清理工作区。
查看效果
sy-subrc=0说明读取成功
进去查看结果,成功读到了
with key也是可以读到记录的。
在read table之后要判断一下sy-subrc,
如果不是0,就要输出一下报错信息。
MODIFY更新
现在可以在内表中读取到某一行的记录,接下来尝试在工作区中更改这一行的记录。
使用MODIFY 列表 from 工作区
修改前
修改后
DELETE删除
delete 内表 index + 行号
就可以删除指定的一行了。
内表多行操作
再定义一个内表。
相同结构可以直接内拷。
这样就可以了。
调试一下OC4有四条记录
OC3只有三条记录
循环LOOP
语句: LOOP AT GT_OC4 INTO WA_OC3.
成功循环了
修改工作区中的值,先修改,然后进行更新。
这里没有写行号,因为有一个指针默认指向当前行,可以直接用
SY-INDEX这个是当前循环的序号
可以通过它来修改
SY-TABIX 表示内表当前行
运行
发现都修改成功了
CLEAR
内表数量如果过大,可以使用clear
发现数据都没有了,但是内存空间还没有完全释放。
如果有表头就清除不了了
可以加一个【】
clear 表名【】,就可以清空了。
FREE
完全清除一个表的数据和所占用的内存空间
FREE + 表名
where
修改一个表中所有数据的某个字段。
MODIFY GT_OC4 FROM WA_OC3 TRANSPORTING HIGH WHERE NAME+(4) = 'ABAP'.
name+(4)表示前四个字母。
都修改成功了