仅从内部 table 更新数据库 table 的特定字段

UPDATE only specific fields of database table from internal table

我需要在名为 ANLZ.

的数据库 table 中更新两个名为 F1 和 F2 的字段

Table ANLA 有一个名为 ACTIVE 的字段,说明 ANLZ 中的字段是否可以更新。

连接两个 table 的键是字段 ANLN1

数据声明:

TYPES: BEGIN OF TY_ANLZ,
   ANLN1 TYPE ANLZ-ANLN1,
   ACTIVE TYPE ANLA-ACTIVE,
   F1 TYPE ANLZ-F1,
   F2 TYPE ANLZ-F2,
  END OF TY_ANLZ.

DATA LT_ANLZ TYPE STANDARD TABLE OF TY_ANLZ.

首先,我进行内部联接,仅提供在 ANLA 中处于活动状态的记录以及来自 ANLZ 的相应字段 F1、F2。

SELECT F1, F2, ANLA~ACTIVE, ANLA~ANLN1 FROM ANLZ AS ANLZ
   INNER JOIN ANLA AS ANLA
   ON ANLA~ANLN1 EQ ANLZ~ANLN1
   WHERE ANLA~ACTIVE EQ 'Y'
   INTO CORRESPONDING FIELDS OF TABLE @lt_anlz.

现在我需要访问 ANLZ 并使用静态值(例如 ****)使用过滤后的 ANLZ-F1 和 ANLZ-F2 更新它,请问我该怎么做?什么方法最够用?

我在想,但我不确定循环的使用在性能方面是否很好(数万条记录)。

LOOP AT lt_anlz ASSIGNING <fs_anlz>.
   UPDATE anlz SET F1 = <fs_anlz>-F1,
                   F2 = <fs_anlz>-F2
                   WHERE ANLN1 = <fs_anlz>-ANLN1.
ENDLOOP.

用一个 UPDATE FROM @itab 批量写入 table 可能比为每个记录创建一个事务更快(假设 anln1 是主键):

UPDATE anlz FROM TABLE @lt_anlz.

从 ABAP 版本 7.55 开始,您可以声明指标结构以及语句 TYPES。见相关文档here.

The addition INDICATORS of the UPDATE FROM clause can be used to specify set indicators for a work area or an internal table. The purpose of set indicators is to indicate columns to be changed. UPDATE FROM without indicators overwrites all fields of a row but when set indicators are used, only the indicated fields are updated. The addition can be specified only after UPDATE FROM for structured work areas wa or internal tables itab with a structured row type. The source work area or internal table must have a structure set_ind as last field with the same number of components as the DDIC database table to be updated, and each component serves as set indicator for one row. There is a static variant and a dynamic variant.

示例如下:

INSERT demo_update FROM TABLE @(
    VALUE #( ( id = 'A' col1 = '1' col2 = '10'   col3 = '100')
             ( id = 'B' col1 = '2' col2 = '20'   col3 = '200')
             ( id = 'C' col1 = '3' col2 = '30'   col3 = '300')
             ( id = 'D' col1 = '4' col2 = '40'   col3 = '400')
             ( id = 'E' col1 = '5' col2 = '50'   col3 = '500')
             ( id = 'F' col1 = '6' col2 = '60'   col3 = '600') ) ).

TYPES ind_wa TYPE demo_update WITH INDICATORS col_ind
             TYPE abap_bool.
DATA ind_tab TYPE TABLE OF ind_wa.

ind_tab = VALUE #(
       ( id = 'D' col4 = 4000 col_ind-col4 = abap_true )
       ( id = 'E' col4 = 5000 col_ind-col4 = abap_true )
       ( id = 'F' col4 = 6000 col_ind-col4 = abap_true ) ).

UPDATE demo_update FROM TABLE @ind_tab
                   INDICATORS SET STRUCTURE col_ind.

* See first result

UPDATE demo_update FROM TABLE @ind_tab.

* See second result

使用指标的第一个结果

Client ID COL1 COL2 COL3 COL4
000 A 1 10 100 0
000 B 2 20 200 0
000 C 3 30 300 0
000 D 4 40 400 4000
000 E 5 50 500 5000
000 F 6 60 600 6000

没有指标的第二个结果

请注意 col1col2col4 列中的值如何设置为初始值(与内部 table 中的值相同)。

Client ID COL1 COL2 COL3 COL4
000 A 1 10 100 0
000 B 2 20 200 0
000 C 3 30 300 0
000 D 0 0 0 4000
000 E 0 0 0 5000
000 F 0 0 0 6000