问题描述
更新内表和数据库表有几个语法,每次到这我都会绕晕,需要百度,索性总结一下。
1 更新内表
1.1 在LOOP中更新
- 常规方法-MODIFY
循环到工作区-MODIFY-清空工作区
LOOP AT gt_output03 INTO gs_output03.
"供应商
READ TABLE lt_lfa1 WITH KEY lifnr = gs_output03-zvendor.
IF sy-subrc = 0.
gs_output03-name2 = lt_lfa1-sortl.
ENDIF.
MODIFY gt_output03 FROM gs_output03.
CLEAR gs_output03.
ENDLOOP.
- 简便方法-通过指针更新
LOOP AT s_bjh ASSIGNING FIELD-SYMBOL(<fs_output>).
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <fs_output>-low
IMPORTING
output = <fs_output>-low.
ENDLOOP.
1.2 在LOOP外更新
LOOP外更新需要指定INDEX或者限定WHERE条件
READ TABLE lt_zmmt041 WITH KEY zbjh = gs_output04-zbjh zxmh = gs_output04-zxmh.
IF sy-subrc = 0.
CLEAR:lv_index.
lv_index = sy-tabix.
lt_zmmt041-zstatus = '2'.
MODIFY lt_zmmt041 INDEX lv_index.
ENDIF.
2 更新数据库表
2.1 根据工作区更新
MODIFY dbtab FROM wa.
COMMIT WORK.
2.2 根据内表更新
MODIFY dbtab FROM TABLE itab.
COMMIT WORK.
2.3 注意
更新数据库表需要COMMIT WORK,否则无法生效。
3 对于修改内表,MODIFY和MODIFY itab的区别
MODIFY TABLE
- 是出现在LOOP外对内表的修改;
- 有一个前提是该内表的定义一定要有主键,如果没有,该语句不能成功。
- 排序表和散列表的主表键是只读的,不能修改。
- sy-tabix系统变量无关。
- 利用工作区只能修改一行数据。MODIFY TABLE itab FROM wa.
MODIFY
- 没有主键的内表可以使用该语句。
- 如果不带WHERE条件,只能出现在LOOP中。
- 带WHERE条件,在LOOP外可以处理满足条件的多条数据。
MODIFY itab FROM wa TRANSPORTING a WHERE id = 10.