我需要更新名为 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 更新它,我该怎么做?最充分的方法是什么?
我在想,但我不确定使用循环对于性能(数万条记录)是否有好处。
LOOP AT lt_anlz ASSIGNING <fs_anlz>.
UPDATE anlz SET F1 = <fs_anlz>-F1,
F2 = <fs_anlz>-F2
WHERE ANLN1 = <fs_anlz>-ANLN1.
ENDLOOP.
从 ABAP 版本 7.55 开始,您可以随语句 TYPES 一起声明指标结构。请参阅相关文档此处。
UPDATE FROM 子句中添加的 INDICATORS 可用于指定工作区或内表的集合指示器。设置指示器的目的是指示要更改的列。不带指示符的 UPDATE FROM 会覆盖行的所有字段,但使用设置指示符时,仅更新指示的字段。对于结构化工作区 wa 或具有结构化行类型的内部表 itab,只能在 UPDATE FROM 之后指定添加。源工作区或内部表必须有一个结构体 set_ind 作为最后一个字段,其组件数量与要更新的 DDIC 数据库表相同,并且每个组件充当一行的设置指示器。有静态变体和动态变体。
示例如下:
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
客户 | 身份证 | 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
列中的值如何设置为初始值(与内表中的值相同)。
客户 | 身份证 | 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 |
在此示例中,IND_WA 是静态的。是否可以动态创建IND_WA结构并分配值进行更新?