在实际项目上,通常会通过前端系统上传一些附件,如图片,PDF文件到后端系统存储,有时为了实现文件共用共享,将文件统一存储到一个系统中,特别是使用了SAP系统,将文件存储到DMS,这样在SAP中也方便查阅。第三方系统,如OA系统,MES系统,可直接通过接口读取文件。
曾经在项目上,就使用过如下手应用,通过移动手持设备,现场扫描产品,将有瑕疵的产品上传到DMS系统,其中就是通过扫描上传,发送到JAVA 后端,JAVA再通过调用接口存储到SAP系统。特别是上了SAP QM模块,使用移动终端检验产品,更直接更方便。
以下是主要实现思路和代码,JAVA接收到文件后将流文件转为字符串,ABAP接口,接收到流文件字符串后,再转回16进制文件(XSTRING类型),再通过ABAP接口存储到DMS系统。
function zxxx_attach_file_upload.
*"----------------------------------------------------------------------
*"*"區域介面:
*" IMPORTING
*" VALUE(IM_DATA) TYPE /SDF/XML
*" VALUE(IM_FILE) TYPE ZXTA_QMAT
*" EXPORTING
*" VALUE(EX_RET2) TYPE BAPIRET2
*"----------------------------------------------------------------------
data:i_drao like table of drao with header line.
data:i_files_x like table of cvapi_doc_file with header line,
i_files like table of zxta_qmat with header line,
i_drat like table of dms_db_drat with header line.
types:begin of t_doct,
doc_data(2550) type x,
end of t_doct.
data:i_doct type table of t_doct,
w_doct like line of i_doct.
data:v_content type xstring,
v_length type i.
data:w_ret type messages,
w_draw like draw,
w_qals like qals,
v_appnr type i,
v_appnr_x type i,
v_stor_cat type cv_storage_cat value 'ZDMSXX', "DMS存储服务器
v_begru like draw-begru value 'XXQM',
v_prov like mcdok-content_provide value 'TBL'.
v_content = im_data.
*CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
* EXPORTING
* TEXT = IM_DATA
* IMPORTING
* BUFFER = V_CONTENT
* EXCEPTIONS
* FAILED = 01
* OTHERS = 09.
v_length = strlen( im_data ).
call function 'SCMS_XSTRING_TO_BINARY'
exporting
buffer = v_content
importing
output_length = v_length
tables
binary_tab = i_doct[].
data v_text type string.
if im_file-dokar is initial.
im_file-dokar = 'Z01'.
endif.
if im_file-prueflos is not initial.
select * into corresponding fields of table i_files from zxta_qmat
where prueflos = im_file-prueflos
and vorglfnr = im_file-vorglfnr
and merknr = im_file-merknr
and probenr = im_file-probenr
and dokar = im_file-dokar.
* **********************************************************************
* 特别说明,有关存储服务位置的确定,可根据工厂代码来定义,
* 初始默认全部存到XXX公司文档服务器
* 未来扩展到集团下其他公司时,可按如下逻辑处理
* SELECT SINGLE * INTO CORRESPONDING FIELDS OF W_QALS
* FROM QALS WHERE PRUEFLOS = IM_PRUEFLOS.
* IF W_QALS-WERK EQ 'P001'.
* V_STOR_CAT = 'ZDMS01'.
* V_BEGRU = 'XXQM'.
* ELSEIF W_QALS-WERK = 'P001'.
* V_STOR_CAT = 'ZDMS02'.
* V_BEGRU = 'XXQM'.
* ELSEIF W_QALS-WERK = 'P002'.
* V_STOR_CAT = 'ZDMS03'.
* V_BEGRU = 'XXQM'.
* ENDIF.
* **********************************************************************
endif.
clear im_file-appnr.
read table i_files index 1.
if sy-subrc eq 0.
im_file-doknr = i_files-doknr.
im_file-dokvr = i_files-dokvr.
im_file-doktl = i_files-doktl.
im_file-dokar = i_files-dokar.
loop at i_files.
v_appnr_x = i_files-appnr.
if v_appnr_x gt v_appnr.
v_appnr = v_appnr_x.
endif.
endloop.
else.
im_file-dokvr = '00'.
im_file-doktl = '000'.
endif.
v_appnr = v_appnr + 1.
im_file-appnr = v_appnr.
if im_file-doknr is initial.
w_draw-dokar = im_file-dokar.
w_draw-doknr = ''.
w_draw-dokvr = im_file-dokvr.
w_draw-doktl = im_file-doktl.
w_draw-dwnam = im_file-cardno.
w_draw-dokst = 'IE'.
w_draw-begru = 'XXQM'.
i_drat-updateflag = 'I'.
i_drat-dokar = w_draw-dokar.
i_drat-dokvr = w_draw-dokvr.
i_drat-doktl = w_draw-doktl.
i_drat-langu = sy-langu.
i_drat-dktxt = 'XXX系统自动上传文件'.
if im_file-prueflos is not initial.
concatenate '检验批[' im_file-prueflos ']附件' into i_drat-dktxt.
else.
i_drat-dktxt = im_file-shorttext.
endif.
append i_drat.
call function 'CVAPI_DOC_CREATE'
exporting
ps_draw = w_draw
importing
psx_message = w_ret
pfx_dokar = im_file-dokar
pfx_doknr = im_file-doknr
pfx_dokvr = im_file-dokvr
pfx_doktl = im_file-doktl
tables
pt_drat_x = i_drat.
if w_ret-msg_type eq 'E'.
call function 'BAPI_TRANSACTION_ROLLBACK'.
ex_ret2-type = 'E'.
message id w_ret-msg_id type 'S'
number w_ret-msg_no with w_ret-msg_v1 w_ret-msg_v2
w_ret-msg_v3 w_ret-msg_v4 into ex_ret2-message.
else.
call function 'BAPI_TRANSACTION_COMMIT' "DEVK912522
exporting
wait = 'X'.
ex_ret2-type = 'S'.
message id w_ret-msg_id type 'S'
number w_ret-msg_no with w_ret-msg_v1 w_ret-msg_v2
w_ret-msg_v3 w_ret-msg_v4 into ex_ret2-message.
endif.
endif.
if ex_ret2-type ne 'E'.
translate im_file-dappl to upper case.
translate im_file-pathname to upper case.
translate im_file-filename to upper case.
if im_file-pathname cs '.DOCX'.
im_file-dappl = 'DOC'.
replace all occurrences of '.DOCX' in im_file-pathname with '.DOC'.
replace all occurrences of '.DOCX' in im_file-filename with '.DOC'.
elseif im_file-pathname cs '.XLSX'.
im_file-dappl = 'XLS'.
replace all occurrences of '.XLSX' in im_file-pathname with '.XLS'.
replace all occurrences of '.XLSX' in im_file-filename with '.XLS'.
endif.
i_files_x-updateflag = 'I'.
i_files_x-appnr = v_appnr.
i_files_x-dappl = im_file-dappl.
i_files_x-langu = sy-langu.
i_files_x-storage_cat = v_stor_cat.
im_file-storage_cat = i_files_x-storage_cat.
i_files_x-description = im_file-shorttext.
i_files_x-pathname = im_file-pathname.
* I_FILES_X-FILENAME = IM_FILE-FILENAME.
append i_files_x.
loop at i_doct into w_doct.
i_drao-dokar = im_file-dokar.
i_drao-doknr = im_file-doknr.
i_drao-dokvr = im_file-dokvr.
i_drao-doktl = im_file-doktl.
i_drao-appnr = v_appnr.
i_drao-zaehl = '000'.
i_drao-orln = v_length.
v_text = w_doct-doc_data.
i_drao-orbkl = strlen( v_text ).
i_drao-orblk = w_doct-doc_data.
append i_drao.
endloop.
call function 'CVAPI_DOC_CHECKIN'
exporting
pf_dokar = im_file-dokar
pf_doknr = im_file-doknr
pf_dokvr = im_file-dokvr
pf_doktl = im_file-doktl
pf_content_provide = v_prov
importing
psx_message = w_ret
tables
pt_files_x = i_files_x
pt_content = i_drao.
if w_ret-msg_type eq 'E'.
call function 'BAPI_TRANSACTION_ROLLBACK'.
ex_ret2-type = 'E'.
message id w_ret-msg_id type 'S'
number w_ret-msg_no with w_ret-msg_v1 w_ret-msg_v2
w_ret-msg_v3 w_ret-msg_v4 into ex_ret2-message.
else.
call function 'BAPI_TRANSACTION_COMMIT' "DEVK912522
exporting
wait = 'X'.
ex_ret2-type = 'S'.
message id w_ret-msg_id type 'S'
number w_ret-msg_no with w_ret-msg_v1 w_ret-msg_v2
w_ret-msg_v3 w_ret-msg_v4 into ex_ret2-message.
if w_ret-msg_id is initial.
ex_ret2-message = '文件上传成功'.
endif.
* DELETE FROM ZXTA_QMAT WHERE DOKNR = IM_FILE-DOKNR AND DAPPL = ''.
endif.
if ex_ret2-type eq 'E'.
clear:im_file-dappl.
endif.
if ( im_file-prueflos is not initial or im_file-equnr is not initial ) and ex_ret2-type ne 'E'.
wait up to 2 seconds.
select single lo_objid into im_file-lo_objid from dms_doc2loio
where dokar = im_file-dokar
and doknr = im_file-doknr
and dokvr = im_file-dokvr
and doktl = im_file-doktl
and lo_index = im_file-appnr.
select single phio_id into im_file-ph_objid from dms_ph_cd1
where lo_class = 'DMS_LCD1'
and loio_id = im_file-lo_objid
and ph_class = 'DMS_PCD1'.
insert zxta_qmat from im_file.
commit work.
endif.
endif.
endfunction.