ABAP 循环 内表操作

• 01-WHILE循环

WHILE < condition > [VARY < f > FROM < F1 > NEXT < F2 >].
< statement block >
ENDWHILE.
只要 是真,或系统发现 EXIT、STOP 或 REJECT 语句,系统将继续执行由 WHILE 语句引导、ENDWHILE 结束的语句块。
系统字段 SY-INDEX 中包含已执行的循环次数。

警告:使用 WHILE 语句要避免死循环。请记住,在一段时间之后,WHILE 语句条件应变为假,或者系统能够找到 EXIT、 STOP 或 REJECT 语句退出循环。

只要给定条件为真,WHILE循环语句就会重复执行目标语句。

• 02-Do循环

DO [< n > TIMES] [VARYING < f > FROM < F1 > NEXT < F2 >].
< statement block >
ENDDO.
可以用 EXIT、STOP 或 REJECT 语句终止
可以使用 TIMES 选项限制循环次数, 如果 是 0 或负数,系统不执行该循环。
系统字段 SY-INDEX 中包含已处理过的循环次数。

无条件循环重复执行多个语句,而不指定任何条件。 DO语句通过无条件地多次执行一组语句块来实现无条件循环。

• 03-嵌套循环

DO 和 WHILE 语句可以被测试以及与其他循环形式组合。 每个嵌套循环将具有由系统创建和监视的自己的 SY-INDEX。

DO [n TIMES]. 
<statement block n>. 
   DO [m TIMES]. 
   <statement block m>. 
   ENDDO. 
ENDDO.


• 01-case语句,可以嵌套在循环里做处理。

使用CASE分支
语法: CASE < f >.
WHEN < F1 >.
< statement block >
WHEN < F2 >.
< statement block >WHEN OTHERS.
< statement block >
ENDCASE.

• 02-if语句,适合少量逻辑判断。

语法: IF < condition1 >.
< statement block >
ELSEIF < condition2 >.
< statement block>ELSE.
< statement block >
ENDIF.

• 01-CONTINUE语句 无条件终止循环过程

CONTINUE语句用于循环的语句块中,以立即和无条件地终止单个循环。 一旦执行CONTINUE语句,当前处理块中剩余语句的执行将停止,并处理下一个循环遍历。

• 02-CHECK语句 有条件终止循环过程

CHECK语句基于条件终止循环传递。 如果CHECK语句中的条件被计算为false,则忽略CHECK语句之后的语句块中的所有剩余语句,并且下一个循环开始。 CHECK语句中的条件可以是任何逻辑表达式。

• 03-Exit语句 完全终止循环

EXIT语句用于无条件和立即终止整个循环。 执行EXIT语句后,循环终止,并处理循环之后的语句。


内表操作

1.MODIFY 一行数据

MODIFY 表itab FROM 工作区wa_ TRANSPORTING Field1 Field2.---- WHERE 条件1 and 条件2.

例子 :MODIFY IT_SO_DATA FROM LV_SO_DATA TRANSPORTING EDAT WHERE VBELN = LV_DELI_WEEK-VBELN AND POSNR = LV_DELI_WEEK-POSNR.

二 、修改内表的多行


MODIFY 表itab FROM 工作区wa_ INDEX 行号 TRANSPORTING Field1 Field2—

eg: MODIFY IT_PP_INFO FROM LV_PP_INFO INDEX LV_INDEX TRANSPORTING SERNR.loop中,经常对内表数据进行modify处理。
例:
loop at itab into l_wa_work.
编辑l_wa_work.
modify itab from l_wa_work transporting 字段名。
endloop.

不需要在modify的时候加上index,loop中更新的肯定是当前条。
当read的时候可以加index.
例:
read table itab into l_wa_work with key 字段1 = cond1.
l_index = sy-tabix.
modify itab from l_wa_work index l_index transporting 字段名

2、INSERT插入数据


INSERT可以按内表的具体字段向表中插入一行或者多行数据:

INSERT [wa INTO|INITIAL LINE INTO] itab [INDEX idx].

INSERT [wa INTO|INITIAL LINE INTO] TABLE itab.

INSERT LINES OF itab1 [FROM idx] [TO idx2] INTO itab2 [INDEX idx3].

2、逐行填充内表

           A、要将内表仅用于存储数据,出于性能方面的考虑,建议使用 APPEND。

           B、要计算数字字段之和或要确保内表中没有出现重复条目,请使用 COLLECT 语句。

           C、要在内表现有行之前插入新行,请使用INSERT语句。

语法:

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

COLLECT [<wa> INTO] <itab>.

INSERT [<wa> INTO|INITIAL LINE INTO] <itab> [INDEX  <idx>].  

3、 将内表内容复制到另一个内表


     A、要将内表行附加到另一个内表中,请使用APPEND语句。

     B、要将内表行插入另一个内表中,请使用INSERT语句。

     C、要将内表条目内容复制到另一个内表中,并且覆盖该目标表格,请使用 MOVE语句。

语法:

附加内表行:  APPEND LINES OF <itab1> [FROM <n1>] [TO <n2>] TO <itab2>.

插入内表:     INSERT LINES OF <itab1> [FROM <n1>] [TO <n2>]  INTO <itab2> [INDEX <idx>].

复制内表:     MOVE <itab1> TO <itab2>.

                       <itab2> = <itab1>.

4、OPEN SQL将数据表数据放入内表

通过OPEN SQL将数据表中的数据按条件查询后放入内表中:

          SELECTINTO TABLE <itab>

SELECT … APPENDING TABLE <itab>

三、删除内表数据


DELETE(删除内表数据) :

     按具体值删除:DELETE TABLE itab WITH TABLE KEY k1=v1...kn=vn.

 参照其它内表值删除:DELETE TABLE itab [FROM wa].

 删除具体行数据:DELETE itab INDEX idx.

 删除具体行数范围间数据:DELETE itab FROM idx1 TO idx2.

 删除重复数据,执行此条件前必须先排序: DELETE ADJACENT DUPLICATES FROM itab.

四、读取内表数据

READ依据具体行数或字段值等条件读取某一内表的数据:

   参照其它内表值读取:READ TABLE itab FROM wa.

   按具体值读取:READ TABLE itab WITH [TABLE] KEY k1=v1...kn=vn [BINARY SEARCH].

   读取具体行数据: READ TABLE itab INDEX i.

LOOP循环常用于实现内表数据的循环读取和操作

注意:
1、 使用 READ 操作的表必须得 HEADER LINE 作为查找出的数据存储窗口
2、 BINARY SEARCH 可以提高内表数据查找的速度,但是使用前必须先对内表进行排序

五、内表排序

对内表进行排序,可以指定具体的排序字段、排序方式(升/降),语法如下:

SORT itab [BY f2 f2...fn] [ASCENDING/DESCENDING]
注意:1< f2>: 为指定的排序字段
           2、递减 (DESCENDING)  和 递增 (ASCENDING)

汇总:

将内表中相同的字段合并,若有类型为I的字段,则将其值加总:

COLLECT [wa INTO] itab.
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 ABAP 动态内表的示例,它允许您在运行时动态添加和删除行: ```abap REPORT z_dynamic_internal_table. DATA: dynamic_table TYPE STANDARD TABLE OF any WITH DEFAULT KEY. FIELD-SYMBOLS: <fs_table> LIKE LINE OF dynamic_table. DATA: lv_choice TYPE i, lv_input TYPE i. DO. WRITE: / '1. Add row', / '2. Delete row', / '3. Display table', / '4. Exit'. WRITE: / 'Enter your choice: '. READ lv_choice. CASE lv_choice. WHEN 1. CLEAR: dynamic_table. WRITE: / 'Enter the number of rows to add: '. READ lv_input. DO lv_input TIMES. APPEND INITIAL LINE TO dynamic_table ASSIGNING <fs_table>. <fs_table> = sy-index. ENDDO. WRITE: / lv_input, ' rows added to table.'. WHEN 2. IF dynamic_table IS INITIAL. WRITE: / 'Table is empty.'. ELSE. WRITE: / 'Enter the row to delete: '. READ lv_input. DELETE dynamic_table INDEX lv_input. WRITE: / 'Row ', lv_input, ' deleted from table.'. ENDIF. WHEN 3. IF dynamic_table IS INITIAL. WRITE: / 'Table is empty.'. ELSE. LOOP AT dynamic_table ASSIGNING <fs_table>. WRITE: / <fs_table>. ENDLOOP. ENDIF. WHEN 4. EXIT. ENDCASE. ENDDO. ``` 该示例使用了 `any` 类型来声明动态内表,使其可以存储任何类型的数据。通过使用 `FIELD-SYMBOLS` 语句创建一个指向动态内表的行的字段符号,我们可以轻松地访问和操作表中的数据。 在主循环中,我们使用 `CASE` 语句来根据用户的选择执行不同的操作。当用户选择添加行时,我们清空表并使用 `APPEND INITIAL LINE TO` 语句添加指定数量的新行。当用户选择删除行时,我们使用 `DELETE` 语句删除指定索引处的行。最后,当用户选择显示表时,我们使用 `LOOP AT` 语句遍历表中的所有行并将其输出到屏幕上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值