ABAP对内表 *** 作要通过工作区域进行的疑问

ABAP对内表 *** 作要通过工作区域进行的疑问,第1张

首先你要理解什么是内表,什么是工作区;

因为在ABAP中常用的SQL是SAP自带的OPEN SQL,它与NATIVE SQL不同,还要多一层解析的过程。因此,在ABAP中使用多表JOIN(>3)的效率远小于将数据存储到内表后,再对内表进行后续的 *** 作。

而内表,实际上就是一个临时存储空间,有效的范围是当前程序;

而工作区,实际上就是一个结构,它与内表的区别就是,内表存放的是多条记录,而工作区是一条;

针对Q1:对于大多数的处理内表是无法批量更新的,因此内表的 *** 作要将数据放在工作区进行,然 后处理完后更新到内表。

针对Q2:你的这个SQL只是将数据存放到内表中,并没有做任何其他的 *** 作。

谢谢~O(∩_∩)O~

可执行程序的特点是可以直接执行,而无需事务码,这个也是一般报表开发最常用的程序类型。我们可以在SE38中直接点击执行按钮或按F8键来运行一个可执行程序。

可执行程序包含一些预定义的过程块,比如、ATSELECTION-SCREEN、START-OF-SELECTION、END-OF-SELECTION等等,有一个后台系统程序会控制可执行程序,按照规定的顺序依次调用这些过程块。首先显示一个选择屏幕,最后输出一个列表。可执行程序还能指定一个逻辑数据库,逻辑数据库也是一种程序,它按照预定义好的数据库表结构,依次根据主键读取相关的业务数据,可以用SE36查看逻辑数据库。

内表:在程序内部定义并使用的表。

内表刚定义时不会事先指定占用实际内存的大小,用INITAL SIZE也并不能使内表占用实际内存空间,只是预约内存空间。

标准表:有顺次索引的树形结构内表,是可以利用索引和关键字 *** 作的内表;标准表的关键字不唯一,在定义时不能使用WITH UNIQUE KEY语句。

DATA: 表名 LIKE/TYPE STANDARD TABLE OF 要参考的变量或类型                                                   WITH NO-UNIQUE KEY    字段名

排序表:与标准表一样都是索引表,其中排序表是已经按照关键字排序好的内表类型,且可以使用WITH UNIQUE KEY 或 WITH NO-UNIQUE KEY;排序表是已经排序好的内表类型,所以不能使用SORT语句进行再次排序。

DATA: 表名 LIKE/TYPE SORTED TABLE OF 要参考的变量或类型                                                   WITH NO-UNIQUE KEY    字段名

哈希表:没有索引,只能指定UNIQUE关键字(关键字内容不能重复)。

DATA:表名 LIKE/TYPE HASHED TABLE OF 要参考的变量或类型                                                   WITH UNIQUE KEY    字段名

在定义内表时没有WITH HEADER LINE则该内表没有表头,在往内表里APPEND数据时,需要追加工作区(这里可以是结构体,也就是说需要先给工作区赋值,然后再APPEND 工作区 TO 内表)。其它对内表行内容执行的 *** 作同样也要借助工作区才能实现。

如果在定义内表时追加WITH HEADER LINE(表头),这时就定义了一个带表头的内表,表头的下一行就是内表的第一行,这时内表的表头就承担了工作区的职能。

往带表头的的内表里追加数据时,只需要先给表头赋值,在APPEN 内表名就可以了

APPEND itab = APPEND itab TO itab(这句话的意思就是把表头里的数据追加到内表中)

这是因为内表名与表头名相同

INSERT itab/wa INTO TABLE itab = INSERT TABLE itab

COLLECT itab/wa INTO itab = COLLECT itab

READ TABLE itab INTO itab/wa = READ TABLE itab

内表赋值

MOVE itab1 TO itab2 "这里需要注意的是带表头的内表用这种赋值方法只会赋值表头中的数据。

要想赋值表体中的数据,可以用以下的方式:

MOVE itab1[] TO itab2[]

当然这两种赋值方式执行成功的前提是两个表的类型需一致,要想赋值不同类型的内表可以使用如下:

MOVE-CORRESPONDING itab1 TO itab2 "这种方式是赋值对应字段

内表的初始化

CLEAR itab (带表头的内表只删表头,不带表头的内表删表体)

CLEAR itab[] (删除带表头的表体)

内表排序

1SORT(可以排序标准表和哈希表)

用内表的关键字堆排序语法:SORT itab [ASCENDING | DESCENDING]其中ASCENDING是升序(默认排序),DESCENDING是降序。对于没有设有关键字的内表进行排序时,讲组合字符串类型的字段作为主键进行排序。

2指定排序字段

SORT itab [ASCENDING | DECENDING]  BY f1 [ ASCENDING | DECENDING]                                      fn [ASCENDING | DECENDING](如果字段f1出现空值,则会排出此列)

3Stable SORT

SORT itab STABLE "保留序列号

内表属性

DESCRIBE TABLE itab [LINES gv_line] [OCCURS gv_init] [KIND kind]"LINES返回包含的数据件数,OCCURES返回内表的初始大小,KIND返回内表的类型T(标准表)S(排序表)H(哈希表)。

追加内表数据

1INSERT

追加一条数据时(两个表的类型相同 ) INSERT wa INTO TABLE itab"没有定义表头的内表

                                                              INSERT itab  "定义过表头的内表

追加多条数据时(两个表类型相同)

      INSERT lines OF itab1 [FROM n1] [TO n2] INTO TABLE itab2" 带不带表头的内表都可以使用这种方式。

2利用索引追加一条数据(不能用于哈希表)

INSERT line INTO itab [Index idx]"利用Index语句可以在指定的索引位置追加一条数据,语句执行成功时SY-SUBRC返回0,SY-TABIX返回索引值,带表头的内表INSERT itab INDEX 1

利用索引还可以追加多条数据

INSERT LINES OF itab1 INTO itab2 INDEX idx

不同类型的内表具有各自不同的INSERT效果

标准表:追加数据到内表的最后一行(与APPEND效果相同)

排序表:按照内表排序好的顺序追加数据(若关键字是不唯一的,重复数据会追加到相同数据的上一行中,若关键字唯一则报错)

哈希表:按照表关键字的哈希索引顺序追加数据

2APPEND

只能利用索引追加数据,因此哈希表不能使用此语句

追加一条数据时(表类型相同): APPEND wa TO itab (SY-TABIX保存追加数据的内表行,即追加后内表的索引编号)

追加多条数时(表类型相同):APPEND LINES OF itab1 [FROM n1] [TO n2] TO itab2      

注意:尽量不要使用APPEND往SORTED TABLE 里追加数据                                                                                                                  

3COLLECT:可以合计内表中数字类型的字段

除了关键字以外的数据都需要是数字类型(f,i,p)(这不代表关键字不能是数字类型),当存在相同关键字的数据时,合计数字类型的字段,不存在相同关键字的数据时,直接追加数据(不存在关键字的内表,则会把char类型的字段作为关键字进行相同的 *** 作)

COLLECT wa INTO itab

1MODIFY(可以利用关键字或索引修改数据)

    利用关键字修改一条数据(若内表关键字NON-UNIQUE,即存在重复数据时,会修改第一条数据):MODIFY TABLE itab FROM wa [TRANSPORTING f1 fn]( 利用transporting可以修改指定字段 );如果是带表头的内表可以省略FROM wa

    利用WHERE条件修改多条数据:MODIFY itab FROM wa TRANSORTING f1 fn WHERE cond (其中cond是字段限制条件)

    利用索引修改一条数据:MODIFY TABLE itab FROM wa INDEX idx [TRANSPORTING f1 fn](在loop循环中可以省略index选项,此时会修改当前行数据)

在LOOP循环中,MODIFY TABLE itab变为MODIFY itab

    利用工作区删除内表中的一条数据:DELETE TABLE itab FROM wa

    在关键字不唯一的标准表中使用WITH TABLE KEY删除重复数据中的一条数据:DELETE TABLE itab WITH TABLE KEY k1 = f1 kn = fn

    利用WHERE条件删除多条数据:DELETE itab WHERE cond

    利用索引删除内表数据:DELTE itab INDEX idx

 利用索引也可以删除多条数据

DELETE itab FROM n1 TO n2"删除从n1到n2的数据

DELETE itab FROM n1"删除从n1开始之后的所有数据

DELETE itab TO n2"删除从开始到n2的数据

    利用ADJACENT DUPLICATE语句删除重复行(执行此语句前,先用SORT语句进行排序)

DELETE ADJACENT DUPLICATE FROM itab COMPARING  ALL FIELDS(所有字段相同才算重复)                                                            COMPARING 指定字段 (指定字段相同才算重复)

利用read读取内表数据。当存在表头时,对应得数据会保存到表头中。

    利用关键字读取内表:READ TABLE itab FROM wa INTO result(wa和result均是工作区,可以利用给wa赋值某关键字去唯一确定内表中的一行数据,然后读取到result中)如果内表存在表头可以省略FROM以及之后的内容。                                                                          READ TABLE itab WITH TABLE KEY k1=f1 kn=fn INTO result(带表头的内表可以省略INTO之后的内容)

    利用索引读取内表:READ TABLE itab INDEX INTO result(带表头的内表省略INTO之后的内容)

以上就是关于ABAP对内表 *** 作要通过工作区域进行的疑问全部的内容,包括:ABAP对内表 *** 作要通过工作区域进行的疑问、sap怎么看abap程序逻辑取值_sap逻辑是什么、ABAP 内表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9761509.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存