相关文章推荐
仗义的夕阳  ·  Axisfault ...·  4 月前    · 

内表的整体赋值

如果想一次 将内表的全 部内容复制 到另一内表 中,请使用 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 茶色...: 但format对我的确有用,弄了一下午,看了好多方法,还换了一个SQL驱动,试过之后都是一个❌,然后下定决心格式化,然后的然后...就好啦,哈哈哈哈哈 表情包 Linux 重启后重新Mount磁盘 hehui0921: 下次重启呢? M个苹果放在N个盘子里,有多少种不同的放法 qq_28069031: 第7号代码应该为 fun(m,m) JPA QuerySyntaxException:XXX is not mapped Rhine_danji_ys: 没想到犯的这么低级的错误! 表情包 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask Randolph605: 不懂别瞎比比,还format