wwwlehu6.vip乐虎官网ABAP 内表 详解

老式的内表类型定义…
214

基于基本类型内表类型…
214

依照结构体类型内表类型…
215

老式的内表对象创制…
215

参考现有内表类型或内表对象来创制…
215

参照现有结构类型或结构对象来创建…
215

二种内表对象等效创造…
215

带暗许表头的内表的行类型不能够是内表…
216

DATA与WITH HEADER
LINE.
217

风行内表的定义…
217

行使第2索引…
221

INDEX/ANY TABLE通用型内表…
222

内表全部操作…
222

内表间赋值…
222

正如内表…
222

排序内表SO奥迪Q3T…..
223

据他们说钦定的字段实行排序
BY.
223

接字母顺序(字符语义)举行排序AS
TEXT.
224

安静排序STABLE.
227

DESCLX570IBETABLE获取内表属性…
227

赢得内表数据行数
Lines()227

内表行操作…
227

单行操作…
227

多行操作…
228

适用全部项目内表的行操作…
228

INSE纳瓦拉T向表中插入行…
228

布署一行…
228

布署多行FROM…TO..
229

COLLECT合并…
229

READ 读取行…
230

内定搜索关键字段…
231

采纳表关键字段进行读取…
231

应用其余首要字段实行读取…
232

以行首字段搜索…
233

USING
KEY.. 233

<result>钦赐额外处理选项…
233

点名工作区…
233

COMPA卡宴ING相比读取的单行内容…
234

TRANSPORAV4TING读取一行的片段字段…
234

动用字段符号…
235

MODIFY 修改行…
236

修改单条记录(TABLE KEY)…
236

修改多条记下(WHERE)…
237

DELETE 删除行…
237

循环中插入或删除行…
237

剔除单行(TABLE KEY)…
238

除去多行(WHERE)…
238

删除邻近重复行(ADJACENT DUPLICATE)…
239

LOOP在循环中处理行…
240

SUM..
240

AT.
241

适用索引表的行操作…
246

APPEND 附加行…
246

外加单行…
246

外加多行FROM…
TO..
247

以排序格局附加…
248

APPEND …SORTED
BY….. 248

USING
KEY. 249

INSE卡宴T插入到钦点的索引地方…
250

插入单行…
250

布置多行FROM…TO..
251

READ读取内定索引地点上的行…
251

在索引表中进行二分搜索…
252

在内表中寻觅字符串…
253

MODIFY修改钦点索引地方上的行…
254

修改单行…
254

修改当前循环行…USING KEY
loop_key…..
254

选取W智跑ITE TO进行修改…
255

DELETE删除内定索引地方上的行…
256

除去单行…
256

循环中删除行…USING KEY
loop_key…..
256

剔除多行…
258

在循环使用FROM…TO限制行的读取范围…
259

选取字段符号实行访问…
259

运用表头替换工作区…
260

实用的Ranges内表

内表

老式的内表类型定义

老式内表唯有标准内表一种,使用OCCU锐界S选项来定义了正规化内表,那是ABAP3.0事先的定义内表的做法了,在新版的ABAP不提议利用,因为在新的版本中有两种内表类型(标准、排序、哈希)。

 

TYPES <t><type> OCCURS
<n>.

内表中行的数据类型在<type>中钦点。要内定行的数据类型,能够采纳 TYPE 或 LIKE 参数。

依照基本类型内表类型

假定去掉了 OCCUENCORES 则象征是一般档次而不是内表类型了
TYPES
vector TYPE i OCCURS 10.
比方要带隐藏表头则势须求加上WITH HEADERAV4LINE,不然默许没有,而且不得不在宣称内表变量时加,而无法在上边定义内表类型时加
DATA
vector TYPE vector WITH HEADER LINE.

vector =

  1. APPEND vector.

 

地点的TYPES与下部语句等效:

TYPES
vector TYPE STANDARD TABLE OF
i
        WITH
NON-UNIQUE DEFAULT KEY
       
INITIAL SIZE 10.

 

本示例创制内表数据类型 vector,其行包括基本类型 I 字段。

 

注:WITH HEADEGL450 LINE只可以与DATA关键字一起行使,而不可能与TYPES一起行使,那也算得,唯有在分配了储存空间时才有隐形工作区这一说,在概念内表类型时是从未有过的。

 

上边这样也得以:

TYPES vector TYPE i.
DATA vector TYPE vector OCCURS **0** WITH HEADER LINE.
vector = 1.
APPEND vector.

依据结构体类型内表类型

出于并未加 occurs 选项,所以定义的是一布局类型
TYPES: BEGIN OF line,
         column1 TYPE i,
         column2
TYPE i,
         column3
TYPE i,
       END OF
line.
概念一内表类型而不是日常品种
TYPES itab TYPE
line
OCCURS 10.

本示例创立内表数据类型itab,其行与字段串line结构同样。

 

尤其注意,上边代码不能大约的写成如下方式,不然编写翻译出错:

TYPES: BEGIN OF itab OCCURS 10,
         column1
TYPE i,
         column2
TYPE i,
         column3
TYPE i,
      
END OF itab.

纵然用TYPES关键字定义内表类型时,不允许直接在布局类型(在大致的档次前边又有什么不可,如最上面的以身作则所示)前面加上 OCCU帕杰罗S 选项来将原来为协会类型转换来内表类型,须要像后边一样直接定义,但DATA关键字是足以的,那种语法规则不行尤其。

老式的内表对象创制

参照现有内表类型或内表对象来成立

DATA
<f><type> [WITH HEADER
LINE].

注:<type>必须是已存在的内表数据类型或内表数据对象(内表类型时行使TYPE 、内表对象使用 LIKE)

 

TYPES type TYPE i OCCURS

  1. DATA vector TYPE type WITH HEADER
    LINE.

参考现有结构类型或协会对象来创造

DATA
<f><type> OCCURS <n> [WITH HEADER
LINE].

注:<type>能够是已存在的结构类型或结构对象(结构类型时利用TYPE 、结构对象使用 LIKE),当然也得以不是组织类型,而是内表类型或基本项目都足以:

TYPES type TYPE
i.
DATA vector TYPE type OCCURS 0 WITH HEADER
LINE.

二种内表对象等效创造

本示例介绍怎么样行使两种差异的步调创造同一内表。

TYPES vector_type TYPE i OCCURS 10.
DATA vector TYPE vector_type WITH HEADER LINE.

因此平昔在 DATA 语句中使用 OCCUHighlanderS 选项成立与地点完全等同的数据类型 VECTO凯雷德:

DATA vector TYPE i OCCURS 10 WITH HEADER LINE.DATA vector TYPE i OCCU陆风X8S
10意味vector是一个内表而不是类型I的变量

OCCU大切诺基S的法力便是将惯常类型转换为内表类型

 

l  要创制既不引用现有对象,也不引用现有行结构的内表数据对象

DATA: BEGIN OF <f> OCCURS <n>,
  <component
declaration>,
  …
end of <f>.

该语句会暗许成立3个表头。约等于:

DATA itab TYPE STANDARD TABLE OF lineType
      WITH NON-UNIQUE DEFAULT KEY
      INITIAL SIZE n
      WITH HEADER LINE.

 

本示例会自行成立暗许表格工作区域 ITAB:

DATA: BEGIN OF itab OCCURS 10,
         column1 TYPE i,
         column2 TYPE i,
         column3 TYPE i,
       END OF itab.

 

但上面那种形式不会自动创制隐式工作区,除非在OCCU索罗德S
10后边丰盛选项“WITH HEADE兰德奇骏 LINE”(使用DATA…LIKE/TYPE…OCCUHighlanderS时不会成立私下认可工作区,唯有DATA: BEGIN OF … OCCUENVISIONS
…才会):

  DATA: BEGIN OF line,
          col1 TYPE i,
          col2 TYPE i,
        END OF line.
  DATA itab LIKE line OCCURS 10 .itab是2个内表而不是三个布局,与DATA itab LIKE standard table of line 等效

 

就如的还有语句:

TYPES tab TYPE|LIKE linetype OCCURS n.

DATA itab TYPE|LIKE linetype OCCURS n[WITH HEADER LINE].

相当于:

TYPES|DATA itab TYPE|LIKE STANDARD TABLE OF linetype
        WITH NON-UNIQUE DEFAULT KEY
        INITIAL SIZE n
[with header line].该选项只适用于DATA关键字,不可能与TYPES一起利用

上述二种格局均只适用于创立标准表,因为在旧的SAP版本中,标准表是绝无仅有的内表类型。

带暗中同意表头的内表的行类型不能够是内表

若是想创建带表头行的内表,行类型不可能一向是内表,但足以用内表作为组件的结构:

TYPES t1  TYPE i  OCCURS 10 .
TYPES t2 TYPE  t1  OCCURS 10 .

TYPES t3 TYPE t2.
“由于t2的行类型依旧内表,所以会报错:with header lne
无法用来项目为内表类型时

*DATA d1 TYPE t3 WITH HEADER
LINE.
*DATA d1 TYPE t2 WITH HEADER
LINE.

“下边那种精神上与地点  DATA d1 TYPE t2
WITH HEADE君越 LINE. 语句是均等效果,所以也会报错
*DATA d2 TYPE  t1  OCCURS 10  WITH HEADER
LINE.

“上边去掉 WITH HEADE途胜 LINE就能够了
DATA d2 TYPE  t1  OCCURS 10 .
“与地点语句等效
*DATA d2 TYPE  t2
.

“现向内表d第22中学加多少时,要由此以下步骤
DATA w_d1 LIKE LINE OF d2.”d2内表的行类型,照旧三个内表,以下还需进一步定义
DATA w_d1_2 LIKE LINE OF w_d1.”现在w_d1_2是一个构造对象了,该组织没有字段
w_d1_2 =
1.

APPEND w_d1_2 to w_d1 .
APPEND w_d1 to d2 .

 

“但作为内表内部组件是尚未难点的(因为那时的表头的品种是3个组织,而不是2个内表)
TYPES:BEGIN OF  t3,
  t1s TYPE  t2,
  END OF t3.

“那里一定要加上 occurs 关键字后,才表示定义的变量是二个内表对象,不然表示1个构造对象,原因是TYPE引用的项目作者是二个组织类型,则不是八个内表类型,除非TYPE引用的品种小编是3个内表类型,则就不再须求。
DATA d2 TYPE  t3  OCCURS 10  WITH HEADER
LINE.

DATA与WITH HEADER LINE

是还是不是带表头要求在运用DATA定义内表对象时鲜明钦定,假使不钦点默许不会带表头的:

TYPES: BEGIN OF line,
         column1 TYPE i,
         column2 TYPE i,
         column3 TYPE i,
       END OF line.
TYPES itab TYPE line OCCURS 10.
“定义内表对象,但不带表头
DATA tab1 TYPE itab.
“定义内表对象,带表头
DATA tab2 LIKE tab1 WITH HEADER LINE.

新颖内表的定义

TYPES dtype { {TYPE tabkind OF [REF
TO] type}
              | {LIKE tabkind OF
dobj} }
          [tabkeys]
            [INITIAL SIZE n].

tabkind:

… { {[STANDARD] TABLE}

| {SORTED TABLE}
    | {HASHED
TABLE}
    | {ANY
TABLE}
    | {INDEX
TABLE} } …

ANY TABLE 与 INDEX TABLE 通用项目只用用在不得不用在字段特号与格局参数中:

wwwlehu6.vip乐虎官网 1

tabkeys:

…[WITH[UNIQUE|NON-UNIQUE]{{KEY[primary_key[ALIAS key_name]COMPONENTS] comp1 comp2 …}|{DEFAULT
KEY}}]
 ”主键索引
[WITH{UNIQUE
HASHED}|{UNIQUE
SORTED}|{NON-UNIQUE
SORTED} KEY key_name COMPONENTS comp1 comp2 … ] …
“第三索引,最多辅助15个第一索引

[{WITH|WITHOUT} FURTHER SECONDARY KEYS ] …

 

概念内表数据对象还足以一向动用ABAP字典中的内表类型,或选择字典中的结构体或晶莹表类型作为内表的行类型

DATA itab { {TYPE [STANDARD]|SORTED|HASHED TABLE OF
[REF
TO] type}
          | {LIKE [STANDARD]|SORTED|HASHED TABLE OF
dobj} }
          [

[ WITH [UNIQUE | NON-UNIQUE]
{{KEY [primary_key [ALIAS key_name] COMPONENTS] comp1 comp2 …}
| {DEFAULT
KEY}
} ]”主键索引

[ WITH {UNIQUE
HASHED}|{UNIQUE
SORTED}|{NON-UNIQUE
SORTED}”secondary_key1,第叁索引
KEY key_name COMPONENTS comp1 comp2 … 
]

[ WITHsecondary_key2 ]…”第2索引,最多扶助15个第2索引

[INITIAL SIZE
n]
[WITH HEADER
LINE]
[VALUE IS
INITIAL]

 

 

type:能够是基本类型,如DATA: itab TYPE TABLE OF
i.

REF TO:表示内表类型为引用类型(该项目内表是用来存款和储蓄引用的,可针对某些内表)

INITIAL SIZE n:为内表内定开头行数。如若n为0,则会活动分协作适的行数。修改开端内部存款和储蓄器须要仅用于嵌套表,对于最外层内表没有需要,钦赐后反只怕影响属性,所以一般不要钦定。其余,该值对 APPEND…SORTED
BY…
有独特的效益

 

tabkind取值如下

2  标准表(**STANDARD TABLE**),系统为该表的每一行数据变化一个逻辑索引,自个儿之中维护着行号(Index)的编码。表的键值不唯一,且没有根据表键自动实行排序,帮忙通过索引访问和键访问二种艺术。填充标准表时能够插入到钦命地点或未来有行之后,程序对内表的寻址操作能够通过首要字或索引实行。在对表进行插入删除等操作时,各数据行在内存中的物理地方不变,系统仅重新排列各数据行的索引值。当平常用索引访问表的时候就分选标准表。

2  排序表(**SORTED TABLE**),也有二个逻辑索引,差异之处是排序表总是按其表关键字升序排序后现实行仓库储存,排序内表本人内部也维护着行号的编号,表的键值能够唯一大概不唯一,帮忙通过索引访问和键访问三种方法。假诺常常应用键来访问数据,可能希望多少可知自动排序时,就用排序表。

2  哈希表(**HASHED TABLE**),哈希表通过哈希函数生成的表键来标识和快捷访问表行,哈希表中的表键没有各类,其值在表中务必唯一,只同意通过表键来访问哈希表。寻址三个数据行的所需时间与表行数毫无干系。假诺内表相当的大还要希望用主键访问,就用哈希表。

 

各系列型内表充许的拜会形式(索引访问、关键字访问):标准内表首借使索引访问,排序内表首假诺Key访问,而哈希内表只好通过Key来访问:

wwwlehu6.vip乐虎官网 2

wwwlehu6.vip乐虎官网 3

对此索引类型的内表,当3个行操作语句执行达成后,SY-TABIX将重临该行的目录,成功SY-SUBOdysseyC重返0。

wwwlehu6.vip乐虎官网, 

即便索引比使用首要字定位行要快,但在半数以上状态下,大家透过重庆大学字定位一行数据,因数量出自数据库,大家不知底数据在哪行。

动用首要字定位一行数据区别内表的功能相比如下:

2  标准表,取决于表的行数,随行数线性增添。(但也得以先进行排序,再鲜明使用二分查找查找)

2  排序表,取决于表的行数,随行数对数级增加(系统暗中认可就会利用二分查找格局来搜寻)。

2  哈希表,与行数无关,在大数据量的情事下基于重点字查询是最快的

tabkeys表主键:

若果不点名关键字(注:唯有标准表可以毫不内定索引类型与第叁字,因为系统会给1个暗中认可的要紧字,即DEFAULTL KEY),则系统会动用默许(标准)关键字,如若钦赐,则有下列方式:

l  假若内表行结构是结构体,则足以内定结构体中的某多少个字段作为内表关键字:

…WITH[UNIQUE|NON-UNIQUE]KEYcomp1 comp2 …

请留意:四个首要字的排序依次很重庆大学,会影响到表的排序格局

l  假若内表的整整行都以由基本类型字段组成,或是由中央类型组成的布局类型字段:

…WITH[UNIQUE|NON-UNIQUE]KEYTABLE LINE|TABLE_LINE

TABLE LINE、TABLE_LINE:将表的整行作为Key,则能够动用TABLE_LINE

l  假若不点名别的重庆大学字,则足以应用暗许的行业内部主要字,该项为暗中同意选项:

…WITH[UNIQUE|NON-UNIQUE]DEFAULTKEY…

 

排序表在钦点Key的品类时,能够是UNIQUE也足以是NON-UNIQUE,所以排序内表是或不是足以储存重复的,则就是看定义时钦点的Key类型是UNIQUE照旧NON-UNIQUE

 

标准表只好选拔NON-UNIQUE(但能够简简单单);排序表能够用NON-UNIQUE或UNIQUE(无法大致);哈希表只好使用UNIQUE(不能简单)。

 

在概念内表时,能够不指首要字,此时利用暗中认可(标准)关键字,即一对一于 WITH KEY DEFAULT
KEY。如若定义的是STANDA昂科威D TABLE,则连WITH KEY DEFAULT KEY选项都得以简单;但如倘诺SOQashqaiTED
TABLE与HASHED
TABLE,如是须要钦赐为DEFAULT KEY时,无法省略WITH KEY DEFAULT KEY,并且须要确认保障该内表里有可有作为暗中认可Key的字段——如字符类型字段,不然不能够透过编写翻译。

 

在概念排序表与哈希表时,一定要内定索引类型与根本字(能够钦命为WITH KEY DEFAULT
KEY),否则编写翻译通过然则。

 

DEFAULT KEY:暗中同意标准Key为行结构中兼有byte-type(x ,xstring, xsequence)类型与character-type(c, d, n, t, string,
clike)类型的保有字段,其余全数类型都会被忽视;借使行结构中还有子结构,则该子结构中的全部前边提到的门类字段也会被抽取出来作为Key的一有的;内表类型的字段不会化为默许Key的一局地;假设没有byte-type、character-type类型字段,则暗中认可是不会有Key,:

DATA: BEGIN OF line0 OCCURS 0,
      i TYPE i ,
      c(1),
      END OF line0.
DATA: BEGIN OF line1,
      i TYPE i ,
      c(1),
      itab LIKE line0[],
      END OF line1.
DATA: BEGIN OF line2 OCCURS 0,
        i TYPE i ,
        c TYPE string,
        line LIKE line1,
      END OF line2.

line0-i = 1.
line0-c = ‘a’.
APPEND line0 .
line0-i = 2.
line0-c = ‘b’.
APPEND line0 .

line1-i = 3.
line1-c = ‘c’.
line1-itab = line0[].

line2-i = 4.
line2-c = ‘d’.
line2-line = line1.
APPEND line2.
LOOP AT  line2 .
  WRITE: / line2-i , line2-c.
ENDLOOP.

CLEAR: line1.
line1-i = 32.
line1-c = ‘c’.
CLEAR:line2.
line2-i = 5.
line2-c = ‘d’.
line2-line = line1.
“未安装line1-itab,但也能立异,那表达内表字段默许不会作为Key
MODIFY TABL埃利ne2.”依照重点字来修改内表
WRITE: / sy-subrc.
LOOP AT  line2 .
  WRITE: / line2-i , line2-c.
ENDLOOP.

 

就算数字类型字段默许(DEFUALT KEY)不作为关键字段,但足以选取KEY鲜明钦命;在运用KEY鲜明内定关键字段时,倘诺内表行包罗结构组件,还足以钦点到该结构组件的有些成分作为重庆大学字段:

TYPES: BEGIN OF line0,
      i TYPE i ,
      c(1),
      END OF line0.
TYPES: BEGIN OF line1,
      i TYPE i ,
      c(1),
      itab TYPE line0,
      END OF line1.
DATA itab1 TYPE TABLE OF
line1 WITH KEY i
itab.
DATA itab2 TYPE TABLE OF
line1 WITH KEY i
itab****i.

应用第贰索引

像数据库表一样,内表也能够制造八个目录,内表有三系列型第贰索引:

2  UNIQUE HASHED:           哈希算法第2索引

2  UNIQUE SOCR-VTED:            唯一升序第③索引

2  NON-UNIQUE SO智跑TED: 非唯一升序第壹索引

TYPES sbook_tab
      TYPE STANDARD
TABLE
      OF
sbook
      “主索引:固然要为主索引钦命名称,则只可以动用预置的
primary_key,
      “但足以经过前边的 ALIAS
选项来修改(注:ALIAS选项只可以用于排序与哈希表)
      WITH NON-UNIQUE KEY
primary_key “ALIAS
my_primary_key

           COMPONENTS carrid connid fldate bookid
      “第②个第一索引:唯一哈希算法
      WITH UNIQUE
HASHED KEY
hash_key
           COMPONENTS carrid connid fldate bookid
      “第二回之索引:非唯一升序排序索引
      WITH NON-UNIQUE
SORTED KEY
sort_key
           COMPONENTS customid.

 

第贰索引会影响怎么样行将被处理,以及处理顺序:

2  能够在READ TABLE
itab, LOOP AT itab, MODIFY itab, DELETE itab内表操作语句中经过WITH [TABLE] KEY …
COMPONENTS可能USING
KEY选项内定key_name来选拔第三索引

2  能够在INSE福特ExplorerT
itab与APPEND语句中通过USING
KEY选项来行使源内表的第三索引

 

DATA itab TYPE HASHED TABLE OF
dbtab
  WITH UNIQUE KEY
col1 col2 …

  “向内表itab中丰裕大量的数据 
  …

READ TABLE
itab “使用非主键举办搜索,搜索速度将会非常的慢
           WITH KEY col3 = … col4 = …

          
ASSIGNING

上边程序中定义了叁个哈希内表,在读取时未使用主键,在大数据量的气象下速度会不快,所以在搜寻字段上创造第3索引:
DATA itab TYPE HASHED TABLE
OF
 dbtab
  WITH UNIQUE KEY
col1 col2 …

  “为非主键创制第叁索引
  WITH NON-UNIQUE SORTED KEYsecond_key
    COMPONENTS col3 col4 …

  “向内表itab中添加大量的数据 
  …

READ TABLE
itab 基于第2索引举行查找,会比上面程序快
           WITH TABLE
KEY
 second_key
           COMPONENTS col3 = … col4 = …

           ASSIGNING …

在循环内表的Where条件中,尽管内表不是排序内表,则不会选拔二分查找,假设选拔SORAV4TED
KEY,则循环时,是或不是会用到二分查找?
LOOP AT itab USING
KEY
 second_key wherecol3=… col4=… .

ENDLOOP.

INDEX/ANY TABLE通用型内表

除上面三种标准项目外,还有一般性项目,即索引表(INDEX TABLE)和任意表(ANY TABLE),一般性项目能够用于类型定义中,但不能用于注明一(Wissu)(Dumex)个内表对象,因为它并没有指明任何显然的表类型,因此系统不或然分明对其操作情势。一般性项目还足以用来指明字段符号和接口参数的品种,其实际类型或然在运维期内才能够分明。

wwwlehu6.vip乐虎官网 4

内表全体操作

内表间赋值

四个内表添加应用批量日增代表逐行

不推荐:

LOOP AT
int_fligh1.
  APPEND int_fligh1 TO int_fligh2.
ENDLOOP.

推荐:

Append lines of
int_fligh1 to int_fligh2.

 

APPEND LINES OF<itab1>
[FROM<n1>] [TO<n2>] TO<itab2>.

 

APPEND LINES OF A TO B.

 

行类型包容的内表可以行使“=”间接开始展览赋值,前提是要求行结构可转换,规则参考那里Unicode fragment view of
structures

相比内表

EQ, =, NE, <>, ><, GE, >=, LE,
<=, GT, >, LT, <

 

正如规范:

先相比较四个内表的行数行,如若行数多的内表就大;假如多个内表的行数相等,将会一行一行、1个字段3个字段的相比,尽管字段自身是三个内表类型,则会递归比较;假诺不是相等比较时,只要某行有个别字段不等就会告一段落继续向后相比。

排序内表SO奥迪Q5T…

可以因此内表的KEY对标准表哈希表**按理说哈希表是不能展开排序的,但ABAP里是足以的,与Java区别)**进行排序:

SORT **<itab> [ASCENDING|DESCENDING] [AS
TEXT] [STABLE].**

SORT itab [STABLE]
          { {[ASCENDING|DESCENDING]
              [AS
TEXT
]
              [BY {comp1 [ASCENDING|DESCENDING] [AS
TEXT]}
                  {comp2 [ASCENDING|DESCENDING] [AS
TEXT]}
                  …
]}
          | {[BY (otab)]} }.

 

该语句默认会安分守纪内表所定义的持有重点字段(即primary table
key
)来进展排序(在尚未采纳BY (otab)的景况下),关键字段排序的先后顺序注重于标准键在内表中的Key定义的逐一。

 

默许是升序。

 

鉴于排序内表具有活动排序作用,因而用SO智跑T关键字对排序内表进行排序没有其余意义,也将会造成程序的编写翻译错误

 

DATA: itab TYPE HASHED
TABLE
OF c WITH UNIQUE DEFAULT
KEY WITH HEADER LINE.
INSERT ‘3’ INTO TABLE
itab.
INSERT ‘2’ INTO TABLE
itab.
INSERT ‘1’ INTO TABLE
itab.
LOOP AT  itab.
  WRITE: / itab.
ENDLOOP.
SORT itab .
SKIP.
LOOP AT  itab.
  WRITE: / itab.
ENDLOOP.

3

2

1

 

1

2

3

基于钦点的字段实行排序 BY

假若你有几个行类型为组织的内表,则在排序时得以钦点排序字段:

 

BY会打消前边的一体化排序字段,即不会再以暗中认可的严重性字段来排序,关键字段不现影响排序结构,那几个字段能够是别的类型,包含表格。假若钦点多个基本点字段,则系统第①根据<F1>,然后依据<F2>,以此类推对记录实行排序。系统选用BY 此前线指挥部定的排序方式(升序依旧降序)将用作 BY 之后内定的持有字段的缺省排序格局(即BY前面没有点名排序格局时会使用前边钦点的完整排序格局),且在单个字段之后钦赐的排序格局将掩盖在 BY 在此之前内定的这个字段的排序情势。

 

能够利用 (<name>) 代替<fi>实行动态设置,要是<name>在运转时为空,系统就将其忽视,假如带有无效的机件名,则发出实时错误。对于其余在排序字段中利用的字段,用户都可钦命偏移量和长短。

接字母顺序(字符语义)举行排序AS TEXT

CONVERT TEXT text INTOSORTABLECODE hex

基于当用户操作环境来生成字符text所对应的排序字符索引串,此索引串是与用户方今操作的环境有关,如语言、国家等。如汉语环境平台下,汉语字符串会依照汉语的拼音来进展排序,那种排序规则正是在里面采取了另一种专用来排序的编码,hex正是用来储存那种排序编码的。

能够运用SET LOCALE来安装用户所处语言环境

 

 

SET LOCALE LANGUAGE<lg>
[COUNTRY<cy>]

修改当前用户所处的言语环境

The fields <lg>, <cy>, and
<m> must be of type C and must have the same lengths as the
keyfields of table TCP0C. Table TCP0Cis a table, in which the
text environment is maintainedplatform-dependent.

SET LOCALE只影响SORT …
AS TEXT, TRANSLATE … TO

 

SET LOCALE LANGUAGE ”

当lg为空时,会再也安装为报到时的语言环境

 

SORT <itab> … AS TEXT …
.

基于用户如今所处的语言环境来展开排序(如中文环境下,中文字符按拼音的排序规则来拓展排序),假使不点名该选取,则会私下认可使用Unicode排序

要是待排序的字符串唯有ASCII字符,则没有须求选用该选用

 

publicclass T {

    publicstaticvoid main(String[]
args) throws UnsupportedEncodingException
{

        String str = “的”;

        byte[] b
= “的”.getBytes(“utf-8”);

      

        for (byte c : b) {

            System.out.print(byteToHex(c));

        }

      

    }

 

    publicstatic String
byteToHex(byte b) {

        return Integer.toHexString((b &
0x000000FF) | 0xFFFFFF00).substring(6)

               
.toUpperCase();

    }

}

E79A84

 

wwwlehu6.vip乐虎官网 5

wwwlehu6.vip乐虎官网 6

 

 

DATA: BEGIN OF line,
  c TYPE string,
  b TYPE xstring,
  x TYPE xstring,
  END OF line.
“在转移以前先一定要安装当前所要使用的语言环境
SET LOCALE LANGUAGE ‘1’ COUNTRY ‘CN’.
DATA: itab LIKE STANDARD TABLE OF line WITH HEADER LINE WITH NON-UNIQUE KEY c.

PERFORM append USING ‘的’.
PERFORM append USING ‘边’.
PERFORM append USING ‘二’.
PERFORM append USING ‘安’.
PERFORM append USING ‘长’.

WPRADOITE: / ‘–原始顺序–‘.
LOOP AT itab.
  WRITE: / itab-c,itab-b,itab-x.
ENDLOOP.
SKIP.
SORT itab BY c.
W汉兰达ITE: / ‘–按字符的Unicode编码实行排序–‘.
LOOP AT itab.
  WRITE: / itab-c,itab-b,itab-x.
ENDLOOP.
SKIP.
SORT itab BY b.
W昂科威ITE: / ‘–直接按字符的UTF8编码所对应的数字举办排序–‘.
LOOP AT itab.
  WRITE: / itab-c,itab-b,itab-x.
ENDLOOP.
SKIP.
SORT itab BY c AS TEXT.
WCRUISERITE: / ‘–按粤语语义(拼音)举行排序–‘.
LOOP AT itab.
  WRITE: / itab-c,itab-b,itab-x.
ENDLOOP.
SKIP.
W汉兰达ITE: / ‘–按粤语字符所对应的排序Key来实行排序–‘.
SORT itab BY x.
LOOP AT itab.
  WRITE: / itab-c,itab-b,itab-x.
ENDLOOP.

FORM append  USING  value(p_0059).
  itab-c = p_0059.
  DATA : l_con TYPE  REF  TO  cl_rpe_convert.
  CREATE  OBJECT l_con.
  CALL METHOD l_con->string_to_xstring
    EXPORTING
      input  = itab-c
    IMPORTING
      output = itab-b.
  CONVERT TEXT itab-c INTO SORTABLE CODE itab-x.
 
APPEND  itab.
ENDFORM.

–原始顺序–

的 E79A84
C6D501050105

边 E8BEB9
C57301050105

二 E4BA8C
C77201050105

安 E5AE89
A901050105

长 E995BF
C5F401050105

 

—-按字符的Unicode编码进行排序—-

二 E4BA8C
C77201050105

安 E5AE89
A901050105

的 E79A84
C6D501050105

边 E8BEB9
C57301050105

长 E995BF
C5F401050105

 

–直接按字符的UTF8编码所对应的数字实行排序–

二 E4BA8C
C77201050105

安 E5AE89
A901050105

的 E79A84
C6D501050105

边 E8BEB9
C57301050105

长 E995BF
C5F401050105

 

–按普通话语义(拼音)实行排序–

安 E5AE89
A901050105

边 E8BEB9
C57301050105

长 E995BF
C5F401050105

的 E79A84
C6D501050105

二 E4BA8C
C77201050105

 

–按中文字符所对应的排序Key来开始展览排序–

安 E5AE89
A901050105

边 E8BEB9
C57301050105

长 E995BF
C5F401050105

的 E79A84
C6D501050105

二 E4BA8C
C77201050105

安居排序STABLE

SORT <itab> …
STABLE.

倘诺对于数组中冒出的任意a[i],a[j](i<j),其中a[i]==a[j],在开始展览排序未来a[i]肯定出现在a[j]事先,则觉得该排序是安静的。(相等的数额不会再交换地方,排序后依然后维持原有顺序)。

 

不知底为何,去掉 STABLE 选项好像依旧身左右逢源康的,难道私下认可正是稳定排序?

DESC哈弗IBETABLE获取内表属性

DESCRIBETABLE

赢得内表数据行数 Lines()

… lines( arg ) …

The function lines determines the number of lines in
an internal table. The argument arg must be an internal
table.

内表行操作

单行操作

wwwlehu6.vip乐虎官网 7

多行操作

wwwlehu6.vip乐虎官网 8

适用全数项目内表的行操作

在该节中列出的操作适用全部类型的内表。借使你在操作此前知道内表的系列,请使用万分的操作,比如,使用 APPEND…TO 语句填充索引内表,使用 INSE瑞鹰T…INTO TABLE 来填充Hash表或通用性类型(ANY
TABLE、INDEX
TABLE),那样作用会高级中学一年级些。

INSE宝马X5T向表中插入行

INSERT wa|{INITIAL
LINE
}|{LINES OF jtab [FROM
idx1] [TO
idx2]

[USING KEY
key_name|(name)
]} 
INTO {TABLE
itab
}
{ ASSIGNING <fs>
[CASTING]
}|{ REFERENCE INTO
dref }.

 

无法向排序表中插入重复的多少,不然抛分外。

万一贯哈希表中插入重得的数目,不会起效果,也不会抛格外。

 

l  向UNIQUE 的排序表或哈希表插入重复的多寡时,不会抛非常,但数量不会被插入进去,那与APPEND是不等同的

插入一行

INSERT <line> INTO TABLE<itab>.

<line>能够是一个工作区只怕是 INITIAL
LINE。

 

要是向2个 unique key 内表中插入重复的数目行,则SY-SUBHighlanderC to
4。

 

向不相同门类表中插入的事态:

2  标准表:会在内表最后新增行,与 APPEND 效果等同。

2  排序表:会依据表关键字段插入到适合的岗位。假使是3个 non-unique 内表,会将重新的行插入到曾经存在数据行的前面。所成本的时间会趁机表中的数量扩张成对数格局的扩大。

2  哈希表:使用哈希算根据表关键字计算出所插入的地方,哈希表不会因为数据行的加码而速度放慢。

插入多行FROM…TO

INSERT LINES OF <itab1> [FROM
<n1>] [TO <n2>] INTO
TABLE
<itab2>.

<itab1> and
<itab2>要具备相当的行类型。系统将使用单条插入规则一条条插入到<itab2>中。假若<itab1>是多个索引类型的表,则能够钦赐待插入的第1行<n1>与最后一行<n2>数据的目录。

 

在于表格大小和插入地方的两样,用该形式将三个报表插入到另壹当中的速度比在循环中逐行进行扦插要快近20倍。

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
col3 TYPE c,
END OF line.
DATA: itab LIKE STANDARD TABLE OF line,
      jtab LIKE SORTED TABLE OF line
            WITH NON-UNIQUE KEY col1 col2.
DO 2 TIMES.
  line-col1 = sy-index. line-col2 = sy-index ** 2.line-col3 = ‘a’.
  APPEND line TO itab.
  line-col1 = sy-index. line-col2 = sy-index ** 3.line-col3 = ‘b’.
  APPEND line TO jtab.
ENDDO.
“会将再次的行插入到已经存在数据行的如今
INSERT lines of itab INTO TABLE
jtab.
LOOP AT jtab INTO line.
  WRITE: / sy-tabix, line-col1, line-col2,line-col3.
ENDLOOP.

        
1           1           1  a

        
2           1           1  b

        
3           2           4  a

        
4           2           8  b

COLLECT合并

COLLECT [<wa>INTO]
<itab>{ ASSIGNING<fs>
[CASTING] } | { REFERENCEINTO dref }.

<itab>必须是扁平组织,所有其余非关键字段的字段必须是数字类型(I、F、P):

DATA: BEGIN OF line,
col1 TYPE c,
col2 TYPE i,
col3 TYPE c,
END OF line.
DATA: itab like STANDARD TABLE OF line
        WITH HEADER LINE WITH NON-UNIQUE key col1.
itab-col1 = ‘a’.
itab-col2 = 1.
itab-col3 = ‘b’.
APPEND itab.
itab-col1 = ‘a’.
itab-col2 = 2.
itab-col3 = ‘c’.
“编写翻译出错:非关键字段必须是 I P F
数字类型
*COLLECT itab INTO
itab.

 

COLLECT语句将2当中拥有相同关键字段值的行中同名的数字字段的值累计到一条记下上,唯有非表关键字段被增进;当在内表中找不到钦命的被累加行时,COLLECT语句的意义与APPEND语句是千篇一律的,即将2个工作区的剧情添加到内表中。使用COLLECT操作的内表有二个范围,即该的行结构中,除了表键字段以外的拥有字段都不可能不是数字型(i、p、f)

 

假设仅使用 COLLECT 语句填入内表,则不会见世重复条目,因而适用于总结表的布局。

 

不相同类别的内表计算意况:

ü  标准表:系统会挨个查找是不是业已存在的行,所花时间会随着表的行数线性扩大,若是原始表里设有重新的行,则只会与第壹行统一。SY-TABIX存款和储蓄了COLLECT操作所对应的插入或联合索引号。

ü  排序表:系统选取二分查找法搜索已存在的行,索引的运作的光阴会随着行数的充实成对数级的充实。SY-TABIX存款和储蓄了COLLECT操作所对应的插入或合并索引号

ü  哈希表:系统接纳哈希算法查找已存在的行,在运用COLLECT后,SY-TABIX的值还会是0,因为哈希表没有索引。

 

DATA: BEGIN OF line,
col1(3) TYPE c,
col2(2) TYPE n,
col3 TYPE i,
END OF line.
DATA itab LIKE SORTED TABLE OF line
      WITH NON-UNIQUE KEY col1 col2.
line-col1 = ‘abc’. line-col2 = ’12’. line-col3 = 3.
COLLECT line INTO itab.
WRITE / sy-tabix.
line-col1 = ‘def’. line-col2 = ’34’. line-col3 = 5.
COLLECT line INTO itab.
WRITE / sy-tabix.
line-col1 = ‘abc’. line-col2 = ’12’. line-col3 = 7.
COLLECT line INTO itab.
WRITE / sy-tabix.
LOOP AT itab INTO line.
  WRITE: / line-col1, line-col2, line-col3.
ENDLOOP.

        
1

        
2

        
1

abc 12        
10

def 34         
5

READ 读取行

READ TABLE itab { 
{FROM
wa
[USING
KEY
 key_name|(name)]}
| {WITH TABLE
KEY
 [key_name|(name) COMPONENTS] {comp_name1|(name1)} = dobj1 {comp_name2|(name2)} = dobj2 …}
| WITH
KEY
 {comp1 = dobj1 comp2 = dobj2 … [BINARY
SEARCH
]} | {key_name|(name) COMPONENTS comp1 = dobj1 comp2 = dobj2 …}
|INDEX
idx

[USING
KEY
 key_name|(name)] }
{INTO wa [[COMPARING { {comp1
comp2
…}|{ALL FIELDS}|{NO
FIELDS} }] [TRANSPORTING{ {comp1
comp2
…}|{ALL
FIELDS} }]]}| {ASSIGNING<fs> [CASTING]} | {REFERENCE INTO
dref} | {TRANSPORTING NO
FIELDS}..

comp1
comp2
 …
… { comp_name[-sub_comp][{+off(len)}|{->attr}] }
| {(name)} …

 

倘若未钦定USING KEY选项,则默许会动用primary table
key。

设若内表定义了其次排序索引sorted secondary
key,则足以选择 USING KEY 选项来内定那些第①排序索引,即读取时,依照此第叁排序Key排序之后的目录来读取,但无法动用secondary hashed key.

一旦内表的secondary key 存在,使用了USING KEY时,INDEX选项能够动用到不相同类型的内表中(比如能够给Hash内表创立2个次之排序索引sorted secondary
key,则在读取此Hash内表时,能够利用索引INDEX形式来读取) 

 

sy-subrc

sy-tabix

0

找到记录

sy-tabix为主或第二索引值primary or secondary table index used,如果是hash key,则sy-tabix为0

2

找到记录,但COMPARING时相应字段不同

sy-tabix为主或第二索引值primary or secondary table index used,如果是hash key,则sy-tabix为0

4

记录没找到,且未读取到内表尾部

如果READ TABLE语句中明确地使用BINARY SEARCH方式读取、或者读取时使用了USE KEY、WITH [TABLE] KEY key_name选项明确的指定通过UNIQUE SORTED、NON-UNIQUE SORTED类型的第二辅助索引来方式来读取的、又或者读取的内表本身就是排序类型,则sy-tabix的值为待查记录在该内表中本应该出现的位置索引,除些之外,sy-tabix的值是不确定的

8

记录没有找到,且读取到内表尾部了
如果通过了二分搜索,且探索到尾部都还没有搜到时,sy-tabix的值为rows + 1

点名搜索关键字段

寻找关键字段能够是表关键字段,也可也是别的非表关键字段。

要是是non-unique的内表,有双重行时,会回去第①条数据。

运用表关键字段进行读取

READ TABLE<itab>FROM <wa><result>.

或者

READ TABLE <itab>WITH TABLE KEY<k1> =
<f1> …<kn>
= <fn><result>.

 

首先种的<wa>必须与行类型包容,以表关键字为寻找条件,且值来自<wa>,假若相应关键字段的值为空,则匹配全部的记录,即便拥有主要字都为空,则会读取第③行

第①种也是利用全体表关键字段进搜索,k1…kn能够动态内定(如(<ni>) =
<fi>.)。

 

一旦在读取时,未使用第1帮助索引Key,而是采用的暗许的primary table key ,则差别的项目标内表读取的措施分裂:

ü  标准表:顺序搜索,查找时间会随着条目标充实而线性扩展

ü  排序表:二分查找,查找时间会趁机条目标充实而对数级增添

ü  哈希表:使用哈希算法实行查询,查找时间不借助于条目数

 

DATA: BEGIN OF line,
         col1
TYPE c,
         col2
TYPE p DECIMALS 5,
      END OF line.
DATA itab LIKE line OCCURS 10 WITH HEADER
LINE.
DO 5 TIMES.
  line-col1 = sy-index.  line-col2 = SQRT( sy-index ).
  APPEND line TO
itab.
ENDDO.

CLEAR: itab,line.
itab-col1 = ‘2’.
READ TABLE itab INTO line.条件来自表头关键字段,并将查找到的结果存入到工作区
WRITE: / sy-subrc, itab-col2, line-col2.

CLEAR: itab,line.
itab-col1 = ‘2’.
READ TABLE itab.条件来自表头关键字段,并将查找到的结果存入表头
WRITE: / sy-subrc, itab-col2, line-col2.

    0          
0.00000           1.41421

    0          
1.41421           0.00000

 

利用此外关键字段进行读取

借使采用其余非表关键字段为尺度举办查找时,可以动用以下语句:

READ TABLE<itab>WITH KEY=
<key><result>.

或者

READ TABLE <itab> WITH KEY<k1> = <f1>
… <kn> = <fn><result>.

 

在率先个语句中,key是多个工作区,并且整个内表的行的拥有字段都会作为搜索条件。注:一定是整行,而不是内表本身那三个根本字段所组成的字段,相当于说与内表本人关键字段没有其他涉及,请看上面示例:

DATA: BEGIN OF line,
         col1 TYPE c,
         col2 TYPE n,
         col3 TYPE i,
      END OF line,
      line2 LIKE line.
DATA: itab LIKE STANDARD TABLE OF line WITH HEADER LINE WITH KEY col1 col2 .
line-col1 = ‘1’.
line-col2 = ‘1’.
line-col3 = 10.
APPEND line TO itab.
line-col1 = ‘2’.
line-col2 = ‘2’.
line-col3 = 20.
APPEND line TO itab.
CLEAR: line.
line-col1 = ‘1’.
line-col2 = ‘1’.
“注:那里不能省略上边语句,不然查找不到
line-col3 = 10.
READ TABLE itab INTO line2 WITH KEY = line.
WRITE: / sy-subrc, line2-col1.

“**假诺行类型自己就是骨干项目时
DATA: itab2 TYPE STANDARD TABLE OF i WITH HEADER LINE with KEY TABLE_LINE.
itab2 = 2.
append itab2.
itab2 = 1.
append itab2.
READ TABLE itab2 WITH KEY = 2.
WRITE: / sy-subrc,
itab2.

 

在其次个语句中,那里的 k1…kn 不自然是内表中真的的要害字段,只如若内表行组件即可。借使 k1…kn 要到运维时才知道,则能够运用(‘ key ‘) =
<f>
的格式来动态钦点要比较的字段,倘若 key 为空,则会忽视比较。

 

上述三种三种方式对于有着表都以顺序搜索,所需时间随着表的数据量增添或线性扩张。

以行首字段寻找

要将内表的行首定义为第贰字,请使用 WITH KEY 选项

READ TABLE <itab>WITH
KEY<k><result>.

<k>不可能包括内表或含有内表的结构。

DATA: BEGIN OF
line,
         i TYPE i,
         c TYPE c,
      END OF line.
DATA itab LIKE line OCCURS 10.
line-i = 10.
line-c = ‘a’.
append line to itab.
CLEAR: line.
“以率先个字段为key
READ TABLE
itab INTO line WITH KEY 10.
WRITE: / sy-subrc, line-c.

   0   
a

USING KEY

READ TABLE itab {FROM wa [USING KEY
key_name|(name)]}

 

DATA: sflight_tab TYPE HASHED TABLE OF
sflight
                  WITH UNIQUE KEY
primary_key  COMPONENTS carrid connid
fldate
                  WITH NON-UNIQUE SORTED
KEY
 occupied_seats COMPONENTS seatsocc,
      sflight_wa 
LIKE LINE OF
sflight_tab.

DO 10 TIMES.
  “使用排序第叁索引,那样即便是Hash类型的内表,也足以利用INDEX方式来读取Hash内表
 
READ TABLE
sflight_tab
       INDEX sy-index USING
KEY
 occupied_seats
       INTO sflight_wa.
  …
ENDDO.

 

点名额外处理选项”><result>钦命额外处理选项

你能够钦点一些附加的选项来让系统怎么样处理查找到数据。

钦定工作区

您能够将找到的数额行存款和储蓄到3个含有<result>选项的工作区中:

READ TABLE <itab><key> INTO
<wa>[COMPARING
<f1><f2> …|ALL FIELDS]

[TRANSPORTING
<f1><f2> …|ALL FIELDS|NO
FIELDS].

此地的<fi>能够是动态钦命的((<ni>))

COMPALANDING比较读取的单行内容

系统基于<key>(关键字段)读取钦定的单行并先存款和储蓄到<wa>工作区中,读取行之后,将表与工作区<wa>中的相应组件举行相比。

… <F1>
…<fn>
意味着只比较钦定的字段,

… ALL FIELDS代表相比较全数组件

 

万一系统找依据内定<key>找到了相应的条规,且实行比较的字段内容一律,则将 SY-SUBRAV4C 设置为0,借使展开相比的字段内容各异,则再次来到值 2;借使系统基于<key>找不到条目,则带有 4。假设系统找到条目,则不管比较结实怎么着,都将其读入指标区域。

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY col1.
DO 3 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  INSERT line INTO TABLE itab.
ENDDO.
line-col1 = 2. line-col2 = 3.
READ TABLE itab FROM line INTO line COMPARING
col2.
WRITE: ‘SY-SUBRC =’, sy-subrc.
WRITE: / line-col1, line-col2.

SY-SUBRC =    
2

        
2           4

 

DATA: BEGIN OF
line,
         col1
TYPE i,
         col2
TYPE i,
         col3
TYPE i,
      END OF line.
DATA itab LIKE line OCCURS 10.
DO 10 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  line-col3 = sy-index ** 3.
  APPEND line TO itab.
ENDDO.
CLEAR: line.
line-col1 = 2. line-col2 = 4.
“只要依据重庆大学字或索引条件在内表中读取到相应数据,不管该数据行是或不是
“与COMPA宝马7系ING
钦定的字段相符,都会覆盖存款和储蓄到工作区中。
READ TABLE
itab INTO line INDEX 4 COMPARING col1 col2.
WRITE: / sy-subrc, sy-tabix,line-col1,line-col2,line-col3.
CLEAR: line-col3.
“也得以行使重要字KEY来读取钦点行再开始展览相比
READ TABLE itab INTO line WITH KEY col1 = 4 col2 = 16 COMPARING col1 col2.
WRITE: / sy-subrc, sy-tabix,line-col1,line-col2,line-col3.

    2          
4           4          16          64

    0          
4           4          16          64

TRANSPO福特ExplorerTING读取一行的部分字段

系统基于<key>(关键字段)条件查找对应的条款后,只将<result>中钦定的零件字段存款和储蓄到办事区域中。

 

… NO FIELDS表示不传输任何组件,此种意况下,READ语句只影响系统字段 SY-SUBPAJEROC 和 SY-TABIX(前提条件是索引表),并且在TRANSPOOdysseyTING NO FIELDS景况下,假设钦赐了<wa>,则会忽视掉。

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY col1.
DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  INSERT line INTO TABLE itab.
ENDDO.
CLEAR line.
READ TABLE itab WITH TABLE KEY col1 = 3INTO line TRANSPO卡宴TING col2.主键没有被传输
WRITE: ‘SY-SUBRC =’, sy-subrc,
/ ‘SY-TABIX
=’, sy-tabix.
WRITE: / line-col1, line-col2.

SY-SUBRC =    
0

SY-TABIX
=          3

        
0           9

 

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY col1.
DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  INSERT line INTO TABLE itab.
ENDDO.
READ TABLE itab WITH KEY col2 = 16 TRANSPORTING NO FIELDS.
WRITE: ‘SY-SUBRC =’, sy-subrc,
/ ‘SY-TABIX
=’,
sy-tabix.

SY-SUBRC =    
0

SY-TABIX
=          4

应用字段符号

wwwlehu6.vip乐虎官网 9

您能够将查到的数码行赋值给钦赐的字段符号:

READ TABLE <itab><key>ASSIGNING<FS>.

 

取得越多的音信,请参见使用字段符号实行访问

 

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY col1.
FIELD-SYMBOLS <fs> LIKE LINE OF itab.
DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  INSERT line INTO TABLE itab.
ENDDO.
READ TABLE itab WITH TABLE KEY col1 = 2 ASSIGNING <fs>.
<fs>-col2 = 100.
LOOP AT itab INTO line.
  WRITE: / line-col1, line-col2.
ENDLOOP.

        
1           1

         2        
100

        
3           9

        
4          16

 

MODIFY 修改行

MODIFY

TABLE
itab

[USING
KEY
 key_name|(name)] | {itab INDEX idx [USING KEY key_name|(name)]} | {itab [USING KEY
loop_key]
} } FROM
wa

[TRANSPORTINGcomp1 comp2…] [{ASSIGNING <fs> [CASTING]} | {REFERENCE INTO
dref}]
|itab FROM wa [USING KEY key_name|(name)] TRANSPORTING
comp1 comp2… WHERE log_exp|(cond_syntax) }.

 

comp1
comp2
 …
… { comp_name[-sub_comp][{+off(len)}|{->attr}] }
| {(name)} …

修改单条记录(TABLE KEY)

MODIFY TABLE <itab>[USING
KEY 
key_name|(name)]FROM<wa>
[TRANSPORTING<f1><f2> …].

那里的<wa>扮演双重身份,不仅钦命了要修改的行(条件),还包含要修改的新的值。系统以任何表的享有重要字段来探寻要修改的行。

 

USING KEY:要是未选拔此选项,则会采纳私下认可的主键primary table
key来修改相应行

 

倘诺找到要修改的行,则将<wa>中装有非关键字段的始末拷贝到对应的多少行中对应的字段上, SY-SUBENVISIONC设置为 0,不然 SY-SUBGL450C 设置为4。假设是 NON-UNIQUE 类型的表,且找到多条时只修改第二条数据。

 

能够使用 TRANSPO汉兰达TING 选项修改部分非关键字段。

 

Fi可以是动态钦定(<ni>) ,若是ni 为空,则运营时会忽略。

 

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY
col1.
DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  INSERT line INTO TABLE itab.
ENDDO.
line-col1 = 2. line-col2 = 100.
MODIFY TABLE itab FROM line.
LOOP AT itab INTO line.
  WRITE: / line-col1, line-col2.
ENDLOOP.

        
1           1

         2        
100

        
3           9

        
4          16

修改多条记下(WHERE)

MODIFY <itab> FROM <wa> TRANSPORTING<f1><f2>
… WHERE <cond>.

该语句会修改满中规格的多规格数据。逻辑表达式<cond>中的各子表明式的第一个操作数必须是内表行结构的零件。

 

这里的TRANSPORTING **是必须的**,与上面MODIFY中的TRANSPORTING不一样。

 

一旦是标准表,可以在TRANSPO酷路泽TING前边钦点修改字段为表关键字段,但排序表与哈希表则不可能改改重点字段。

 

若是至少有一条数据被成功修改了,则SY-SUBTucsonC为0,否则为4。

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY
col1.
DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  INSERT line INTO TABLE itab.
ENDDO.
line-col2 = 100.
MODIFY itab FROM line TRANSPORTING col2 WHERE ( col2 > 1 ) AND ( col1 < 4 ).
LOOP AT
itab INTO line.
  WRITE: / line-col1, line-col2.
ENDLOOP.

        
1           1

         2        
100

         3        
100

        
4          16

DELETE 删除行

DELETE { {TABLEitab {FROM wa [USING KEY key_name|(name)]} | {WITH TABLE
KEY
 [key_name|(name) COMPONENTS] {comp_name1|(name1)}=dobj1 {comp_name2|(name2)}=dobj2…}} | {itab INDEX idx [USING KEY key_name|(name)]} | {itab [USING KEY
loop_key]
}
| itab [USING KEY key_name|(name)] [FROM idx1] [TO
idx2]
[WHERE log_exp|(cond_syntax)]
| ADJACENT DUPLICATES
FROM
 itab [USING KEY key_name|(name)] [COMPARING {comp1
comp2
 …}|{ALL FIELDS}]…
}

 

comp1
comp2
 …
… { comp_name[-sub_comp][{+off(len)}|{->attr}] }
| {(name)} …

 

巡回中插入或删除行

最为不用在循环中插入或删除行,因为或然会发出不要求的题材:插入操作会使插入地点前面的行的sy-tabix 都加1(只针对索引表),删除则会是被删除行前面全部行的目录都减1;如若是插入,则下次循环依旧从当下被遍历行的背后初叶接着遍历,但索引增加1了;但若是是去除的是现阶段遍历的行,则下次剔除还是继续接着删除下一行数据,并且删除后下次循环的目录依旧与上次同一(所以能延续删除,不会隔行删除) ,

循环中插入行请参见那里

巡回中除去行请参见那里

 

上面也能去除全部行:

LOOP AT itab_person FROM 1 to 1.
  DELETE itab_person.
ENDLOOP.

去除单行(TABLE KEY)

DELETE TABLE<itab>FROM<wa>.

或者

DELETE TABLE <itab> WITH TABLE KEY <k1> = <f1> …
<kn> = <fn>.

 

七个语句都是根据表的重要字段举办删减的,第二种要将全部表关键字段写上,分裂第①种的是能够选取动态的字段名。

 

假定成功删除,则SY-SUB君越C设置为0,不然为4。要是是 non-unique 内表,且满意条件的有多规格数据时,只会删除第贰条。

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY
col1.
DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  INSERT line INTO TABLE itab.
ENDDO.
line-col1 = 1.
DELETE TABLE itab: FROM line,
WITH TABLE KEY col1 = 3.
LOOP AT itab INTO line.
  WRITE: / line-col1, line-col2.
ENDLOOP.

        
2           4

        
4          16

剔除多行(WHERE)

DELETE<itab>WHERE<cond>.

 

一经至少有一条数据被成功删除,则SY-SUB本田CR-VC为0,不然为4。

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY
col1.
DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  INSERT line INTO TABLE itab.
ENDDO.
DELETE itab WHERE ( col2 > 1 ) AND ( col1 < 4 )**.
**LOOP AT
itab INTO line.
  WRITE: / line-col1, line-col2.
ENDLOOP.

  
1           1

        
4          16

剔除邻近重复行(ADJACENT DUPLICATE)

DELETE ADJACENT DUPLICATES FROM
<itab>

[COMPARING<f1><f2>

|ALL FIELDS].

系统从内表<itab>中删去全体邻近重复条目。

在以下景况下表示记录重复:

_      假使没有 COMPAPRADOING 选项,则所内表有正规主要字段的内容相同时。

_      如果有 COMPARING 选项…. COMPARING
<F1><F2> … 
,内定字段<F1><F2> … 的始末必须一致才算重复。也能够通过写入 (<name>) 代替<F1>在运营时在括号中动态钦定字段名。借使<name>在运作时为空,则系统将其忽视。固然带有无效的零部件名,则会时有发生实时错误。

_      如果用 COMPARING 选项…. COMPARING ALL
FIELDS 
,内表行全体字段的剧情必须相同时才算重复。

 

万一系统找到并删除至少二个再次条目,则将 SY-SUB福睿斯C 设置为0。不然,将其设置为4。

 

注,在未利用COMPA本田UR-VING 选项时,要刨除重复数据此前,一定要依据内表的第③字注解的依次来进展排序,才能去除重复数据,不然不会去除掉;借使钦定了COMPA陆风X8ING 选项,则要求基于钦命的比较字段顺序举办排序(如COMPACR-VING
<F1><F2>时,则必要sort by
<F1><F2>,而无法是sort by
<F2><F1>),才能去除全体重复数据。

 

DATA: BEGIN OF line,
        col1 TYPE i,
        col2 TYPE c,
      END OF line.
DATA itab LIKE line OCCURS 10.
line-col1 = 1. line-col2 = ‘A’. APPEND line TO itab.
line-col1 = 1. line-col2 = ‘A’. APPEND line TO itab.
line-col1 = 1. line-col2 = ‘B’. APPEND line TO itab.
line-col1 = 2. line-col2 = ‘B’. APPEND line TO itab.
line-col1 = 3. line-col2 = ‘B’. APPEND line TO itab.
line-col1 = 4. line-col2 = ‘B’. APPEND line TO itab.
line-col1 = 5. line-col2 = ‘A’. APPEND line TO itab.
LOOP AT itab INTO line.
  WRITE: / line-col1, line-col2.
ENDLOOP.
“**全部字段相同时才算重复
DELETE ADJACENT DUPLICATES FROM itab COMPARING ALL FIELDS.
SKIP TO LINE 3.
LOOP AT itab INTO line.
  WRITE: /14 line-col1, line-col2.
ENDLOOP.
“**钦定字段重复时
DELETE ADJACENT DUPLICATES FROM itab COMPARING col1.
SKIP TO LINE 3.
LOOP AT itab INTO line.
  WRITE: /28 line-col1, line-col2.
ENDLOOP.
“**依照表关键字段col2来判断是不是再一次
DELETE ADJACENT DUPLICATES FROM itab.
SKIP TO LINE 3.
LOOP AT itab INTO line.
  WRITE: /42 line-col1, line-col2.
ENDLOOP.

         1 
A         1  A          1  A          1  A

         1 
A         1  B          2  B          2  B

         1 
B         2  B          3  B          5  A

         2 
B         3  B          4  B

         3 
B         4  B          5  A

         4 
B         5  A

         5 
A

LOOP在循环中处理行

LOOP AT
itab {INTO wa}|{ASSIGNING
<fs>
[CASTING]}|{REFERENCE INTO
dref}|{TRANSPORTING NO
FILDS}
[[USING KEY key_name|(name)] [FROM idx1] [TO idx2] [WHERE log_exp|(cond_syntax)]].

ENDLOOP.

 

FROM … TO: 只适用于标准表与排序表

WHERE …  : 适用于拥有类型的内表

 

万一没有经过USING KEY选项的key_name,则循环读取的顺序与表的项目相关:

l  标准表与排序表:会根据primary table index索引的一一一条一条的大循环,且在循环里SY-TABIX为当前正值处理行的索引号。

l  哈希表:由于表没有排序,所以依照插入的相继来循环处理,注,此时SY-TABIX 总是0,如:

DATA: hash TYPE HASHED TABLE OF i WITH HEADER LINE WITH UNIQUE KEY TABLE_LINE.
INSERT 4 INTO TABLE hash.
INSERT 2 INTO TABLE hash.
INSERT 3 INTO TABLE hash.
INSERT 1 INTO TABLE hash.
LOOP AT  hash.
  WRITE:
/ sy-tabix, hash.
ENDLOOP.

         0          
4

         0          
2

         0          
3

         0          
1

 

能够嵌套LOOP,当进入或离开某层LOOP时,SY-TABIX会依据着相应变更。在ENDLOOP后边,倘使至少有一条数据被处理,则SY-SUB兰德酷路泽C 为0,不然为4。

 

只要循环的是哈希表,则sy-tabix恒为0。

能够在循环内表时增添与删除当前行:If you insert or delete
lines in the statement block of a LOOP ,
this will have the following effects:

  • If you insert lines behind(后边) the current line, these new
    lines will be processed in the subsequent loop(下三次巡回) passes. An endless
    loop(恐怕会挑起死循环) can
    result.
  • If you delete lines behind the current line, the deleted
    lines will no longer be processed in the subsequent loop
    passes.
  • If you insert lines in front of the current line, the
    internal loop counter is increased by one with each inserted line.
    This affects sy-tabix in the subsequent loop
    pass(那会潜移默化在跟着的巡回进度SY-TABIX。).
  • If you delete lines in front of the current line, the
    internal loop counter is decreased by one with each deleted line.
    This affects sy-tabix in the subsequent loop
    pass.
SUM

要在循环处理期间计算内表中数字字段的始末之和:

SUM.

系统只幸好 LOOP – ENDLOOP 块中处理该语句。

假使在 AT – ENDAT 块中使用 SUM,则系统计算当前行组中所有行的数字字段之和并将其写入工作区域中相应的字段。

 

假诺有些内表行的零部件是另一个报表,则不用使用 SUM 语句。

DATA: BEGIN OF line,
         col1 TYPE i,
         col2 TYPE i,
      END OF line.
DATA itab LIKE line OCCURS 10.
DO 3 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  APPEND line TO itab.
ENDDO.
LOOP AT itab INTO line.
  WRITE: / line-col1, line-col2.
  “总计后会将总结的结果临时存入工作区
  SUM.
  WRITE: / line-col1, line-col2.
ENDLOOP.
SKIP.
LOOP AT itab INTO line.
  WRITE: / line-col1, line-col2.
ENDLOOP.

         1          
1

         6         
14

         2          
4

         6         
14

         3          
9

         6         
14

 

         1          
1

         2          
4

         3          
9

AT

AT <line>.

<statement
block>

ENDAT**.**

 

<line>

含义

FIRST

内表的第一行时触发

LAST

内表的最后一行时触发

NEW <f>

相邻数据行中相同<f>字段构成一组,在循环到该组的开头时触发

END Of <f>

相邻数据行中相同<f>字段构成一组,在循环到该组的最末时触发

 

在选取AT…… ENDAT在此之前,一那要先根据那些语句中的组件名进行排序,且排序的次第要与在AT…… ENDAT语句中应用各样一致。并且排序与表明的顺序决定了先按哪个分组,接照再按哪个实行分组,最终再按哪个实行分组,那与SQL中的Group By 的一一是同样的意思。

 

用在AT……
ENDAT语句中的中的组件名不肯定要是布局中的关键字段,但这么些字段一定要根据出现在AT关键字前面包车型地铁使用各种在构造最前面举办宣示,且这一个零部件的注解之间不能插入别的零件的宣示。如以往需求依照<f1>, <f2>,
….,多字段的一一来利用在AT……
ENDAT语句中,则第三须要在组织中依据<f1>, <f2>,
….,多字段的逐条在结构最终面都宣示,然后根据<f1>, <f2>,
….,多字段来排序的,最后在循环中按如下的相继块书写程序(请留心在AT END
OF的逐一与AT NEW 是相反的):

LOOP AT <itab>.

AT FIRST. … ENDAT.

AT NEW <f1>. …… ENDAT.

AT NEW <f2>. …… ENDAT.

…….

<single line
processing>

…….

AT END OF
<f2>….
ENDAT.

AT END OF <f1>. … ENDAT.

AT LAST. …. ENDAT.

ENDLOOP.

<single line
processing>块专门用来拍卖全体非分组字段。你能够处理全体分组字段,但要是出现时,请遵照以上顺序来书写代码块。

 

能够接纳动态方式 (‘F1’) 来安装字段名称。

 

========================================================

万一循环的内表不是友善定义的,有时无法将分组的字段按梯次申明在一起,所以要求自个儿实现这一个职能,上面是投机完结AT NEW与AT END OF(另一益处是在循环内表时能够利用Where条件语句)(注:使用那种只需求遵从分组的相继排序即可,如要分成bukrs与bukrs anlkl两组时,需求遵照BY bukrs
anlkl排序,而不可能是BYanlkl bukrs):

DATA: lp_bukrs TYPE bukrs, “上一行bukrs字段的值
     
lp_anlkl TYPE anlkl. “上一行anlkl字段的值

“上面假诺按bukrs,bukrs
anlkl分成两组
SORT itab_data BY bukrs anlkl.
DATA: i_indx  TYPE i
.

DATA: lwa_data  Like itab_data 
LOOP AT itab_datawhere flg = **‘X**’.

i_indx  = sy-tabix.
  “**********AT NEW
对现阶段分组首行举行处理

IF  itab_data-bukrs <> lp_bukrs. “Bukrs组
     
“………
   
ENDIF.
   
IF  itab_data-bukrs <> lp_bukrs OR itab_data-anlkl <> lp_anlkl. “bukrs anlkl
分组
     
“………
   
ENDIF.
   
IF  itab_data-bukrs <> lp_bukrs OR itab_data-anlkl <> lp_anlkl OR  itab_data-.. <> lp_.. . “bukrs anlkl ..
分组
     
“………
   
ENDIF.

 
“**********一般循环处理
 
“………

 
“**********AT END OF
对当下分组末行实行处理 

 DATA :
l_nolast1,l_nolast12 .不是分组中最末行

 
此间照旧要清一下,防止该代码直接写在报表程序的风云里,而不是Form里(直接放在Report程序事件里时,l_nolast1,l_nolast12将会变成全局变量)
 
CLEAR:  l_nolast1,l_nolast12,l_nolast…
    DO.
     
i_indx  = i_indx  + 1.
     
READ TABLE
itab_data INTO lwa_data  INDEX  i_indx.”尝试读取下一行
     
IF sy-subrc <> 0.”当前行已是内表中最终一行
       
EXIT.
       
“假诺第1分组字段都发生了变化,则象征当前表现有所分组中的最后行
       
“注:尽管有N
个分组,那里也只要求看清第3分组字段是不是产生变化,不
       
“必要对别的分组举办判定,即那里不要求加上任何 ELSEIF
分支
     
ELSEIF lwa_data-bukrs <> itab_data-bukrs.
       
EXIT.
     
ENDIF.
********认清满意条件的下一行不是分组最的一行
     
“假诺Loop循环中从不Where条件,则能够将下边条件 lwa_data-flg =
‘X’ 删除即可
     
IF sy-subrc = 0 AND lwa_data-flg = ‘X’ .
       
IF lwa_data-bukrs = itab_data-bukrs .”判断当前行是不是是 bukrs
分组最后行
         
l_nolast1 = ‘1’.
         
IF lwa_data-nanlkl = itab_data-nanlkl .”判断当前行是或不是是 bukrs nanlkl
分组最终行
           
l_nolast2 = ‘1’.
           
IF lwa_data-.. = itab_data-…”判断当前行是还是不是是 bukrs nanlkl
..分组最终行
             
l_nolast.. = ‘1’.
           
ENDIF.
         
ENDIF.
         
EXIT.”只要进到此句所在外层If,表示找到了一条满Where条件的下一行数据,因而,只要找到这么的数额就能够看清当前分组是不是已完,即只要找到这么的多寡就不用再往前面找了,则脱离以免继续往下找
       
ENDIF.
     
ENDIF.

  
 ENDDO.

 

   IF l_nolast..IS INITIAL”处理 bukrs nanlkl
..分组
     
……
    ENDIF.

    IF l_nolast2 IS INITIAL
.”处理 bukrs nanlkl
分组
     
……
    ENDIF.
   
IF l_nolast1 IS INITIAL
.”处理 bukrs
分组
     
……
    ENDIF.

  lp_bukrs
= itab_data-bukrs.
 
lp_anlkl = itab_data-anlkl.

lp_.. = itab_data-.. .
ENDLOOP.

========================================================

 

 

假使进入到 AT…<f1>…ENDAT 块中时,当前工作区(或表头)中的从<f1>现在,但不蕴涵<f1>(遵照在结构中注明的先后)全数字段的字符类型字段会以星号(*)号来填充,而数字字设置为伊始值(注:在测试进程中发觉String类型不会选择*来填充,而是设置成empty
String,所以唯有一定长度类型的非数字基本项目才设置为*)。若是在 AT 块中动用了SUM,则会将享有数字类型字段总结出来将存入当前工作区(或表头);但假使离开AT….ENDAT块后,又会将近期遍历的行恢复生机到工作区(或表头)中。

 

在出口时最棒将使用在AT……ENDAT语句中的字段输出放在最前头,并且依照在那些话语的选用各种来挨家挨户输出,而任何字段放在前边举行输出。

 

DATA: BEGIN OF
line,
      C② 、C3组件名证明的逐一一定要与在AT……
ENDAT块中央银行使的顺序一致,即那里无法将C3扬言在C2之前,且无法在C2与C3之间插入其余字段的评释
      c2(5) TYPE c,
      c3(5) TYPE c,
      c4(5) TYPE c,
      i1 TYPE i,
      i2 TYPE i,
      c1(5) TYPE c,
      END OF
line.

利用在AT……
ENDAT语句中的字段不肯定假若最首要字段
DATA: itab LIKE TABLE OF line WITH HEADER LINE WITH
NON-UNIQUE KEY i1.
PERFORM append USING 2 ‘b’ ‘bb’ ‘bbb’ ‘2222’

  1. PERFORM append USING 3 ‘c’ ‘aa’ ‘aaa’ ‘3333’
  2. PERFORM append USING 4 ‘d’ ‘aa’ ‘bbb’ ‘4444’
  3. PERFORM append USING 5 ‘e’ ‘bb’ ‘aaa’ ‘5555’
  4. PERFORM append USING 6 ‘f’ ‘bb’ ‘bbb’ ‘6666’
  5. PERFORM append USING 7 ‘g’ ‘aa’ ‘aaa’ ‘7777’
  6. PERFORM append USING 8 ‘h’ ‘aa’ ‘bbb’ ‘8888’
  7. SORT itab ASCENDING BY c2 c3.
    LOOP AT itab.
      WRITE: / itab-c2,itab-c3,itab-c1,itab-c4,itab-i1,itab-i2.
    ENDLOOP.
    SKIP.
    LOOP AT itab.
      AT FIRST.
        WRITE:/ ‘>>>> AT FIRST’.
      ENDAT.

  AT NEW c2.
    WRITE: / ‘    >>>> Start of’
,
itab-c2.
  ENDAT.

  AT NEW c3.
    WRITE: / ‘        >>>> Start of’
,
itab-c2,
itab-c3.
  ENDAT.
  只要一出 AT
块,则表头的数额又会东山再起成当下被遍历行的情节
 
WRITE: / itab-c2,itab-c3,itab-c1,itab-c4,itab-i1,itab-i2.
  AT END OF c3.
    SUM.
    WRITE: / itab-c2,itab-c3,itab-c1,itab-c4,itab-i1,itab-i2.
    WRITE: / ‘        <<<< End of’
,
itab-c2,
itab-c3.
  ENDAT.

  AT END OF c2.
    SUM.
    WRITE: / itab-c2,itab-c3,itab-c1,itab-c4,itab-i1,itab-i2.
    WRITE: / ‘    <<<< End of’
,
itab-c2.
  ENDAT.
  AT LAST.
    SUM.
    WRITE: / itab-c2,itab-c3,itab-c1,itab-c4,itab-i1,itab-i2.
    WRITE:/ ‘<<<< AT LAST’.
  ENDAT.
ENDLOOP.

TYPES: c5(5) TYPE c.
FORM append  USING    value(p_i1) TYPE i
                     
value(p_c1) TYPE c5
                      value(p_c2) TYPE c5
                      value(p_c3) TYPE c5
                      value(p_c4) TYPE c5
                      value(p_i2) TYPE i.
  itab-i1 = p_i1.
  itab-c1 = p_c1.
  itab-c2 = p_c2.
  itab-c3 = p_c3.
  itab-c4 = p_c4.
  itab-i2 = p_i2.
  APPEND itab.
ENDFORM.

aa    aaa   c    
3333           3          33

aa    aaa   g    
7777           7          77

aa    bbb   d    
4444           4          44

aa    bbb   h    
8888           8          88

bb    aaa   a    
1111           1          11

bb    aaa   e    
5555           5          55

bb    bbb   b    
2222           2          22

bb    bbb   f    
6666           6          66

 

>>>>
AT FIRST

>>>>
Start of aa

>>>>
Start of aa    aaa

aa    aaa   c    
3333           3          33

aa    aaa   g    
7777           7          77

aa    aaa  
***** *****          10         110

<<<<
End of aa    aaa

>>>>
Start of aa    bbb

aa    bbb   d    
4444           4          44

aa    bbb   h    
8888           8          88

aa    bbb  
***** *****          12         132

<<<<
End of aa    bbb

aa    *****
***** *****           22         242

<<<<
End of aa

>>>>
Start of bb

>>>>
Start of bb    aaa

bb    aaa   a    
1111           1          11

bb    aaa   e    
5555           5          55

bb    aaa  
***** *****           6          66

<<<<
End of bb    aaa

>>>>
Start of bb    bbb

bb    bbb   b    
2222           2          22

bb    bbb   f    
6666            6          66

bb    bbb  
***** *****           8          88

<<<<
End of bb    bbb

bb    *****
***** *****           14         154

<<<<
End of bb

*****
***** ***** *****            36        
396

<<<<
AT LAST

 

 

  DATA: BEGIN OF th_mseg OCCURS 10,
      matnr TYPE mard-matnr,
      werks TYPE mard-werks,
      lgort TYPE mard-lgort,
      shkzg TYPE mseg-shkzg,
      menge TYPE mseg-menge,
      budat TYPE mkpf-budat,
LOOP AT th_mseg.
  AT END OF shkzg.
    sum.
    WRITE: / th_mseg-matnr, th_mseg-werks,th_mseg-lgort,
             th_mseg-shkzg,th_mseg-menge,th_mseg-budat.
  ENDAT.
ENDLOOP.

AS-101            
2300 0001 S           10.000  ****.**.**

AS-100            
2300 0002 S           10.000  ****.**.**

AS-100            
2300 0001 S           20.000  ****.**.**

wwwlehu6.vip乐虎官网 10

除此以外,其实那几个总结与SQL里的分组(Group By)总括原理是一律的,Group By 后边需求分明钦赐分组的字段,如上边程序选拔SQL分组写法应该为 Group By matnr werks lgort
shkzg,但在ABAP里你只须求依照matnr werks lgort
shkzg根据先后顺序在布局定义的最前边进行宣示就可发挥了Group
By那种意义,而且不必然要将matnr werks lgort
shkzg那多少个字段全体用在AT语句块中AT
NEW、AT END OF
shkzg才正确,其实像下面程序一样,只写AT END OF
shkzg那2个言语,前边多个字段matnr werks
lgort都得以不用在AT语句中冒出,因为ABAP暗中认可会根据在组织中宣示的顺序将shkzg前边的字段也统统用在了分组意义当中了。

适用索引表的行操作

这一节中装有操作只适用于索引表(标准表与排序表)

APPEND 附加行

APPEND wa|{INITIAL
LINE
} |
{LINES OF jtab [FROM
idx1] [TO
idx2]

[USING KEY
key_name|(name)
]}
       TO itab
[SORTED BY
comp
]
[{ ASSIGNING <fs>
[CASTING]
} | { REFERENCE INTO
dref
}]

 

l  APPEND/INSE昂CoraT操作不能够用来Hash表

l  APPEND/INSECRUISERT用于排序表时条件:附加/插入时必然要依据Key的升序来附加;假若是Unique排序表,则不可能附加/插入重附的多少,那与INSE福睿斯T…INTO
TABLE是差异等的

外加单行

APPEND  {<wa>|INITIAL LINE} [TO
<itab>].

 

SY-TABIX存款和储蓄了附加行所在的索引号。

假定itab带有表头,则足以归纳TO
<itab>选项,直接行使 APPEND<itab>

 

 

DATA: BEGIN OF line1,
col1(3) TYPE c,
col2(2) TYPE n,
col3 TYPE i,
END OF line1,
tab1 LIKE TABLE OF line1.

DATA: BEGIN OF line2,
field1(1) TYPE c,
field2
LIKE tab1,“**嵌套内表**
END OF
line2,
tab2 LIKE TABLE OF line2.

line1-col1 = ‘abc’. line1-col2 = ’12’. line1-col3 = 3.
APPEND line1 TO tab1.
line1-col1 = ‘def’. line1-col2 = ’34’. line1-col3 = 5.
APPEND line1 TO tab1.
line2-field1 = ‘A’. line2-field2 = tab1.
APPEND line2 TO tab2.

REFRESH tab1.
line1-col1 = ‘ghi’. line1-col2 = ’56’. line1-col3 = 7.
APPEND line1 TO tab1.
line1-col1 = ‘jkl’. line1-col2 = ’78’. line1-col3 = 9.
APPEND line1 TO tab1.
line2-field1 = ‘B’. line2-field2 = tab1.
APPEND line2 TO tab2.
LOOP AT tab2 INTO line2.
  WRITE: / line2-field1.
  LOOP AT line2-field2 INTO line1.
    WRITE: /2 line1-col1, line1-col2, line1-col3.
  ENDLOOP.
ENDLOOP.

A

abc 12         
3

def 34         
5

B

ghi 56         
7

jkl 78         
9

叠加多行FROM… TO

APPENDLINESOF<itab1> [FROM<n1>]
[TO<n2>] TO<itab2>.

只要不难 FROM 或 TO ,则<itab1>可以是任意档次的表,但行类型要与<itab2>包容,且<itab2>只好是索引表;如果没有简单,则<itab1>只好是索引类型的内表(索引表、标准表)

该方法比在循环中一行行附加要快3到4倍。语句运转完后,SY-TABIX存款和储蓄了最终3个附加行所在的目录。与单选一样,对于排序表,不能够违反唯一约束(唯一索引排序表)与升序排序规则,不然运维时会报错。

DATA: BEGIN OF line,
col1 TYPE c,
col2 TYPE i,
END OF line.
DATA: itab LIKE TABLE OF line,
jtab LIKE itab.
DO 3 TIMES.
  line-col1 = sy-index. line-col2 = sy-index ** 2.
  APPEND line TO itab.
  line-col1 = sy-index. line-col2 = sy-index ** 3.
  APPEND line TO jtab.
ENDDO.
APPEND LINES OF jtab FROM 2 TO 3 TO itab.
LOOP AT itab INTO line.
  WRITE: / line-col1, line-col2.
ENDLOOP.

1         
1

2         
4

3         
9

2         
8

3        
27

以排序方式附加

APPEND <wa> TO <itab> SORTED BY
<f>.

在向内表参加数据行时会基于<f>的降序地点来插入到对应岗位,不必然是最终地点。注,不可能钦命排序情势,默许正是降序,此外无法钦赐四个字段。而且该选项只适合于标准表,不能够用于排序表。

 

是因为成效方面包车型地铁案由,提出用 SORT 语句对表格进行排序。

DATA: BEGIN OF itab OCCURS 2,
         column1 TYPE i,
         column2 TYPE i,
         column3 TYPE i,
       END OF itab.
itab-column1 = 1. itab-column2 = 2. itab-column3 = 3.
APPEND itab SORTED BY column2.
itab-column1 = 4. itab-column2 = 5. itab-column3 = 6.
APPEND itab SORTED BY column2.
itab-column1 = 7. itab-column2 = 8. itab-column3 = 9.
APPEND itab SORTED BY column2.
LOOP AT itab.
  WRITE: / itab-column2.
ENDLOOP.

        
8

        
5

若果利用 SORubiconTED BY 选项,表格只好分包 OCCU锐界S 参数中钦命的行数。假诺加上的行数比钦定的要多,则舍弃最终一行(这对于开创限定长度的排种类表格外有用,比如取最大前十条记下)。

APPEND …SORTED BY…

APPEND <wa>TO <itab> SORTED
BY <f>.

该语句只适用于standard table。新附加行不一定会附加到内表<itab>的尾部,在插入之时会对字段<f>实行相比较(选取降序相比)找到插入地方,将超越n(n为内表定义语句中的INITIAL SIZE 选项中所钦命的n)行之外的结尾一行删除,只保留前n条记下。

注:此种APPEND只适用刘恒规内表。一种用来取前n条应用(根据字段<f>进行降序排序),在概念内表<itab>时,应在INITIAL SIZE 选项中钦赐所取的前n条的值,并且在行使进程,不要与APPEND <wa> TO
<itab>混用,并且在选择前,<itab>须求为空,不然会混杂。

DATA: BEGIN OF
line,
  col1 TYPE i,
  col2 TYPE i,
END
OF line.
“那里的2对后边的APPEND语句发生潜移默化:保留前2名的笔录
DATA itab LIKE TABLE OF line INITIAL
SIZE 2.
line-col1 = 1. line-col2 = 2.
APPEND line TO
itab SORTED BY col2 .
LOOP AT itab INTO line.
  WRITE: / line-col2.
ENDLOOP.
SKIP.
line-col1 = 3. line-col2 = 4.
APPEND line TO
itab SORTED BY col2.
LOOP AT itab INTO line.
  WRITE: / line-col2.
ENDLOOP.
SKIP.
line-col1 = 5. line-col2 = 6.
APPEND line TO
itab SORTED BY col2.
LOOP AT itab INTO line.
  WRITE: / line-col2.
ENDLOOP.

wwwlehu6.vip乐虎官网 11

USING KEY 

 

TYPES:BEGIN OF tab_type ,
    a TYPE i,
    b TYPE i,
    c TYPE i,
    d TYPE i,
    e TYPE i,
  END OF  tab_type .

DATA
itab
      TYPE STANDARD TABLE  OF
tab_type
      WITH NON-UNIQUE KEY
primary_key COMPONENTS a
      WITH UNIQUE HASHED KEY
hash_key COMPONENTS b
      WITH NON-UNIQUE SORTED KEY
sort_key COMPONENTS c
      WITH HEADER
LINE.

DATA itab2 LIKE itab[] WITH HEADER
LINE.

itab-a = 3.itab-b = 5.itab-c = 5.itab-d = 6.itab-e = 1.
APPEND itab.
itab-a = 6.itab-b = 8.itab-c = 4.itab-d = 1.itab-e = 2.
APPEND itab.
itab-a = 1.itab-b = 3.itab-c = 2.itab-d = 4.itab-e = 3.
APPEND itab.
itab-a = 4.itab-b = 7.itab-c = 6.itab-d = 1.itab-e = 4.
APPEND itab.

APPEND LINES OF
itab FROM 2 to 3  USING KEY 
primary_key to itab2.
LOOP AT itab2.
  WRITE: itab2-a.
ENDLOOP.
CLEAR: itab2[].

NEW-LINE.
按第三索引sort_key的排序形式(升序),取index 2
到 3
的笔录,并附加到
itab第22中学
APPEND LINES OF itab FROM 2 to 3  **USING
KEY** sort_key to itab2.
LOOP AT itab2.
  WRITE: itab2-a.
ENDLOOP.

“下边语句出错:
hash
key不帮忙此种用法,原因是 hash
自个儿没有索引概念可言
APPEND LINES OF itab FROM 2
to 3  USING KEY hash_key to itab2.

 

6          
1

        
6           3

 

INSE中华VT插入到钦命的目录地点

INSERT wa|{INITIAL
LINE
}|{LINES OF jtab [FROM
idx1] [TO
idx2]

[USING KEY
key_name|(name)
]} 
INTO
{itab INDEX
idx}|{itab}
 
{ ASSIGNING <fs>
[CASTING]
}|{ REFERENCE INTO
dref }.

插入单行

INSERT {<wa>|INITIALLINE}  INTO <itab> [INDEX
<idx>].

 

一旦不选拔 INDEX 选项,则将新的行插入到当前行的日前(索引为当下行索引),则当前行及后边的全部行的目录都会向后移一个职位,且索引会自动加1。

 

假若itab是带表头的索引类型内表,能够省略INTO
<itab>、INDEX <idx>选项,直接利用INSE奥德赛T<itab>,但此语句只好够在LOOP AT
<itab>(此时不可能选择USING KEY选项)循环中央直属机关接行使(那与APPEND不太一样,APPEND没有如此的限量),并且新插入的行会放在近日循环行的前边

 

假如应用 INDEX 选项,则将新行插入到有索引<idx>的行在此之前。插入之后,新条目索引为<idx>,后边全部行索引加 1(注:插入操作不影响当下正在循环的SY-TABIX原有的值)。借使表格包罗<idx> – 1 条条框框,系统将新条目附加到结尾的水保表格行之后。若是表格的条款小于<idx> –
1,系统无法插入条目并将 SY-SUBLANDC 设置为4。

 

只可以在 LOOP – ENDLOOP 循环,能够总结 INDEX 选项,表示在近期循环行前插入新行(此时<idx>隐含设置成SY-TABIX),下次轮回依旧会从脚下循环行的下一行伊始拍卖,即不会潜移默化循环,但被插入的行不会被循环到了。

 

不能够向 unique 排序表中插入重复值,别的向排序表中插入值时不能够违反排序表的默许排序规则,不然运营时出错。

 

 

循环中插入或删除行:

DATA: BEGIN OF line,
         col1 TYPE i,
         col2 TYPE i,
      END OF line.
DATA itab LIKE line OCCURS 10.
DO 2 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  APPEND line TO itab.
ENDDO.
“在循环中插入行后,下次循环的行如故脚下行的后行,循环再而三的,但索引号增1了
LOOP AT itab INTO line.
  WRITE: / sy-tabix.
  line-col1 = 3 * sy-tabix. line-col2 = 5 * sy-tabix.
  INSE福特ExplorerT line INTO itab.”未钦赐INDEX选项,所以在脚下行前安顿
  WRITE: sy-tabix.
ENDLOOP.
LOOP AT itab INTO line.
  WRITE: / sy-tabix, line-col1, line-col2.
ENDLOOP.
SKIP.
LOOP AT itab INTO line.
 
“会去除全体索引大于1的数目行,删除后下次循环的目录照旧与上次同样
 
IF sy-tabix > 1.
    DELETE itab INDEX sy-tabix.
  ENDIF.
ENDLOOP.
LOOP AT itab INTO line.
  WRITE: / sy-tabix, line-col1, line-col2.
ENDLOOP.

        
1           1

        
3           3

        
1           3           5

        
2           1           1

        
3           9          15

        
4           2           4

 

        
1           3           5

安排多行FROM…TO

INSERT LINES OF <itab1> [FROM
<n1>] [TO <n2>] INTO <itab2>
[INDEX <idx>].

假设不难 FROM 或 TO ,则<itab1>能够是轻易档次的表,但行类型要与<itab2>包容;假若没有简单,则<itab1>只好是索引类型的内表(索引表、标准表)。

借助于数据量与插入的岗位,这种插入比在循环中一条条插入要快。

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA: itab LIKE TABLE OF line,
jtab LIKE itab.
DO 3 TIMES.
  line-col1 = sy-index. line-col2 = sy-index ** 2.
  APPEND line TO itab.
  line-col1 = sy-index. line-col2 = sy-index ** 3.
  APPEND line TO jtab.
ENDDO.
INSERT lines of itab FROM 2 TO 3 INTO jtab INDEX 1.
LOOP AT jtab INTO line.
  WRITE: / sy-tabix, line-col1, line-col2.
ENDLOOP.

        
1           2           4

        
2           3           9

        
3           1           1

        
4           2           8

        
5           3          27

READ读取钦点索引地方上的行

READ TABLE最全语法规则表请参见那里

READ TABLE <itab> INDEX
<idx> <result>.

<result>请参见那里。该语句只会读取<idx>所在地点的行,只会读取一行,那与运用 key 为规范来读取是均等的(以key为条件读取时恐怕会现出多条,但只取第三条)。

 

据他们说目录来读取数据要比使用Key来读取行速度要快。

 

这里的TABLE关键字无法差不多,那与DELETEMODIFY四个重点字不太一样,那四个根本字在对含蓄表头的索引类型内表进行操作时,语句中绝非TABLE关键字。

能够回顾INDEX
<idx>选项,直接使用READ TABLE
<itab>,此时会私下认可从 itab 内表的表头<wa>作为标准,此时说话即为省略了FROM
<wa>选项的READ TABLE
<itab> FROM <wa>语句。要是<wa>中相应的主要字段为空,则会同盟全体记录,假设拥有首要字段为空,则一向读取第叁行数据

 

若是找到数据行则SY-SUB帕杰罗C为0,且SY-TABIX存款和储蓄当前找到的数额行索引,固然未找到,则SY-SUB瑞虎C为非0。

 

DATA: BEGIN OF line,
  col1 TYPE i,
  col2 TYPE i,
END OF line.
DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY col1.
FIELD-SYMBOLS <fs> LIKE LINE OF itab.
DO 20 TIMES.
  line-col1 = sy-index.
  line-col2 = 2 * sy-index.
  APPEND line TO itab.
ENDDO.
READ TABLE itab INDEX 7 ASSIGNING <fs> .
WRITE:/ sy-subrc, sy-tabix.
WRITE: / <fs>-col1,
<fs>-col2.

  0          
7

        
7          14

在索引表中实行二分查找

READ TABLE <itab> WITH KEY =
<f><result>BINARY SEARCH.

READ TABLE <itab> WITH KEY <k1> =
<f1> … <kn> = <fn>
<result>

BINARY SEARCH.

 

BINATucsonY SEA宝马X5CH选项只好在使用key方式读取的说话,不能以index方式读取。

 

倘就算以key的点子读取标准表时,能够用二分法搜索代替顺序搜索,但对此标准表,必须先接照查找的要害字展开升序排序后有意义。

 

对此排序表,使用key进行读取行时,不须求先采取Sort关键字展开排序(也无法对排序表再拓展排序,不然会出错),但在READ语句中能够使用BINARY
SEARCH
选项。

 

除此以外,哈希表,则不能够利用二分查找选项BINAKoleosY SEACRUISERCH(原因能够是哈希比二分查找要快吧),但能运用SO本田UR-VT语句对Hash表进行排序,而且装有排序效果(这几个相比奇怪,有点像Java的Treemap集合了):

TYPES: BEGIN OF line,
    i TYPE i,
  END OF line.
DATA: itab TYPE HASHED TABLE OF line WITH HEADER LINE WITH UNIQUE KEY i.
itab-i = 1.
INSERT  itab INTO TABLE itab.
itab-i = 2.
INSERT  itab INTO TABLE itab.
LOOP AT  itab .
  WRITE: / itab-i.
ENDLOOP.
能够对Hash表进行排序
SORT itab DESCENDING.
SKIP.
LOOP AT  itab .
  WRITE: / itab-i.
ENDLOOP.
“但无法接纳BINA劲客Y SEA奥德赛CH选项
*READ TABLE itab WITH TABLE
KEY i = 2 BINARY SEARCH.

        
1

        
2

 

        
2

        
1

 

 

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE STANDARD TABLE OF line.
DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  APPEND line TO itab.
ENDDO.
“注:二分查找时不得不是按升序排序
*SORT itab BY col2
DESCENDING.
SO奥德赛T itab BY col2.”暗中同意便是升序
READ TABLE itab WITH KEY col2 = 16 INTO line BINARY SEARCH.
WRITE: ‘SY-SUBRC =’,
sy-subrc.

SY-SUBRC =    
0

在内表中追寻字符串

SEARCH <itab> FOR
<str><options>.

将会招来整个内表行,如若找到,SY-SUB昂CoraC为0,SY-TABIX存款和储蓄找到的字符串所在行索引,SY-FDPOS存款和储蓄了所查找到的字符串地方在内表行内(前边所有字段都会算在里面)的任务,具体算法请参考Search搜索字符串

 

各字段只好是C、N、D、T固定长度的字符类型字段(书上说其余类型都大概,但试了一下String类型也相当)。<str>扶助的格局与<options>选项可以参照Search搜索字符串

 

DATA: BEGIN OF line,
  index(2) TYPE n,
  text(10) TYPE c,
END OF line.
DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY index.
DATA num(2) TYPE n.
DO 3 TIMES.
  line-index = sy-index.
  num = sy-index.
  CONCATENATE ‘aastring’ num INTO line-text.
  APPEND line TO itab.
ENDDO.

LOOP AT itab INTO line.
  WRITE: / line-index,line-text.
ENDLOOP.
SEARCH itab FOR ‘string02’ AND MARK.
READ TABLE itab INTO line INDEX sy-tabix.
WRITE: / sy-subrc,sy-fdpos,line-index,line-text.

01
aastring01

02
aastring02

03
aastring03

    0      4  02
aaSTRING02

假诺将地点index字段注明在text字段后边,则下面的sy-fdpos的结果则为2。

MODIFY修改钦命索引地点上的行

MODIFY

TABLE
itab

[USING
KEY
 key_name|(name)] | {itab INDEX idx [USING KEY key_name|(name)]} | {itab [USING KEY
loop_key]
} } FROM
wa

[TRANSPORTINGcomp1 comp2…] [{ASSIGNING <fs> [CASTING]} | {REFERENCE INTO
dref}]
|itab FROM wa [USING KEY key_name|(name)] TRANSPORTING
comp1 comp2… WHERE log_exp|(cond_syntax) }.

 

comp1
comp2
 …
… { comp_name[-sub_comp][{+off(len)}|{->attr}] }
| {(name)} …

修改单行

MODIFY<itab>[INDEX<idx>] FROM<wa>[TRANSPORTING<f1><f2>
… ].

 

一旦没有 INDEX 选项,你不得不在循环中应用该语句,在此种意况下,每趟循环中<idx>会暗中同意设置为SY-TABIX,即当前遍历的号行。

 

借使改动的标准表,则第3字段是足以被涂改的。

 

 

当修改的是排序表时,你不能够将第叁字段修改成任何值,否则运维时出错。在修改排序表时,假设没有采用TRANSPO途睿欧TING选项,则<wa>的key字段必须与要修改的行key字段值相同;假诺钦命了TRANSPOCR-VTING选项,则该接纳后边不可能接key字段,但此时<wa>中的key字段会忽略掉(此时是还是不是与修改的行key字段相同没有涉嫌了)。

 

<fi>协助动态名称。

DATA: scarr_tab TYPE SORTED TABLE OF
scarr
               WITH UNIQUE KEY
carrid,
      scarr_wa
TYPE scarr.
scarr_wa-currcode = ‘EUR’.
SELECT * FROM scarr INTO TABLE
scarr_tab.
READ TABLE
scarr_tab WITH TABLE KEY
carrid = ‘xxx’ TRANSPORTING NO
FIELDS.
MODIFY scarr_tab INDEX sy-tabix FROM scarr_wa TRANSPORTING
currcode.

修改当前循环行…USING KEY loop_key…

MODIFY itab [USINGKEY loop_key] FROM<wa>

此语句只好用在LOOP AT内表循环语句中,并且此时 USING KEY
loop_key 选项也得以简不难单(其实暗许就是大约的),当中 loop_key 是预订义的,无法更改:

 

LOOP
AT scarr_tab INTO scarr_wa.

MODIFY scarr_tab USING
KEYloop_keyFROM scarr_wa.

ENDLOOP.

若果<itab>是包罗表头的内表,则足以一直动用MODIFY
<itab>语句,且此语句只适用于LOOP AT循环语句中

 

TYPES: BEGIN OF line ,
  key ,
  val TYPE i ,
  END OF line .
DATA: itab1 TYPE line OCCURS 0 WITH HEADER LINE
.
DATA: itab2 TYPE line OCCURS 0 WITH HEADER LINE
.
itab1-key = ‘a’.
itab1-val = 1.
APPEND itab1.
itab1-key = ‘b’.
itab1-val = 2.
APPEND itab1.
itab2-key = ‘A’.
itab2-val = 0.
APPEND itab2.
LOOP AT itab1.
  WRITE: / ‘itab1 index: ‘ , sy-tabix.
  READ TABLE itab2 INDEX 1 TRANSPORTING NO FIELDS.
  WRITE: / ‘itab2 index: ‘, sy-tabix.
  itab1-val = itab1-val + 1.
  “在循环中能够利用上边简洁格局来修改内表,修改的内表行为当前正被循环的行,即便循环中运用了READ
TABLE语句
  “读取了任何内表而招致了sy-tabix
发生了改观,因为以下语句不是依据sy-tabix来修改的(即使为索引内表时,使用MODIFY itab1 INDEX
sy-tabix语句进行修改时,反而不科学 。而且该语句还适用于Hash内表,需在MODIFY前面加上TABLE重在字后再适用于Hash表)
  MODIFY itab1.
ENDLOOP.
LOOP AT itab1.
  WRITE:/ itab1-key, itab1-val .
ENDLOOP.
WRITE:/ itab2-key, itab2-val .

itab1
index:           1

itab2
index:           1

itab1
index:           2

itab2
index:           1

a         
2

b         
3

A         
0

 

 

应用W奥德赛ITE TO进行修改

WRITE <f> TO <itab> INDEX
<idx>.

<itab>必须只好是标准表,且<itab>的行字段都以假使C、N、D、T类型的字段,不然编写翻译出错。

 

在改动时,<itab>要求动用偏移量的艺术来定位供给修改的始末,能够参考

 

DATA: BEGIN OF line,
      c ,
      text(72),
 END OF line.
DATA code LIKE  TABLE OF line WITH HEADER LINE WITH NON-UNIQUE KEY c.
code-c = ‘a’.
code-text = ‘This is the first
line.’.
APPEND code.
code-c = ‘b’.
code-text = ‘This is the second line. It is
ugly.’.
APPEND code.
code-c = ‘c’.
code-text = ‘This is the third and final
line.’.
APPEND code.
“**偏移量是指在一切行全体字段组成的字符串的偏移量,那里包涵了前边 c
字段

WRITE ‘
NIC.’ TO code+31 INDEX 2.
LOOP AT code .
  WRITE: / code-c , code-text.
ENDLOOP.

a This is the
first line.

b This is the
second line. It is NIC.

c This is the
third and final line.

DELETE删除内定索引地方上的行

DELETE { {TABLEitab {FROM wa [USING KEY key_name|(name)]} | {WITH TABLE
KEY
 [key_name|(name) COMPONENTS] {comp_name1|(name1)}=dobj1 {comp_name2|(name2)}=dobj2…}} | {itab INDEX idx [USING KEY key_name|(name)]} | {itab [USING KEY
loop_key]
}
| itab [USING KEY key_name|(name)] [FROM idx1] [TO
idx2]
[WHERE log_exp|(cond_syntax)]
| ADJACENT DUPLICATES
FROM
 itab [USING KEY key_name|(name)] [COMPARING {comp1
comp2
 …}|{ALL FIELDS}]…
}

 

comp1
comp2
 …
… { comp_name[-sub_comp][{+off(len)}|{->attr}] }
| {(name)} …

删去单行

DELETE<itab>
[INDEX<idx>].

假如省略<index>选项,则DELETE
<itab>语句只可以用在循环语句中。被删除行前面全数行的索引号都将减一。

巡回中去除行…USING KEY loop_key…

DELETE itab [USINGKEY loop_key]

此语句只可以用在LOOP AT内表循环语句中,并且此时 USING KEY
loop_key 选项也足以总结(其实私下认可就是归纳的),当中 loop_key 是预定义的,不可能更改:

 

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY
col1.
DO 5 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  APPEND line TO itab.
ENDDO.
“删除索引号为3的行实质上删除的是原索引号为4的行,
“删除索引号为4的行时会破产,因为此时只有3行数据了
DELETE itab INDEX: 2, 3, 4.
WRITE: ‘SY-SUBRC =’, sy-subrc.
SKIP.
LOOP AT itab INTO line.
  WRITE: / sy-tabix, line-col1, line-col2.
ENDLOOP.

SY-SUBRC
=     4

        
1           1           1

        
2           3           9

        
3           5          25

 

 

DATA: BEGIN OF
line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE TABLE OF line.
DO 5 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  APPEND line TO itab.
ENDDO.
LOOP AT itab INTO line.
  IF line-col1 < 4.
    “在循环中能够接连删除
    DELETE itab.
 
ENDIF.
ENDLOOP.
LOOP AT itab INTO line.
  WRITE: / sy-tabix, line-col1, line-col2.
ENDLOOP.

        
1           4          16

        
2           5          25

 

 

 

DATA: itab TYPE TABLE OF i WITH HEADER
LINE.
APPEND 1 TO itab.
APPEND 2 TO itab.
APPEND 3 TO itab.
APPEND 4 TO itab.
APPEND 5 TO itab.

LOOP AT itab.”循环内表自身能够循环删除全数,但下边包车型大巴准绳是只删除2、3、5的笔录
  IF itab = 2 OR itab = 3 OR itab = 5.
    DELETE itabindex sy-tabix.“index
sy-tabix**可以省

  ENDIF.
ENDLOOP.
LOOP AT  itab.
  WRITE: / itab.
ENDLOOP.
FREE itab.

APPEND 1 TO itab.
APPEND 2 TO itab.
APPEND 3 TO itab.
APPEND 4 TO itab.
APPEND 5 TO itab.
DO 5 TIMES.因而DO xx
TIMES格局不能够循环删除全体
  DELETE itab INDEX sy-index.
ENDDO.
WRITE:/.
LOOP AT  itab.
  WRITE: / itab.
ENDLOOP.

FREE itab.

APPEND 1 TO itab.
APPEND 2 TO itab.
APPEND 3 TO itab.
APPEND 4 TO itab.
APPEND 5 TO itab.
DO 5 TIMES.这般也足以去除全部行
  DELETE itab INDEX 1.
ENDDO.
WRITE:/.
LOOP AT  itab.
  WRITE: / itab.
ENDLOOP.

1

        
4

 

        
2

        
4

删除多行

DELETE<itab> [FROM<n1>]
[TO<n2>]
[WHERE<condition>].

只少要钦点1个规格。

If at least one line is deleted, the system
sets SY-SUBRC to 0, otherwise to 4.

 

假诺没有运用USING
KEY选项,只怕keyname钦命为了primary table
key,则选项FROM … TO 只可以用在 index tables 类型的内表,在此种意况下,FROM … TO 中内定的行索引值为primary table
index 。

只要通过USING
KEY选项中keyname设置为了sorted secondary
key,则FROM …
TO能够运用到Hash内表,在此种意况下,FROM … TO 中钦赐的行索引值为secondary table
index 。

 

 

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE TABLE OF line.
DO 8 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  APPEND line TO itab.
ENDDO.
“删除索引为3到7的行,且删除条件是col2压倒等于25
DELETE itab FROM 3 TO 7 WHERE col2 >= 25.
LOOP AT itab INTO line.
  WRITE: / line-col1, line-col2.
ENDLOOP.

        
1           1

        
2           4

        
3           9

        
4          16

        
8          64

在循环利用FROM…TO限制行的读取范围

LOOP AT <itab><result> [FROM
<n1>] [TO <n2>]
<condition>.

<statement block>

ENDLOOP.

 

巡回处理的经过与 LOOP在循环中处理行是一模一样的

 

在采取FROM或WHERE筛选行时,循环中运用控制重要字 AT (如,AT first)有可能不会做事,原因是触发的行被筛选掉了。

 

FROM 和 TO 选项限制系统必须读取的行数。WHERE 选项依旧会遍历整个内表来摘取合适的行,为了提升成效,应该尽恐怕使用 FROM 和 TO 选项先来限制读取的范围。

DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY
TABLE
LINE.
DO 10 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  APPEND line TO itab.
ENDDO.
LOOP AT itab INTO line FROM 4 TO 8 WHERE col2 > 16 and col2 < 64.
  WRITE: / sy-tabix, line-col2.
ENDLOOP.

        
5          25

        
6          36

        
7          49

选择字段符号进行走访

当从内表中READ条目或LOOP时,能够利用以下字符符号选项:

… ASSIGNING <FS>

 

字符符号会一向指向对应行所在的内部存款和储蓄器,与工作区域不一样的是,工作区是直接的造访内表,而字符符号是平素访问内表中的行所在的内部存款和储蓄器。

 

通过字段符号修改字段时,不要对排序表与哈希表的Key字段进修改,不然运转时会出错。其它,在LOOP中动用字段符号时,不可能利用SUM,因为SUM只针对工作区域来操作的。

 

示范参考:接纳字段符号

 

在选取字段符号读取时不须求先将内表行拷贝到工作区域,修改时也不必要先修改工作区的剧情,然后再将工作区拷贝到内表中,而是平昔对内表行实行操作。使用字段符号操作内表行能能够升高效率。

 

当使用字段符号钦赐读取的表行后,系统会登记该字段符号的分红音信,借使指向的表行被删除了,则系统会自动选取字段处于未分配境况,此时IF <fs> IS
ASSIGNED表明式为真。

 

即使在是LOOP中使用删除了字段符号指向的内表行,则不能够再对该字段符号进行ASSIGN,
UNASSIGN那个操作,但倘诺不是LOOP循环里是能够的。

 

DATA: BEGIN OF line,
  col1 TYPE i,
  col2 TYPE i,
END OF line.
DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY col1.
FIELD-SYMBOLS <fs> LIKE LINE OF itab.
DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  APPEND line TO itab.
ENDDO.
READ TABLE itab WITH TABLE KEY col1 = 2 ASSIGNING <fs>.
<fs>-col2 = 100.
READ TABLE itab WITH TABLE KEY col1 = 3 ASSIGNING <fs>.
“<fs>指向的行被删除,则IS
ASSIGNED逻辑表达式将为假
DELETE itab INDEX 3.
IF <fs> IS ASSIGNED.
  WRITE ‘<FS> is
assigned!’.
ENDIF.
LOOP AT itab ASSIGNING <fs>.
  WRITE: / <fs>-col1, <fs>-col2.
ENDLOOP.

        
1           1

         2        
100

        
4          16

 

借使itab自身是3个字段符号的内部存款和储蓄器,则也得以应用LOOP AT itab into
<fs>.

采纳表头替换工作区

wwwlehu6.vip乐虎官网 12

实用的Ranges内表

 

DATA: BEGIN OF gr_t001 OCCURS 0,
        sign   TYPE c LENGTH 1 VALUE ‘I’,
        option TYPE c LENGTH 2 VALUE ‘eq’,
        low    LIKE t001-bukrs,
        high   LIKE t001-bukrs,
      END OF gr_t001.

 

能够由此Ranges内表的IN表明式来都行的判定某些记录是不是已在该内表中设有,那好比Java中的集合判断有些值是或不是在聚集中存在同样,相当实用

RANGES: s_ebeln1 FOR
ekko-ebeln.

 
s_ebeln1-sign = ‘I’.
  s_ebeln1-option = ‘EQ’.
  s_ebeln1-low = ‘xxxxxxxxxx’.
  APPEND s_ebeln1.初步时必然要进入3个准绳,不然 th_alv-ebeln in
s_ebeln1恒为真

 
CLEAR: s_ebeln1.
  LOOP AT th_alv WHERE checkbox NE space.
    巧妙使用s_ebeln1岂然则在OPENSQL中应用In,只假使在逻辑表明式中都能运用
    IF NOT th_alv-ebeln IN s_ebeln1.
      s_ebeln1-sign = ‘I’.
      s_ebeln1-option = ‘EQ’.
      s_ebeln1-low = th_alv-ebeln.
      APPEND s_ebeln1.比方不存在,则扩张
    ENDIF.
  ENDLOOP.

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图