我正在尝试使用以下内容: 从zbseg更新bseg 。 ->表的长度不同(ZBSEG是BSEG的简化版本)。
整个想法是BSEG只是一个例子,表在很大程度上改变了覆盖所有群集表的位置。因此,一切都应该是动态的。群集中的表数据仅减少到几个字段,然后复制到透明表(新透明表中的数据字典具有主键+群集中只有几个字段),然后透明数据将被修改并复制回(更新)到集群。
从zbseg中更新bseg ->以下是从ZBSEG中更新字段值,但对于其余字段将不保留旧值,它将仅放置初始值。
我已经尝试过了,甚至我都不知道:
选择* 来自bseg 进入表gt_bseg。
及其后:
选择MANDT BUKRS BELNR GJAHR BUZEI BUZID AUGDT 来自zbseg 进入表gt_bseg的相应字段。
但是它仍然与zbseg中未考虑的那些字段重叠。
也许某些操作只能将某些从ZBEG中提取的字段更新为直接来自BSEG的gt_bseg?
任何解决方案吗?
答案 0 :(得分: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.
答案 1 :(得分:0)
您可以尝试使用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[].
答案 2 :(得分: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 表示 BSEG , ZBSET 表示 BSET , ZKONV 表示 KONV < / strong>,依此类推。
通过主键更新表,该主键必须包含在精简表中。由于要禁止更新主键,因此要从缩减表中获取要更新的字段作为除键字段之外的所有其他字段。