• 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将数据表中的数据按条件查询后放入内表中:
SELECT … INTO 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.