我正在尝试同时更新包含几行的数据库表。 我只需要从内部表中更新名为 ESTADO 的字段。
我不想在循环语句中这样做。 这是因为代码检查器工具和性能。
我试图找到一些关于新 abap 语法的信息,我找到了一个内联语句来避免循环。
UPDATE ZBWEVATDOC61 FROM TABLE @( VALUE #(
FOR ls_doc61 IN it_doc61 WHERE ( cuv = ls_doc61-cuv And folio = l
s_doc61-folio and folio_interno = ls_doc61-folio_interno )
( VALUE #(
BASE ls_doc61
estado = ls_doc61-estado ) ) ) ) .
IF sy-subrc eq 0.
commit work AND WAIT.
ENDIF.
我尝试使用 WHERE 语句指定要更新的行,但不起作用
以下语法有效:
TYPES: ttcurr TYPE TABLE OF tcurr WITH EMPTY KEY.
SELECT ukurs, tcurr, gdatu
FROM tcurr
INTO TABLE @DATA(ltcurr)
UP TO 100 ROWS.
DATA(it_modified) = VALUE ttcurr( FOR ls_tcurr IN ltcurr ( ukurs = ls_tcurr-ukurs / 1000 tcurr = ls_tcurr-tcurr gdatu = ls_tcurr-gdatu ) ).
UPDATE tcurr FROM TABLE @(
VALUE ttcurr(
FOR ls_curr IN it_modified WHERE ( tcurr NE 'EUR' AND gdatu > '79989898' )
( ukurs = ls_curr-ukurs ) ) ).
BASE
在您的代码段中使用错误,当您用表表达式填充某些 itab 并希望保留其先前的内容时,它会被利用,它只接受 itab 操作数。在我们的例子中,在更新dbtab时可以省略它。
您不能在此语句中使用内联类型,也不能使用自动生成的 varls_doc61
在WHERE
中进行比较。
尝试将代码段更改为类似内容:
TYPES: ttdoc TYPE TABLE OF ZBWEVATDOC61 WITH EMPTY KEY.
UPDATE ZBWEVATDOC61 FROM TABLE @(
VALUE ttdoc(
FOR ls_doc61 IN it_doc61 WHERE ( cuv = 'smth' AND folio = 'smth' AND folio_interno = 'smth' )
( estado = ls_doc61-estado ) ) ).
语句UPDATE dbtab FROM TABLE itab
,无论内部表itab
是数据对象还是由构造函数表达式("新语法"(生成的,都要求itab
具有与dbtab
相同的结构行,这意味着dbtab
的所有列都将被更新,并且此语句没有其他更好的选择。
1(批量更新给定行的给定列的唯一解决方案是这样:
- 在要更新的表上创建"数据库视图",方法是仅选择相关列 + 选择定义为键字段的行所需的列(列名称右侧的复选框(,然后选择访问权限"读取和更改"以便可以使用
UPDATE
(至少(。 - 在程序中,定义一个内部表,其行类型类似于数据库视图。
- 使用
UPDATE dbtab FROM TABLE itab
更新数据库视图。将选择键字段中定义的行,并更新非键列。 - 我在这里不讨论如何编写构造函数表达式(
... @( VALUE #( ... ) )
(,因为您认为它可以解决您的问题的假设是错误的。
ABAP 中有一些方法可以更新几列或几行,但不能同时更新两者:
- 2( 将给定列设置为固定值 - 在所有更新的行中,这些列将具有相同的值:
UPDATE dbtab SET col1 = value1 col2 = value2 ... [WHERE ...]
.您可以在循环中重复UPDATE ... SET ...
,以便模拟批量更新。它将比通过数据库视图更新(案例 2(慢,我不确定它是否比情况 3 更快或更慢(可能取决于列数(。 - 3(如果您确定
itab
在您不感兴趣的所有其他列中包含正确的值,您仍然可以考虑使用UPDATE dbtab FROM TABLE itab
。您可以考虑通过使用锁来防止并发更新(由并行运行的其他程序或最终由其他用户运行的同一程序(,以避免在初始化内部表和UPDATE
SELECT
之间进行某些更新。
注意:我不明白你为什么说LOOP对代码检查器和性能都是一个问题。构造函数表达式(如您所说"新语法"(用于避免中间变量,以获得更好的可读性并专注于最终目标。