Abap 更新内部表中的列的最短表示法是什么?

Abap 更新内部表中的列的最短表示法是什么?,abap,internal-tables,Abap,Internal Tables,我有一个ABAP内部表。结构化,具有多个列(例如25列)。名称和类型是不相关的。该表可能会非常大(例如5000条记录) 现在我想将其中一列(例如B)设置为一个特定的常量值(例如“Z”) 最短、最快、最节省内存的方法是什么? 我的最佳猜测是循环引用到。这是非常有效的,因为它在不浪费新内存的情况下就地更改表。但它包含了三种说法,这让我想知道是否有可能变短: LOOP AT lt_table REFERENCE INTO DATA(ls_row). ls_row->b = 'Z'. ENDL

我有一个ABAP内部表。结构化,具有多个列(例如25列)。名称和类型是不相关的。该表可能会非常大(例如5000条记录)

现在我想将其中一列(例如B)设置为一个特定的常量值(例如“Z”)

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

我的最佳猜测是
循环引用到
。这是非常有效的,因为它在不浪费新内存的情况下就地更改表。但它包含了三种说法,这让我想知道是否有可能变短:

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' ) ).

有更好的方法吗?

如果您已经声明了一个工作区

workarea-field = 'Z'.
modify table from workarea transporting field where anything.
版本: 在我能够检查当前系统中的语法之后,我可以(对自己)证明必须添加WHERE子句或引发转储。
谢谢Sandra Rossi。

以下代码一次将所有行的价格设置为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.
sflight的数据类型表。 数据飞行类型sflight。 选择*从sflight进入表格飞行。 航班价格=0。 从航班运输价格修改航班,其中价格为航班价格。

参考资料:

这不起作用,ABAP语法需要指明位置。此外,内部表不能命名为
table
,因为它将ABAP解析器与工作区中的另一个构造
modify table itab
混淆。以下是有效的语法:
修改itab from workarea transporting field where field workarea field。
很高兴看到您增强了我的答案。在我使用的系统中,这种语法是允许的,我无法告诉您它是不推荐的、过时的还是纯转储。但在任何情况下,这都不是一个完整的工作代码snipet,因为我没有提供它们:我喜欢向人们指出鱼群的方向,教他们如何更好地撒网,而不仅仅是把他们当作一条鱼;)没有WHERE,您的代码只能在一个循环中工作,一次一行。@VXLozano,您不断发布极低质量的答案,然后依靠其他人来修复您留下的东西。我来这里不是为了声誉,也不是为了您的认可,我只是想学习和给予一些作为交换。这个“一些”只是我的知识和提示,而不是“有用的话给我点”的确切答案。正如我在上一篇评论中告诉您的,我不提供代码的工作片段,只提供我认为正确方向的第一步。社区将通过投票决定这些答案是否被认可。如果在我之前有人给出了更好的答案,我会很乐意投赞成票,让我的答案落空,因为这就是这个网站的工作方式。你有没有比较过(衡量)
引用到
分配
?除此之外,这可能是最快的方法。对于
表达式,您可以使用
对应的。。。映射…
但由于我没有任何性能度量(而且我也没有寻找分数),这还不足以回答…
引用到
分配
的速度同样快。虽然一个必需的参考似乎使用了更多的内存-在一个与我无关的尺度上<代码>对应的
不起作用,因为它只支持将列从一个表移动到下一个表,但不支持将它们设置为固定值。从我的团队收集了一些第二种意见,我们认为这确实是最短、最有效的方法。检查这个作为答案,因为它也得到了正确的语法。
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.