[英]UPDATE only specific fields of database table from internal table
我需要在名为ANLZ的数据库表中更新两个名为 F1 和 F2 的字段。
表ANLA有一个名为 ACTIVE 的字段,它说明ANLZ中的字段是否可以更新。
连接两个表的键是字段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 更新它,使用 static 值(例如 ****),请问我该怎么做? 什么是最充分的方式?
我在想,但我不确定循环的使用在性能方面是否良好(数万条记录)。
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
批量写入表可能比为每个记录创建一个事务更快(假设 anln1 是主键):
UPDATE anlz FROM TABLE @lt_anlz.
从 ABAP 版本 7.55 开始,您可以声明指标结构以及语句 TYPES。 请在此处查看相关文档。
UPDATE FROM 子句的附加 INDICATORS 可用于指定工作区或内部表的集合指示符。 设置指示器的目的是指示要更改的列。 没有指示符的 UPDATE FROM 会覆盖一行的所有字段,但是当使用设置的指示符时,只会更新指示的字段。 只有在 UPDATE FROM 之后才能为结构化工作区 wa 或具有结构化行类型的内部表 itab 指定添加。 源工作区或内表必须有一个结构set_ind作为最后一个字段,其组件数与要更新的DDIC数据库表相同,每个组件作为一行的集合指示符。 有一个 static 变体和一个动态变体。
示例如下:
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
客户 | ID | 列1 | 列2 | 列3 | 列4 |
---|---|---|---|---|---|
000 | 一种 | 1个 | 10 | 100 | 0 |
000 | 乙 | 2个 | 20 | 200 | 0 |
000 | C | 3个 | 30 | 300 | 0 |
000 | 丁 | 4个 | 40 | 400 | 4000 |
000 | 乙 | 5个 | 50 | 500 | 5000 |
000 | F | 6个 | 60 | 600 | 6000 |
请注意列col1
、 col2
和col4
中的值是如何设置为初始值的(与内部表中的值相同)。
客户 | ID | 列1 | 列2 | 列3 | 列4 |
---|---|---|---|---|---|
000 | 一种 | 1个 | 10 | 100 | 0 |
000 | 乙 | 2个 | 20 | 200 | 0 |
000 | C | 3个 | 30 | 300 | 0 |
000 | 丁 | 0 | 0 | 0 | 4000 |
000 | 乙 | 0 | 0 | 0 | 5000 |
000 | F | 0 | 0 | 0 | 6000 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.