请问在ABAP中,内表的表头有什么作用和意义?有无表头对程序有什么影响?
1.内表的表头对于代码的书写来说更加简便了。
比如 内部表T_TAB, 它的一条记录为W_TAB,他有两个项目,ID和value,现在需要给内部表加一条记录。假如这个内部表有表头行的话,代码如下:
T_TAB-ID = 1.
T_TAB-VALUE = 'VALUE1'.
APPEND T_TAB.
假如这个内部表是没有表头行的话,代码如下:
W_TAB-ID = 1.
W_TAB-VALUE = 'VALUE1'.
APPEND W_TAB TO T_TAB.
还有其他的一些操作也是带表头行的内标书写简单COLLECT T_TAB / LOOP AT T_TAB / READ T_TAB等
2.使用带表头行的内部表容易在编写程序时abap开发顾问是程序员吗出错,并降低可读性。
由于带有表头行,所以在程序里面“T_TAB”代表两种意思,一是内部表T_TAB,二是内部表的表头行T_TAB,具体是那个意思要看情况,这就给读程序造成了障碍;而且程序员写程序的时候,由于T_TAB可以做2种解释,所以当他手误错写了T_TAB的时候,可能不会导致编译出错,但实际是错的,导致错误不容易被发现;在对内部表进行初始化、清空时,带有表头的内部表加入直接写“CLEAR T_TAB.”这样被清的是T_TAB的表头行,而不是内部表,这样的话编译没错,但程序逻辑就不对了。所以一般使用“REFRESH T_TAB”或者“CLEAR T_TAB[]”。
*对于带表头行的内部表,T_TAB[]指的就是去除表头行后纯粹的内部表数据。
总的来说,建议使用标准的内部表,即没有表头行的内部表,但同时也要掌握带表头行的内部表的操作。用表头不如自己定义work area或指针的效率高
ABAP表头
每个ABAP顾问,在接触ABAP的第一天,就会接触内表,同时面对一个选择,内表是带表头好,还是不带表头好。
我以一个资深菜鸟的眼光来看,带表头与否取决于每个开发顾问的思维模式。如果你喜欢表头,那么你在编码的时候思维必须非常连续,每一步都必须很清楚的知道你在干什么;不喜欢表头,喜欢定义工作区的,他的思维的逻辑性一定很强。还是贴代码来说明问题。
先看看带表头的:
data: lt_ekpo like table of ekko with header line.
data: l_tabix type sy-tabix.
loop at lt_ekpo.
move sy-tabix to l_tabix.
.............
modify lt_ekpo index l_tabix.
end loop.
在这里,loop at 语句就把内表抓到表头里面进行处理,最后用modify 语句进行更新。我个人更喜欢这种
处理方法。
再来看看不带表头的。
data: lt_ekko type standard table of ekko,
ls_ekko like ekko.
lt_ekko 和 ls_ekko是两个相同字段的结构,只不过一个是表,一个是工作区。
loop at lt_ekko.
move sy-tabix to l_tabix.
read table lt_ekko index l_tabix to ls_ekko.
.............
append ls_ekko to lt_ekko.
clear ls_ekko.
endloop.
这里吧lt_ekko中的每一行读到ls_ekko 中进行处理,处理完以后把结构append回内表当中。
有表头行与无表头行在模块化中的运用(ABAP)
PROGRAM SAPMZTST.
TYPES: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
COL2 TYPE I,
END OF LINE.
DATA: ITAB TYPE LINE OCCURS 10 WITH HEADER LINE,
JTAB TYPE LINE OCCURS 10.
JTAB TYPE LINE OCCURS 10.
PERFORM FILL TABLES ITAB.
MOVE ITAB[] TO JTAB.
PERFORM OUT TABLES JTAB.
MOVE ITAB[] TO JTAB.
PERFORM OUT TABLES JTAB.
FORM FILL TABLES F_ITAB LIKE ITAB[].
DO 3 TIMES.
F_ITAB-COL1 = SY-INDEX.
F_ITAB-COL2 = SY-INDEX ** 2.
APPEND F_ITAB.
ENDDO.
DO 3 TIMES.
F_ITAB-COL1 = SY-INDEX.
F_ITAB-COL2 = SY-INDEX ** 2.
APPEND F_ITAB.
ENDDO.
ENDFORM.
FORM OUT TABLES F_ITAB LIKE JTAB.
LOOP AT F_ITAB.
WRITE: / F_ITAB-COL1, F_ITAB-COL2.
ENDLOOP.
ENDFORM.
LOOP AT F_ITAB.
WRITE: / F_ITAB-COL1, F_ITAB-COL2.
ENDLOOP.
ENDFORM.
启动 SAPMZTST 后,输出如 下:
1 1
2 4
3 9
详细解释:WITH HEADER LINE 指明了ITAB要带表头行,
先解释下表头行的作用吧:
内表是按行 进行访问的 。必须使用 某个工作区 域作为与表 格互相传输 数据的接口 。在先前的
学习中我们都又看见这样一个访问内表的句子: LOOP AT F_ITAB INTO F_LINE. F_LINE就是
这样一个接口。那么如果有表头行的话,你就可以省略F_LINE,直接LOOP AT F_ITAB,因为表头行就
是这样一个系统帮你创建的一个表格工作区域(只要你声明时加上WITH HEADER LINE ),那ITAB[]
中的[]是用来做什么的?这个其实是因为如果在语句中使用内表名称,系统将其解释为表格工作区域
的名称,也就是ITAB其实代表 表头行、表格工作区域、访问内表的接口。这样应该理解了吧。有表
头行的内表在运用时要带个中括号,这样才是我们平时用的内表
重点理解:FORM OUT TABLES F_ITAB LIKE JTAB.
请注意,在这种情况下, 将无表头行 的实表格传递给有表头行的形式表 格,并在子程序中使用了表格工作域 F_ITAB。
这是因为如果传递无表头行的内表,则在子程序中自动创建作为局部数据对象的表头行,也就是说F_ITAB是带表头行的,所以LOOP AT F_ITAB.的后面不用指明表格工作区域
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论