从 ABAP 中的工作区修改数据库 Table 的最佳方法

Best way to modify a DB Table from a work area in ABAP

我想找出在循环中从工作区修改数据库 table 的最佳解决方案。

有几种方法可以实现,首先;

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

和字段符号;

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

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

modify zblabla from it. 

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

谢谢。

首先使用字段符号修改循环中的数据

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

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

UPDATE DBTAB from TABLE ITAB.

如果要使用Modify语句更新数据库。

MODIFY DBTAB from ITAB.

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

当 table 的每一行都更改时,这比单独更改每一行要快得多。但是当 table 中只有几行实际上不同时,这是非常浪费的,并且只更新使用 MODIFY.

实际更改的行可能会更快

有时甚至无需将其加载到应用程序服务器即可更新数据库内容的另一个选项是 UPDATE database_table SET field = value WHERE condition 命令。

UPDATE zblabla SET flag = 'X'.

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

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

UPDATE ... SET ... WHERE ... 对于单个条目也应该比 MODIFY 更受欢迎,因为您拥有的 table 非常宽并且您没有更改其中的大部分内容,因为它允许您指定您要更改的字段。当您不是通过 SELECT * 获取数据而是仅查询单个字段时,您也必须使用它。

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

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.

这通常更好,因为它可以提高性能并确保您只更改您想要更改的 table 行。

希望对您有所帮助。