仅从内部 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
没有指标的第二个结果
请注意 col1
、col2
和 col4
列中的值如何设置为初始值(与内部 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
我需要在名为 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 |
没有指标的第二个结果
请注意 col1
、col2
和 col4
列中的值如何设置为初始值(与内部 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 |