我已经导出了带有事务SE16的表的内容,方法是选择所有条目并选择下载,未转换。
我想将这些条目导入另一个系统(其中存在相同的表并且处于活动状态)。
此外,当我导入时,可能已经存在多个条目(旧条目)的特定密钥。
其他条目在要导入它们的表中不会有具有相同关键字的字段(新条目)。
有没有一种方法可以用第一个系统提供的文件在第二个系统中轻松地更新我的表?如果需要,我可以导出其他3种格式类型的数据(电子表格、富文本格式和HTML格式)。但在我看来,电子表格和富文本格式有时会破坏数据,而且html太冗长了。
[EDIT]根据流行的需求,我试图导出/导入的表是一个Z表,其字段都是数字、字符、日期或时间字段(平面数据类型)。
我尝试这样做是因为客户端没有任何基础资源来帮助他们进行传输,并且希望"kinna"自动更新一个系统中的一个表。
目前,这样做是一个业务请求,但我对建议持开放态度(客户也持开放态度)
编辑
好吧,我怀疑你在评论中描述的内容是否开箱即用,但你可以很容易地写这样的东西:
创建一个接受以下内容的方法(或功能模块,如果它使您的船漂浮):
iv_table name TYPE string and
iv_filename TYPE string
这将是一种方法:
method upload_table.
data: lt_table type ref to data,
lx_root type ref to cx_root.
field-symbols: <table> type standard table.
try.
create data lt_table type table of (iv_table_name).
assign lt_table->* to <table>.
call method cl_gui_frontend_services=>gui_upload
exporting
filename = iv_filename
has_field_separator = abap_true
changing
data_tab = <table>
exceptions
others = 4.
if sy-subrc <> 0.
"Some appropriate error handling
"message id sy-msgid type 'I'
" number sy-msgno
" with sy-msgv1 sy-msgv2
" sy-msgv3 sy-msgv4.
return.
endif.
modify (p_name) from table <table>.
"write: / sy-tabix, ' entries updated'.
catch cx_root into lx_root.
"lv_text = lx_root->get_text( ).
"some appropriate error handling
return.
endtry.
endmethod.
这仍然需要确保导出的文件与要导入的表匹配。但是,在这种情况下,cl_gui_frontend_services=>gui_upload
应该返回sy-subrc > 0
,这样您就可以在损坏任何数据之前退出。
原始答案:
我假设您想要更新z表,而不是SAP标准表。
您可能需要稍微格式化数据文件,使其以制表符或逗号分隔。
然后,您可以使用cl_gui_frontend_services=>gui_upload
上传数据文件
然后,如果你想覆盖表中的现有数据,你可以使用
modify zmydbtab from table it_importeddata.
如果不想覆盖现有条目,可以使用。
insert zmydbtab from table it_importeddata.
如果任何键已经存在,但任何新条目都将被插入,那么您将得到一个返回代码sy-subrc=4。
注意对于SAP标准表,您不这样做的原因有很多。最突出的是,数据模型几乎总是比我们所知道的更多。此外,在创建事务数据时,通常会有后续事件或工作流启动,如果您直接更新数据库,则不会出现这种情况。根据经验,直接更新SAP标准表通常是个坏主意。
在这种情况下,尝试查找BADI,或者如果不可用,则记录BDC并以这种方式进行更新。
如果系统环境设置正确,您的客户端将不需要任何基础操作支持来执行传输。因此,与其重新发明轮子,我强烈建议在CTS和TMS设置合理后,了解它们的功能。