SAP ABAP-如何从JAVA系统上传附件到SAP DMS系统

        在实际项目上,通常会通过前端系统上传一些附件,如图片,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.

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
《从实例学SAP ABAP编程1-10章》是一本SAP ABAP编程的经典入门教材。本书从简单的SAP ABAP编程入手,通过多个实例向读者展示了SAP ABAP编程的核心概念和语法。 在第一章中,本书通过一个简单的例子介绍了SAP ABAP编程的基础知识,讲解了ABAP编辑器、ABAP数据字典和ABAP Workbench等重要工具的用法。 在第二章中,本书通过一个简单的例子向读者介绍了ABAP表格的创建和维护,并讲解了一些与表格相关的SAP ABAP编程的语法和概念。 在第三章中,本书介绍了SAP ABAP编程中的面向对象编程,通过几个例子向读者展示了如何使用类、对象和继承等概念进行SAP ABAP编程。 在第四章中,本书介绍了SAP ABAP编程中的函数模块,向读者讲解了如何创建和调用函数模块,以及如何在SAP系统中使用函数模块。 在第五章中,本书介绍了SAP ABAP编程中的异常处理,向读者讲解了如何使用TRY/CATCH语句处理SAP系统中的异常情况。 在第六章中,本书介绍了SAP ABAP编程中的Web服务,向读者讲解了如何创建和使用SAP系统中的Web服务,以及如何使用HTTP和SOAP协议进行数据通信。 在第七章中,本书介绍了SAP ABAP编程中的ALV报表,向读者讲解了如何创建和维护SAP系统中的ALV报表,以及如何对报表进行数据操作和定制。 在第八章中,本书介绍了SAP ABAP编程中的BADI和Enhancement点,向读者讲解了如何使用BADI和Enhancement点扩展和修改SAP系统中的业务逻辑。 在第九章中,本书介绍了SAP ABAP编程中的Smart Form,向读者讲解了如何使用Smart Form创建和维护SAP系统中的表单。 在第十章中,本书介绍了SAP ABAP编程中的SAP HANA数据库,向读者讲解了如何使用SAP HANA数据库进行高效的数据处理和分析。 通过阅读本书,读者可以快速掌握SAP ABAP编程的核心知识和技能,从而能够独立进行SAP系统的开发和维护工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IGOR-MA

您的鼓励将激励我更大的动力前行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值