从内联构造的 VALUE 的内部表更新数据库表

  • 本文关键字:更新 数据库 内部 VALUE abap
  • 更新时间 :
  • 英文 :


我正在尝试同时更新包含几行的数据库表。 我只需要从内部表中更新名为 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_doc61WHERE中进行比较。

尝试将代码段更改为类似内容:

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。您可以考虑通过使用锁来防止并发更新(由并行运行的其他程序或最终由其他用户运行的同一程序(,以避免在初始化内部表和UPDATESELECT之间进行某些更新。

注意:我不明白你为什么说LOOP对代码检查器和性能都是一个问题。构造函数表达式(如您所说"新语法"(用于避免中间变量,以获得更好的可读性并专注于最终目标。

相关内容

  • 没有找到相关文章

最新更新