内表的整体赋值
:
如果想一次
将内表的全
部内容复制
到另一内表
中,请使用
MOVE
语句或赋值
操作符
(=)
,用
法如下:
MOVE <itab1> TO <itab2>.
该语句等价
于:
<itab2> = <itab1>.
report:zdz.
DATA: BEGIN OF LINE,
COL1,
COL2,
END OF LINE.
DATA ETAB LIKE LINE OCCURS 10 WITH HEADER LINE.
DATA FTAB LIKE LINE OCCURS 10.
LINE-COL1 = 'A'. LINE-COL2 = 'B'.
APPEND LINE TO ETAB.
*因为ETAB是带表头行的,所以ETAB[]才是内表,ETAB是工作区
*所以 MOVE ETAB TO FTAB.会报错(类型不匹配)
MOVE ETAB[] TO FTAB.
LOOP AT FTAB INTO LINE.
WRITE: / LINE-COL1, LINE-COL2.
ENDLOOP.
初始化内表的作用是清空内表所有的数据行,将内表恢复到填充或赋值之前的状态。初始化内表要注意的问题仍然是初始化
有表头行
和
无表头行
的内表的区别,以及初始化内表和表头行的区别。
(1)
.
Clear
用法:
clear itab
。
正确的应该是:对与一个有工作区的内表
itab
,
clear itab
清空的是工作区,而不清空内表;
clear itab[]
是清空内表,而不清空工作区。
REPORT demo_int_tables_append .
* append ... to
DATA: BEGIN OF wa ,
col1(1) TYPE c,
col2 TYPE i,
END OF wa.
DATA itab LIKE standard table of wa with header line.
DO 3 TIMES.
itab-col1 = sy-index. itab-col2 = sy-index ** 2.
APPEND itab.
ENDDO.
LOOP AT itab.
WRITE: / itab-col1, itab-col2.
ENDLOOP.
skip.
*
不是说带表头行的内表
,
itab
代表表头行
(
工作区
),
itab[]
才代表内表吗
?
*在loop at循环中itab就代表内表,而不是表头行(工作区)
loop at itab into wa.
write: / wa-col1,wa-col2.
endloop.
skip.
*
不管什么时候
itab[]
都代表内表本身
loop at itab[] into wa.
write: / wa-col1,wa-col2.
endloop.
skip.
*
在不在
loop
循环中的时候才是
itab
代表表头行
,
而
itab[]
代表内表本身
write : / itab-col1, itab-col2.
skip.
*
对与有表头行的内表
,
clear itab
和
clear itab[]
的区别
clear itab.
clear itab[].
LOOP AT itab.
WRITE: / itab-col1, itab-col2.
ENDLOOP.
*下边会多输出一个零,是工作区中的默认值(字符型默认值为空,数值型默认值为0)
write : / itab-col1, itab-col2.
(2) .
Refresh和Free
这两个关键字的作用基本相同,都是只能清空
内表
中的数据,而不能清空
内表同名工作区
中的数据。区别就是
refresh
并不会同时将预先分配给内表的内存释放,
而
free
则同时释放了预先分配给内表的内存(默认的是
8K
)。
clear
也不释放掉内存。
REPORT demo_int_tables_append .
* append ... to
*
定义工作区
wa
DATA: BEGIN OF wa,
col1(1) TYPE c,
col2 TYPE i,
END OF wa.
*
下边定义了一个内表
itab
,
(no work area, no header line)
DATA itab LIKE standard TABLE OF wa with header line.
DO 3 TIMES.
wa-col1 = sy-index. wa-col2 = sy-index ** 2.
APPEND wa TO itab.
ENDDO.
LOOP AT itab INTO wa.
WRITE: / wa-col1, wa-col2.
ENDLOOP.
itab-col1 = 'x'.
itab-col2 = 100.
*refresh和free一样都只是清空内表中数据,而不清工作区
refresh itab.
*free itab只是清空了内表中数据,没清空工作取中数据
*free itab.
*用if itab is not initial来判别内表工作区是否为空
if itab is not initial.
write / 'itab is not empty'.
endif.
*if itab[] is initial来判别内表是否为空
if itab[] is initial.
write / 'itab[] is
empty'.
endif.
write: / itab-col1,itab-col2.
1.
如果内表行是结构体,则可以指定结构体中的某几个字段作为内表关键字,该字段不能是内表或者引用类型,但是可以是嵌套的结构体。
REPORT demo_structure.
types: BEGIN OF name,
title(5)
TYPE c,
first_name(10) TYPE c,
last_name(10)
TYPE c,
END OF name.
types: BEGIN OF mylist,
client
TYPE name,
number
TYPE i,
END OF mylist.
DATA :list type table of mylist
with non-unique key number
with header line.
2.
如果内表的整行都是由基本类型字段组成,则可以将内表的整个行定义为表关键字。如果内表字段本身是结构化类型,
则不宜指定整行作为关键字段
。所以下边的做法是不好的。
REPORT demo_structure.
types: BEGIN OF name,
title(5)
TYPE c,
first_name(10) TYPE c,
last_name(10)
TYPE c,
END OF name.
types: BEGIN OF mylist,
client
TYPE name,
number
TYPE i,
END OF mylist.
DATA :list type table of mylist
with non-unique key table line
with header line.
3
.
如果不指定任何关键字,则系统会默认的选择关键字段。(扁平结构内表的默认关键字段为非数字和非内表的组件字段)如果内表行是由单个基本类型组成,则默认关键字为整个行。如果内表行中包含有内表类型字段,则没有默认关键字。
4
.
关键
UNIQUE KEY
(不可以出现关键字相同的数据行)
/ NON-UNIQUE KEY
(可以出现关键字相同的数据行)
是决定了内表中具有相同关键字的数据行是否可以重复出现,在
标准内表
中不能用
UNIQUE KEY
,而且不需要特别指定
NON-UNIQUE KEY
。所以这个关键字在
标准内表
中一般都不需要写。
REPORT:ZDZ.
DATA: BEGIN OF ITAB OCCURS 10,
LAND(3)
TYPE C,
NAME(10) TYPE C,
AGE
TYPE I,
WEIGHT
TYPE P DECIMALS 2,
END OF ITAB.
ITAB-LAND = 'USA'. ITAB-NAME
= 'Nancy'.
ITAB-AGE
= 35.
ITAB-WEIGHT = '45.00'.
APPEND ITAB.
ITAB-LAND = 'USA'. ITAB-NAME
= 'Howard'.
ITAB-AGE
= 40.
ITAB-WEIGHT = '95.00'.
APPEND ITAB.
ITAB-LAND = 'GB'.
ITAB-NAME
= 'Jenny'.
ITAB-AGE
= 18.
ITAB-WEIGHT = '50.00'.
APPEND ITAB.
ITAB-LAND = 'F'.
ITAB-NAME
= 'Michele'.
ITAB-AGE
= 30.
ITAB-WEIGHT = '60.00'.
APPEND ITAB.
ITAB-LAND = 'G'.
ITAB-NAME
= 'Karl'.
ITAB-AGE
= 60.
ITAB-WEIGHT = '75.00'.
APPEND ITAB.
SORT ITAB.
LOOP AT ITAB.
WRITE: / ITAB-LAND, ITAB-NAME, ITAB-AGE, ITAB-WEIGHT.
ENDLOOP.
SKIP.
SORT ITAB DESCENDING BY LAND WEIGHT ASCENDING.
LOOP AT ITAB.
WRITE: / ITAB-LAND, ITAB-NAME, ITAB-AGE, ITAB-WEIGHT.
ENDLOOP.
在此创建有
表头行的内
表
ITAB
并用
5
行对其进行
填充。首先
根据其标准
关键字(
LAND
和
NAME
)
进行排序。
然后根据定
义为
LAND
和
WEIGHT
的排序关键
字进行排序
。一般排序
顺序定义为
降序,但对
于
WEIGHT
,
定义为升序
。这就是为
什么在第二
个
SORT
语句之后包
含
NAME
字段“
NANCY
”
的行在包含
NAME
字段“
HOWARD
”
的行之前输
出。
对于
<operator>
,
可以使用
比较所有字段类型
中的表格内
列出的所有
操作符
(
EQ
、
=
、
NE
、
<>
、
><
、
GE
、
>=
、
LE
、
<=
、
GT
、
>
、
LT
、
<
)。
进行内表比
较的第一个
条件是它们
包含的行数
。内表包含
的行数越多
,则内表就
越大。如果
两个内表行
数相同,则
逐行、逐个
组件进行比
较。如果表
格行的组件
本身就是内
表,则进行
递归比较。
如果使用等
于操作符以
外的操作符
,则系统找
到一对不相
等的组件后
就立即停止
比较并返回
该结果。
对于有表头
行的内表,
则可在表格
名之后使用
方括号
([])
以将表格工
作区域和表
格体区别开
来。
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA: ITAB LIKE LINE OCCURS 10,
JTAB LIKE LINE OCCURS 10.
DO 3 TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB.
ENDDO.
MOVE ITAB TO JTAB.
LINE-COL1 = 10. LINE-COL2 = 20.
APPEND LINE TO ITAB.
IF ITAB GT JTAB.
WRITE / 'ITAB GT JTAB'.
ENDIF.
APPEND LINE TO JTAB.
IF ITAB EQ JTAB.
WRITE / 'ITAB EQ JTAB'.
ENDIF.
LINE-COL1 = 30. LINE-COL2 = 80.
APPEND LINE TO ITAB.
IF JTAB LE ITAB.
WRITE / 'JTAB LE ITAB'.
ENDIF.
LINE-COL1 = 50. LINE-COL2 = 60.
APPEND LINE TO JTAB.
IF ITAB NE JTAB.
WRITE / 'ITAB NE JTAB'.
ENDIF.
IF ITAB LT JTAB.
WRITE / 'ITAB LT JTAB'.
ENDIF.
其输出为:
ITAB GT JTAB
ITAB EQ JTAB
JTAB LE ITAB
ITAB NE JTAB
ITAB LT JTAB
在此创建两
个内表:
ITAB
和
JTAB
。
用
3
行填充
ITAB
并将其复制
到
JTAB
中。然后将
另一行附加
给
ITAB
并且第一个
逻辑表达式
测试
ITAB
是否大于
JTAB
。
在将同一行
附加给
JTAB
之后,第二
个逻辑表达
式测试两个
表格是否相
等。然后将
另一行附加
给
ITAB
,第三个逻
辑表达式测
试
JTAB
是否小于或
等于
ITAB
。
然后将一行
附加给
JTAB
,
其此组件内
容与
ITAB
最后一行中
组件的内容
不相等。下
一逻辑表达
式测试
ITAB
是否与
JTAB
不相等。从
中找到
ITAB
和
JTAB
不同之处的
第一个组件
是最后一个
表格行中的
COL1
。
ITAB
是
30
列而
JTAB
则是
50
列。因此在
最后一个逻
辑表达式中
,
ITAB
小于
JTAB
。
(二)、整个内表的操作 1、内表赋值 内表的整体赋值:如果想一次 将内表的全 部内容复制 到另一内表 中,请使用 MOVE 语句或赋值 操作符 (=),用 法如下:MOVE TO . 该语句等价于: = . report:zdz.DATA: BEGIN OF LINE, COL1,
type-pools: slis.
field-symbols: <dyn_
table
> type standard
table
, ”
内表
结构
<dyn_wa>, ” 表头
<dyn_field>. ” 项
data: dy_
table
type ref to data,
dy_line type ref to data, ” 行
xfc type lvc_s_fcat, ” 列结构
ifc type lvc_t_fcat.
call method cl_alv_
table
_create=>create_dynamic_
table
exporting
it_fieldcatalog = ifc
importing
ep_
table
= dy_
table
.
assign dy_
table
->* to <dyn_
table
>.
create data dy_line like line of <dyn_
table
>.
assign dy_line->* to <dyn_wa>.
DESCRIBE
TABLE
IT_TEMP LINES L_LINE1.
SORT IT_TEMP BYMATID.
DELETEADJACENT DUPLICATES FROM IT_TEMP COMPARING MATID.
DESCRIBE
TABLE
IT_TEMP LINES L_LINE2.
IF L_LINE1
MESSAGE 'Red
1.insert ***(数据库表) from
table
t_tab(
内表
) ACCEPTING DUPLICATE KEYS.(自动跳过已存在相同KEY值行)
1.update ***(数据库表)set field(数据库表字段) = ** where field2(数据库表字段) = *
1.modify ***(数据库表) from WA(结构) [有相同KEY值就修改,没有就更新]
2.modify *(数据库表) from
table
t_tab.
1delete fro
可以使用FM:CTVB_COMPARE_
TABLE
S来比较两个
内表
间的差异,有那些纪录是新增的,那些是修改过的和那些是被删除的。
直接使用 if itab1[] = itab2[].
endif.
判断
两个
内表
内容是否相同,这种方法虽然简单但是也有一定的局限性,就是只有两个
内表
的内容完全一致 时,才认为
相等
。如果
内表
内容的排列顺序不一致,也认为两个
内表
不等,也就是说‘=’是一条一条比较的。
REPORT
ztest_compare_it.
DA...
我们都知道
ABAP
可以
整体
复制
内表
,如果想将
内表
的全部内容复制到另一个
内表
中,可以进行
整体
赋值
操作
,使用MOVE或”=”。
MOVE itab1 TOitab2.
Itab1 = itab2.
那么比较
内表
大小?
内表
可用作逻辑表达式的
操作
数进行比较.…
itab1itab2.
其中可以为
操作
符
GE,>=
LT,业务表的
操作
。
次键(Secondary Keys)是相对于
内表
的主键(Primary Keys)而言的第二级键值。
通常
内表
的类型便决定了
内表
访问的数据索引方式 - 例如标准表是“线性查找”,排序表是“二分查找”,哈希表通过“哈希算法”进行查找。
但这是基于主键访问的基础上的。如果对于哈希表的访问是通过非主键字段进行时,那么查找方式又将会是“线性查找”,而线性查找对于大数据量而言是效率最低的方式。
如何解决这种问题呢?答案就是为
内表
定义次键(Secondary Key)。
********
用处:当程序中处理有固定结构的数据时候,就需要使用
内表
,特别是
内表
是在程序中存储数据库表的载体。
内表
:Internal memory
table
内存中的表,是外设(屏幕、磁盘,打印机等)和数据库表数据交换的中介。
注意: 在
ABAP
语言中不提供二维数组,
内表
相当于二维数组, 它是一个表示内存的二维数据结构(m行*n列)。与传统二维数组的区别,二维
内表
是每个
ABAP
开发人员都必须懂的,数据从R3取出来后,就是放在
内表
里处理的,其实就是Java中的集合框架,只是没有那么多不同数据结构的
内表
,目前只有标准、排序、Hash三种,这还是新的语法,老的只有个标准的,关于
内表
这方面的定义、性能,以后我专贴一篇文章吧。这里只是对
内表
的常用
操作
,这也是项目中用得最多的点!
3.
内表
3.4. 适合所有类型的
内表
操作
COLLECT
* 添加数据
APPEND VALUE #( customer_id = '001' customer_name = 'John' country = 'USA' ) TO it_customers.
APPEND VALUE #( customer_id = '002' customer_name = 'Jane' country = 'Canada' ) TO it_customers.
APPEND VALUE #( customer_id = '001' customer_name = 'Jack' country = 'USA' ) TO it_customers.
* 使用非唯一键检索数据
SELECT * FROM
TABLE
it_customers INTO
TABLE
@DATA(result) WHERE customer_id = '001'.
在上面的示例中,定义了一个名为ty_customer的结构体,并在标准表it_customers中定义了一个非唯一键customer_id。接下来,向it_customers表中添加了三行数据,其中
两行
具有相同的customer_id值。最后,使用SELECT语句并WHERE子句指定customer_id = '001'来检索所有具有此特定值的行,并将结果存储在result表中。
使用NON-UNIQUE KEY的优点是可以在表中存储具有相同键值的多行数据,并且可以使用SELECT语句检索这些数据。这在某些情况下可能更加方便,比如在需要按照某个键值分组数据并进行分析时。
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
茶色...:
Linux 重启后重新Mount磁盘
hehui0921:
M个苹果放在N个盘子里,有多少种不同的放法
qq_28069031:
JPA QuerySyntaxException:XXX is not mapped
Rhine_danji_ys:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
Randolph605: