5.ABAP结构体和内表

news2024/12/26 11:59:19

总学习目录请点击下面连接

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)表示前四个字母。

都修改成功了

删除特定的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3D 生成重建030-SV3D合成环绕视频以生成3D

3D 生成重建030-SV3D合成环绕视频以生成3D 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 论文提出了Stable Video 3D (SV3D)——一个用于生成围绕三维物体的高分辨率图像到多视角视频的潜在视频扩散模型。最近关于三维生成的文献提出了将二维生成模型应用于新视图合成…

中介者模式的理解和实践

一、中介者模式概述 中介者模式(Mediator Pattern),也称为调解者模式或调停者模式,是一种行为设计模式。它的核心思想是通过引入一个中介者对象来封装一系列对象之间的交互,使得这些对象不必直接相互作用,从…

【蓝桥杯每日一题】砍竹子

砍竹子 2024-12-7 蓝桥杯每日一题 砍竹子 STL 贪心 题目大意 这天, 小明在砍竹子, 他面前有 nn 棵竹子排成一排, 一开始第 ii 棵竹子的 高度为 h i h_i hi​. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为…

泷羽sec-burpsuite(5)app渗透测试(上) 学习笔记

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

从一个Bug谈前端响应拦截器的应用

一、问题场景 今天在开发商品管理系统时,遇到了一个有趣的问题:当添加重复的商品编号时,页面同时弹出了两条 "商品编号已存在" 错误提示: 这个问题暴露了前端错误处理机制的混乱,让我们从这个问题出发&…

量子变分算法---损失函数

引子 关于损失函数,我们知道在强化学习中,会有一个函数,用来表示模型每一次行为的分数,通过最大化得分,建立一个正反馈机制,若模型为最优则加分最多,若决策不佳则加很少分或者扣分。而在神经网络…

车间的图纸在传输过程的安全怎么保障?

车间的图纸在传输过程的安全保障,要从很多方面出发分析,本文从以下几点为大家列出几个,看看有没有你想知道的呢~ 1、采用先进的图纸加密软件 采用先进的加密算法对图纸进行加密处理,确保图纸文件在存储、传输和使用过程中的安全性…

MQTT消息服务器mosquitto介绍及说明

Mosquitto是一个开源的消息代理软件,支持MQTT协议(消息队列遥测传输协议)。MQTT是一种轻量级的发布/订阅消息传输协议,专为低带宽、不可靠网络环境下的物联网设备通信而设计。以下是关于Mosquitto服务器的一些介绍和说明&#xff…

想在iPad上远程操作安卓手机的APP,怎样实现iPad远程控制安卓?

学生党或互联网行业的打工人,人手连三台电子设备也很常见,手机、平板还有笔记本电脑一大堆,如果出门要全带上,背包压力也变大。 有没有想过用远程控制功能,让iPad远程控制安卓手机?这样做,出门就…

VBA高级应用30例应用在Excel中的ListObject对象:向表中添加注释

《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…

Spring源码分析之Bean的实例化(createBeanInstance())

前言: 通过Spring源码分析之Bean的创建过程(createBean)-CSDN博客我们可以知道如果没有动态代理以及循环依赖的前提之下的话那么一个普通的单例Bean的创建后就是实例化,属性填充,初始化这三个步骤那么这篇文章的话我们就先说一下实例化也就是doCreateBean方法里面的createBeanI…

一次“okhttp访问间隔60秒,提示unexpected end of stream“的问题排查过程

一、现象 okhttp调用某个服务,如果第二次访问间隔上一次访问时间超过60s,返回错误:"unexpected end of stream"。 二、最终定位原因: 空闲连接如果超过60秒,服务端会主动关闭连接。此时客户端恰巧访问了这…

蓝桥杯准备训练(lesson5 ,c++)

单目操作符与第 2 章 C/C输⼊输出(上) 8. 单⽬操作符8.1 和--8.1.1 前置 和 后置8.1.2 前置-- 和 后置-- 8.2 和 - 第 2 章 C/C输⼊输出(上)1. getchar 和 putchar1.1 getchar()1.2 putchar() 2. scanf 和 printf2.1 printf2.1.1…

Linux系统挂载exfat格式U盘教程,触觉智能RK3562开发板演示

本文介绍Linux系统(Ubuntu/Debian通用)挂载exfat格式U盘的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教…

LeetCode 0935.骑士拨号器:动态规划(DP)

【LetMeFly】935.骑士拨号器:动态规划(DP) 力扣题目链接:https://leetcode.cn/problems/knight-dialer/ 象棋骑士有一个独特的移动方式,它可以垂直移动两个方格,水平移动一个方格,或者水平移动两个方格,垂…

No.4 笔记 探索网络安全:揭开Web世界的隐秘防线

在这个数字时代,网络安全无处不在。了解Web安全的基本知识,不仅能保护我们自己,也能帮助我们在技术上更进一步。让我们一起深入探索Web安全的世界,掌握那些必备的安全知识! 1. 客户端与WEB应用安全 前端漏洞&#xff1…

PHP使用local-proxy的一种思路! | 架构师之路(19)

《架构师之路:架构设计中的100个知识点》 19.脚本语言使用长连接的一种思路 脚本类语言,例如PHP,不能像C/Java那样能搞服务常驻内存,不能搞长连接? 为什么脚本语言要搞长连接? 脚本类语言每次访问后端数据库…

【51单片机】程序实验1112.外部中断-定时器中断

主要参考学习资料:B站【普中官方】51单片机手把手教学视频 前置知识:C语言 单片机套装:普中STC51单片机开发板A4标准版套餐7 码字不易,求点赞收藏加关注(•ω•̥) 有问题欢迎评论区讨论~ 目录 程序实验11&12.外部中断-定时器…

驱动---1.DAC8552实现三角波输出

最近开始进行新项目的研发,考虑用DAC做一个前级输出,选择了DAC8552这个器件的一个模块,用了野火的指南者做主控,芯片是STM32F103VET6,主频是72MHz。 一、器件手册重要信息提取 1.DAC8552具有十六位的分辨率、双通道输…

虚幻引擎生存建造系统

先做一个建造预览模式,按下按键B后进入建造预览模式 首先创建自定义事件Preview Loop 用射线追踪摆放物体预览位置,并做一个预览材质 增强输入设置按键 每帧判断是否进入建造模式 预览模式制作成功! 接着做点击左键放置物品&#xff0…