繁体   English   中英

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

[英]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

没有指标的第二个结果

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

客户 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM