【博主SAP/ABAP交流群689746838】
假设ty_ab是个结构类型。
带表头的内表定义:DATA gt_ab01 TYPE STANDARD TABLE OF ty_ab WITH HEADER LINE.
不带表头的内表定义:DATA gt_ab02 TPYE STANDARD TABLE OF ty_ab.
首先,带表头的内表在很久以前就是SAP不再推荐的做法了,除非是改老程序等特殊情况,自己新开发程序建议不要再使用带表头的内表。带表头虽然可以让代码简洁一些,但是容易引起歧义,也不方便阅读。而且在OO环境里(比如BADI)已不支持带表头的内表了。
接着介绍下带表头的内表的一些特点以及与不带表头的内表的用法差异。
内表带表头,即变量名既可以代表内表本身,也可以代表表头,具体代表什么要看具体使用环境,以gt_ab01为例:
LOOP AT gt_ab01.
ENDLOOP.
此时gt_ab01是内表。
gt_ab01-col = 'XXX'.
此时gt_ab01是表头。
清空带表头的内表,必须是CLEAR gt_ab01。如果没有[],则系统只是会清空表头,而不会清空内表。同理,判断内表是否为空,也必须是IF gt_ab01[] IS NOT INITIAL.。不带表头的内表,由于变量名总是内表,所以使用时不需要加[]。
带表头的内表和不带表头的内表不能互相赋值。
gt_ab01 = gt_ab02或gt_ab02 =gt_ab01都会有编译错误,需要写成gt_ab01[] = gt_ab02或gt_ab02 = gt_ab01[]。但有一种情况例外,即FUNCTION MODULE里的Tables参数,定义在Tables里的参数默认都是带表头的内表。
CALL FUNCTION 'ZFUNCTION'
TABLES
et_ab = gt_ab
无论gt_ab是否带表头,都是可以的。
目前Tables参数也不建议在RFC以外的场合使用,如果要使用内表参数,则先在SE11里根据结构定义表类型,然后在Import,Export或者Changing里使用,在这三个参数里的内表都是不带表头的,在调用时不能给带表头的内表。
总结,推荐做法是先定义类型,再参考该类型定义不带表头的内表和结构,例如:
TYPES:
BEGIN of ty_ab,
col1 TYPE int,
END of ty_ab.
DATA:
gt_ab TYPE STANDARD TABLE OF ty_ab,
gs_ab TYPE ty_ab.