从ABAP的工作区域修改DB表的最佳方法



我想找出在循环中从工作区修改DB表的最佳解决方案。

有几种方法可以做到这一点,首先;

LOOP AT itab INTO wa.
 wa-flag = 'X'.
 MODIFY zblabla FROM wa. 
ENDLOOP.

和字段符号;

LOOP AT ITAB ASSIGNING <WA>.
  <WA>-flag = 'X'.
ENDLOOP.

或者,我应该从整个内部表修改DBtable吗?

modify zblabla from it. 

对于少于50个条目,我不确定哪个是更好的方法。(我也想知道哪个条目更多,哪个更好。)

谢谢。

您的第一个示例(具有LOOP AT ITAB ASSIGNING <WA>的示例)实际上并没有更改数据库。它只改变内存中的数据。但是,您可以随后执行UPDATE zblabla FROM TABLE itab.,它将整个表立即发送回数据库。

当表的每一行都改变时,这比单独改变每一行要快得多。但是当表中只有几行实际上不同时,这是相当浪费的,并且只更新使用MODIFY实际更改的行可能会更快。

另一个选项有时可以用来更新数据库内容,甚至不需要将其加载到应用服务器中,这是UPDATE database_table SET field = value WHERE condition命令。

UPDATE zblabla SET flag = 'X'.

将在数据库上为表中的每一行设置标志为'X',甚至不需要SELECT任何东西。

在你的例子中,这将是迄今为止最快的方法,但在现实世界中,你很少遇到如此微不足道的问题。

UPDATE ... SET ... WHERE ...也应该优先于MODIFY,当你的表很宽,你没有改变它的大部分,因为它允许你指定你想要改变的字段。当您没有通过SELECT *获取数据,而是只查询单个字段时,也必须使用它。

首先使用字段符号

修改循环中的数据
LOOP AT ITAB ASSIGNING <WA>.
  <WA>-flag = 'X'.
ENDLOOP.

我建议你使用UPDATE而不是MODIFY。

UPDATE DBTAB from TABLE ITAB.

如果你想使用Modify语句来更新数据库。

MODIFY DBTAB from ITAB.

使用transport和where子句修改内部表,指定将使用表的整个键修改哪些字段,然后使用内部表更改透明表(数据库表)。

wa_X-field1 = "something". "where wa_X is of the same type of the table e.g. has the same "fields. wa_X-field2 = "other something". MODIFY it_tableX FROM wa_X TRANSPORTING field1 field2 WHERE key1 = wa_X-key1 "(first key) key2 = wa_X-key2. "(last key) MODIFY tableX FROM TABLE it_tableX.

这通常是更好的,因为它提高了性能,并确保您只更改表中您想要更改的行。

最新更新