ABAP 内表基础操作

内表是ABAP/4中非常特殊和重要的一种变量,顾名思义,内表也是一个数据表,但与一般数据表不同的是,这个数据表只存在内存中,当你的程序结束的时候,它也跟着同时结束。
内表的定义和结构很相似,所差别只是内表需要指定记录的条数。
内表的定义为:

data: begin of 内表名 occurs n, 
          
	f1[(l)] [type t] [decimals d] [value 'xxx'], 
          
	f2[(l)] [type t] [decimals d] [value 'xxx'], 
         
	 ... 
     
end of 内表名. 

其中n为该内表的记录条数,但当内表的记录数超过了该数值后,内表会自动的填大这个数目,定义该数值只是为了系统的效率考虑,如果n为0,则系统会在一开始就分配8KB的空间。
内表同时也可以为已存在的数据表或结构进行定义。

data:内表名 like [结构名或数据表名] occurs n.
data:it1 like st1 occurs 10.   "st1 为一结构
data:it2 like t000 occurs 0.   "t000 为一数据表
"注意:用like定义的内表没有表头。
"LOOP功能依序读取内表的记录。
"LOOP的格式为:
loop at it [into wa] [from m] [to n] [where exp]. 
        
	--- 
   
endloop. 
 "其中it 为内表名 wa 为结构名(也称工作区),如果不填,则读到表头,m,n为开始和结束行,如果不填则为从第一条到最后条,exp 为取记录的条件。


● 内表

所属index table,有索引。可以设置主键,也可不设。

设置主键后,在行插入(insert)时,可根据主键自动排序。(但在行追加(append)时,如果追加行的主键值大于内表中最后一条记录的主键值时,会有执行错误发生)。

另外,在行检索(read itab from stru)时,可以根据stru中的主键值(主键值以外的项目值被无视)进行检索。

关于主键唯一性的设置 NON-UNIQUE:主键值不唯一/UNIQUE:主键唯一。

HASHED TABLE  哈希内表。

无索引。所以所有关于使用index操作表的语句都不可使用。必须设置主键。

● 内表操作

行追加/插入

APPEND            单一/复数行追加。一般用于STANDARD TABLE的行追加。

INSERT              单一/复数行插入。一般用于SORTED TABLE的行插入。行插入时能根据主键自动按升序排列。

COLLECT            单一行插入,若内表中已有相同主键的纪录,使主键以外的数值型项目相加后,合并。(所以要求COLLECT的操作对象内表中,除主键以外的项目必须是数值类型(i,p,f))。一般用于定义有主键的SORTED TABLE和HASHED TABLE的数值求和等。

行更新

MODIFY     单一/复数行内容更新。更新语句一般有下述两种:

1. Modify table itab from wa

根据wa的主键值进行检索,更新。

所以不建议在无主键的内表使用,如STANDARD TABLE。即便使用了,更新的内容也非预期所想的。一般情况下更新内表中的第一条数据。

更新时,若检索主键值存在的情况下,根据检索主键更新。若主键值不存在,则不进行更新,结果返回sy-subrc=4。

2. Modify itab index sy-tabix from wa

 根据索引进行检索,更新。

HASHED TABLE因为没有索引,该语句不允许被使用。

SORTED TABLE虽然允许使用,但如果被更新纪录的主键已被修改的情况下会发生执行错误。建议使用1。在STANDARD TABLE中会无条件更新,当然前提是该索引存在的情况下。但即使索引不存在,也不会发生指针溢出的情况。

 表访问

READ               表读取。读取内表中符合检索条件的第一条记录。

LOOP AT          循环读取表纪录。

at new compN/at end of compN

-at new compN:在项目comp1~compN值变化的第一条数据时执行。

-at end of compN:在项目comp1~compN拥有相同值的最后一条记录时执行。

 要注意一下几点:

1. 关于语句at new compN,不是仅在compN值变化时执行,也在compN之前的任何一个项目的值发生变化时都会执行。

 2.在at new compN~end at中,有时候不能正常的读取循环领域的值(*)。

 3.关于GROUP求和(SUM). SUM一般在at end of compN/at last中被使用。求和结果放在循环领域的同名项目中。SUM求和比较复杂,也不易操作,如同一内表需要对不同的GROUP进行求和的场合,由于1.的原因需要创建与该内表项目名相同但次序不同的多个结构。建议使用COLLECT。

排序

SORT       按key值升/降排序。

STABLE不破坏原有的顺序,在原有的顺序基础上排序。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABAP是一种编程语言,用于SAP系统中的应用程序开发。在ABAP中,动态内表是一种特殊类型的内表,它允许在运行时动态地添加、删除和修改表格的行和列。动态内表是通过使用ABAP内部表类型"ANY TABLE"来实现的。 要处理动态内表数据,您可以按照以下步骤进行操作: 1. 定义动态内表:使用内部表类型"ANY TABLE"来定义动态内表。例如: DATA: dynamic_table TYPE STANDARD TABLE OF ANY. 2. 创建动态行结构:定义一个结构体,用于描述动态内表中的行。这个结构体可以包含任意数量和类型的字段。例如: DATA: dynamic_row TYPE REF TO data, dynamic_row_structure TYPE STANDARD TABLE OF string. 3. 添加行到动态内表:使用CREATE DATA语句来创建动态行,并将其添加到动态内表中。例如: CREATE DATA dynamic_row TYPE HANDLE dynamic_row_structure. ASSIGN dynamic_row->* TO <dynamic_row>. APPEND <dynamic_row> TO dynamic_table. 4. 访问动态内表数据:使用ASSIGN语句将动态行的字段赋值给变量,并对其进行操作。例如: FIELD-SYMBOLS: <field> TYPE any. ASSIGN COMPONENT 'FIELD_NAME' OF STRUCTURE <dynamic_row> TO <field>. IF sy-subrc = 0. <field> = 'VALUE'. ENDIF. 5. 删除动态内表行:使用DELETE语句从动态内表中删除行。例如: DELETE dynamic_table INDEX i. 6. 修改动态内表行:使用MODIFY语句修改动态内表中的行。例如: MODIFY dynamic_table INDEX i FROM <dynamic_row>. 以上是处理ABAP动态内表数据的基本步骤。根据您具体的需求,您可以进一步扩展和优化这些步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值