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

问题描述 投票:0回答:3

我需要更新名为 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 opensql
3个回答
3
投票

使用一个

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

UPDATE anlz FROM TABLE @lt_anlz.

3
投票

从 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

0
投票

在此示例中,IND_WA 是静态的。是否可以动态创建IND_WA结构并分配值进行更新?

© www.soinside.com 2019 - 2024. All rights reserved.