0

我正在尝试使用以下内容:

update bseg from zbseg

其中表的长度不同(ZBSEG是 的缩减版BSEG)。

整个想法BSEG只是一个例子,我有一个循环,所有集群表都将被迭代,所以一切都应该是动态的。

集群中的表数据减少到只有几个字段并复制到透明表中(新透明表中的数据字典有主键+集群中只有少数字段),然后将数据库中的数据修改并通过复制回UPDATE集群。

update bseg from zbseg

此语句更新字段值,ZBSEG但其余部分不会保留旧值,而是放置初始值。

我什至尝试过:

SELECT *
FROM bseg
INTO TABLE gt_bseg.

SELECT mandt bukrs belnr gjahr buzei buzid augdt
FROM zbseg
INTO CORRESPONDING FIELDS OF TABLE gt_bseg.

但它仍然与 zbseg 中未考虑的那些字段重叠。

任何语句只会更新ZBSEG从不​​触及其他字段中提取的特定范围的BSEG字段?

图片:循环原始全长和短表

4

3 回答 3

2

我认为您需要从 zbseg 获取具有限制的记录,因为将存在数百万条记录,然后从 bseg 中一一获取并更新它,然后从 zbseg 中删除或更新它的标志以提高性能。

tables: BSEG, ZBSEG.

data: GT_ZBSEG like ZBSEG occurs 1 with header line,
      GS_BSEG type BSEG.

select *
into table GT_ZBSEG up to 1000 rows
from ZBSEG.

check SY-SUBRC is initial.
check SY-DBCNT is not initial.

loop at GT_ZBSEG.
  select single * from BSEG into GS_BSEG
  where BSEG~MANDT = GT_ZBSEG-MANDT
    and BSEG~BUKRS = GT_ZBSEG-BUKRS
    and BSEG~BELNR = GT_ZBSEG-BELNR
    and BSEG~GJAHR = GT_ZBSEG-GJAHR
    and BSEG~BUZEI = GT_ZBSEG-BUZEI.
  if SY-SUBRC ne 0.
    message E208(00) with 'Record not found!'.
  endif.
  if GS_BSEG-BUZID ne GT_ZBSEG-BUZID
  or GS_BSEG-AUGDT ne GT_ZBSEG-AUGDT.
    move-corresponding GT_ZBSEG to GS_BSEG.
    update BSEG from GS_BSEG.
  endif.
  " delete same records and transfered
  delete ZBSEG from GT_ZBSEG.
endloop.
于 2018-08-27T20:57:40.837 回答
0

这是您可以用于您的任务的一段代码。它基于动态 UPDATE 语句,只允许更新某些字段:

DATA: handle      TYPE REF TO data,
      lref_struct TYPE REF TO cl_abap_structdescr,
      source      TYPE string,
      columns     TYPE string,
      keys        TYPE string,
      cond        TYPE string,
      sets        TYPE string.

SELECT tabname FROM dd02l INTO TABLE @DATA(clusters) WHERE tabclass = 'CLUSTER'.

LOOP AT clusters ASSIGNING FIELD-SYMBOL(<cluster>).
  lref_struct ?= cl_abap_structdescr=>describe_by_name( <cluster>-tabname ).
  source = 'Z' && <cluster>-tabname. " name of your ZBSEG-like table
* get key fields
  DATA(key_fields) = VALUE ddfields( FOR line IN lref_struct->get_ddic_field_list( ) 
                                     WHERE ( keyflag NE space ) ( line ) ).
  lref_struct ?= cl_abap_structdescr=>describe_by_name( source ).
* get all fields from source reduced table
  DATA(fields) = VALUE ddfields( FOR line IN lref_struct->get_ddic_field_list( ) ( line ) ).

* filling SELECT fields and SET clause
  LOOP AT fields ASSIGNING FIELD-SYMBOL(<field>).
    AT FIRST.
      columns = <field>-fieldname.
      CONTINUE.
    ENDAT.
    CONCATENATE columns <field>-fieldname INTO columns SEPARATED BY `, `.
    IF NOT line_exists( key_fields[ fieldname = <field>-fieldname ] ).
      IF sets IS INITIAL.
        sets = <field>-fieldname && ` = @<fsym_wa>-` && <field>-fieldname.
      ELSE.
        sets = sets && `, ` && <field>-fieldname && ` = @<fsym_wa>-` && <field>-fieldname.
      ENDIF.
    ENDIF.
  ENDLOOP.

* filling key fields and conditions
  LOOP AT key_fields ASSIGNING <field>.
    AT FIRST.
      keys = <field>-fieldname.
      CONTINUE.
    ENDAT.
    CONCATENATE keys <field>-fieldname INTO keys SEPARATED BY `, `.
    IF cond IS INITIAL.
      cond = <field>-fieldname && ` = @<fsym_wa>-` && <field>-fieldname.
    ELSE.
      cond = cond && ` AND ` && <field>-fieldname && ` = @<fsym_wa>-` && <field>-fieldname.
    ENDIF.
  ENDLOOP.

* constructing reduced table type
  lref_struct ?= cl_abap_typedescr=>describe_by_name( source ).
  CREATE DATA handle TYPE HANDLE lref_struct.
  ASSIGN handle->*  TO FIELD-SYMBOL(<fsym_wa>).

* updating result cluster table
  SELECT (columns)
    FROM (source)
    INTO @<fsym_wa>.
  UPDATE (<cluster>-tabname)
  SET (sets)
  WHERE (cond).
  ENDSELECT.

ENDLOOP.

这篇文章从 DD02L 中选择所有集群表,并假设您为每个目标集群表减少了前缀为 Z 的 DB 表。例如ZBSEG代表BSEGZBSET代表BSETZKONV代表KONV等等。

表由必须包含在缩减表中的主键更新。需要更新的字段是从精简表中取出的,作为除关键字段之外的所有字段,因为禁止更新主键。

于 2019-07-08T22:53:59.580 回答
-1

您可以尝试使用 MODIFY 语句来更新表。

另一种方法是使用cl_abap_typedescr获取每个表的字段并比较它们以进行更新。

这是如何获取字段的示例。

DATA : ref_table_des TYPE REF TO cl_abap_structdescr,
       columns TYPE abap_compdescr_tab.

ref_table_des ?= cl_abap_typedescr=>describe_by_data( struc ).
columns = ref_table_des->components[].
于 2018-08-28T16:46:06.980 回答