4

我有一个 ABAP 内部表。结构化,具有多个列(例如 25)。名称和类型无关紧要。该表可以变得非常大(例如 5,000 条记录)。

| A   | B   | ... |
| --- | --- | --- |
| 7   | X   | ... |
| 2   | CCC | ... |
| 42  | DD  | ... |

现在我想将其中一列(例如B)设置为特定的常数值(例如'Z')。

最短、最快和最节省内存的方法是什么?

我最好的猜测是LOOP REFERENCE INTO. 这非常有效,因为它就地更改了表,而不会浪费新的内存。但它占用了三个语句,这让我想知道是否有可能变得更短:

LOOP AT lt_table REFERENCE INTO DATA(ls_row).
  ls_row->b = 'Z'.
ENDLOOP.

然后是VALUE运算符将其简化为一条语句,但效率不高,因为它创建了新的内存区域。对于大量列,它也会变得很长,因为它们必须一一列出:

lt_table = VALUE #( FOR ls_row in lt_table ( a = ls_row-a
                                             b = 'Z' ) ).

有没有更好的方法?

4

2 回答 2

5

以下代码一次设置所有行的 PRICE = 0。从理论上讲,它应该是更新一列的所有行的最快方法,因为它是一个语句。请注意,不可能省略 WHERE,所以我使用一个简单的技巧来更新所有行。

DATA flights TYPE TABLE OF sflight.
DATA flight TYPE sflight.

SELECT * FROM sflight INTO TABLE flights.
flight-price = 0.
MODIFY flights FROM flight TRANSPORTING price WHERE price <> flight-price.

参考:修改 itab - itab_lines

于 2018-03-16T21:15:26.340 回答
0

如果您声明了工作区...

workarea-field = 'Z'.
modify table from workarea transporting field where anything.

版本:在能够检查我当前系统中的语法之后,我可以证明(对自己)必须添加 WHERE 子句或引发 DUMP。谢谢桑德拉·罗西。

于 2018-03-15T16:19:29.987 回答