科莱特教育

 找回密码
 立即注册
查看: 3836|回复: 7

abap结构 内表 工作区具体指什么?

[复制链接]

1

主题

2

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2021-7-27 03:49:14 | 显示全部楼层 |阅读模式
最好可以用生活中别的东西形容一下,概念看了好多次,还不太理解。还有为什么不推荐直接定义工作区内表同名,每次定义结构 内表工作区后不理解这些东西为什么要定义,在哪里使用。











回复

使用道具 举报

1

主题

4

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2021-7-27 03:52:16 | 显示全部楼层
举一个场景:

现在有一个表,表有两列(col_a,col_b).

你要对表内的数据进行处理,使col_b=col_a.

那么首先,你要有一个跟表一样有两个字段的一个结构。然后loop表的每一行,到这个结构,在结构里面进行赋值操作,操作完之后在更新到内表。

这个结构就是工作区,简单来说,就是对表行数据进行操作的一个结构。

之所以不建议用同名工作区,是因为有些操作是需要区分工作区和表的,对于新手,很容易出现疏漏,比如一个带工作的内表,需要清空的话需要写:

clear: itab[],很多人会忘掉括号,诸如此类,很多容易疏忽的场景!
回复 支持 1 反对 0

使用道具 举报

1

主题

3

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2021-7-27 03:54:51 | 显示全部楼层
解释一下很容易,内表就是其他编程语言里的可变长数组,类似ArrayList一样的东西。工作区就是内表的一行。为什么不推荐同名,因为两者同名的语法是相当老的历史遗留物了,现在由于语言的更新早已不建议这么写。你想象一下,你一段程序,同一个变量名,在这里表示一段数组,隔开两行表示数组里的一个元素。

为什么叫这么个鸟名字?从英文文档的Term你可以看出中文名的来源。

internal table “内表”

working area "工作区"

至于英文名为什么也这么别扭。

鬼知道
回复 支持 反对

使用道具 举报

3

主题

7

帖子

31

积分

新手上路

Rank: 1

积分
31
发表于 2021-7-27 03:56:40 | 显示全部楼层
举个不是很严谨的例子:内表就类似一个excel表,工作区可以理解为具有同样字段的表,但是这个表只有一行。你无法直接访问内表的某个具体行,只能将打算操作的那一行读取到工作区,对工作区进行更改,再用工作区去修改内表。至于工作区内表同名嘛,你在声明内表的时候,加上with headline,就得到了一个带表头的内表,可以理解为一个自带工作区的内表,这时候内表和工作区的名字就是一样的了.
回复 支持 反对

使用道具 举报

3

主题

4

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2021-7-28 07:56:59 | 显示全部楼层
Chocolate 发表于 2021-7-27 03:54
解释一下很容易,内表就是其他编程语言里的可变长数组,类似ArrayList一样的东西。工作区就是内表的一行。 ...

这位兄弟总结的很好了,工作区内标不推荐同名是因为容易混淆,特别是做clear的时候。
回复 支持 反对

使用道具 举报

1

主题

2

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2021-7-28 07:57:55 | 显示全部楼层
佳氏若水 发表于 2021-7-27 03:56
举个不是很严谨的例子:内表就类似一个excel表,工作区可以理解为具有同样字段的表,但是这个表只有一行。 ...

为什么带了headline就表示自带工作区??
回复 支持 反对

使用道具 举报

3

主题

7

帖子

31

积分

新手上路

Rank: 1

积分
31
发表于 2021-7-28 07:58:22 | 显示全部楼层
Krypton 发表于 2021-7-28 07:57
为什么带了headline就表示自带工作区??

因为语法规则就是这样的呀……
回复 支持 反对

使用道具 举报

3

主题

7

帖子

27

积分

新手上路

Rank: 1

积分
27
发表于 2021-7-28 08:00:09 | 显示全部楼层
工作区就是只有一行的结构容器,对于type相同的內表来说,通过loop at和read table语句定位到哪一行,工作区里存的就是哪一行的值。

带表头行的內表通常定义方式为:
data lt_table type standard table of ty_type with headerline.
旧语法为
data begin of lt_table occurs 0,
...
end of lt_table.
这种內表自带一个同名工作区,很多程序写法就会很有迷惑性,如:
clear lt_table.
效果为清空同名工作区,而不是內表。
清空內表的语句为:
clear lt_table[].或
refresh lt_table.
对于无表头的內表来说,
clear lt_table 效果为清空內表。

对于下面的语句会更费解:
read table lt_table index l_index transporting no fields.
效果是不会给同名工作区赋值为內表l_index行,只是给sy-tabix系统变量定位到內表的l_index行,同时也不会清空工作区中的原有值。
这样会让程序可控性暴降。所以很多开发规范中禁用带表头的內表。
如果没有大量的重定位操作,这种內表还是可以用的,标准程序里就大量使用带表头工作区的內表。
最后,这些东西你看下自带的教程,自己练习个测试程序,比问别人的效果好得多。
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则


QQ|科莱特教育

GMT, 2024-11-21 17:49 , Processed in 0.046317 second(s), 24 queries .

福州科莱特教育科技有限公司 版权所有 闽ICP备2021003729号-2

Copyright C 2018-2022 All Rights Reserved

快速回复 返回顶部 返回列表