【ABAP】 运用GOS技术将报文中的附件(PDF.TXT等) 存至系统附件内

 开发中通常会在接口传输文件附件  例如PDF.TXT等文件(通常文件以字符流的形式传 这里以BASE64加密字符串传输PDF举例 )存入对应检验批的附件清单内。

常用的几种对象类型:

采购订单BUS2012

销售订单:BUS2032

DN交货单:LIKP

销售发票VBRK

采购发票BUS2081

会计凭证BUS6035

检验批号:BUS2045

可以在TOJTT表中查找相关对象类型

可以在SRGBTBREL表中查看已存在附件

*  IF it_items[] IS INITIAL.
*    RETURN.
*  ELSE.
*    CLEAR:gt_items.
*    gt_items =  CORRESPONDING #( it_items[] ).    ""获取传输来的内表
*    PERFORM sub_set_pdf CHANGING e_type e_msg.
*  ENDIF.  

FORM sub_set_pdf CHANGING cv_type TYPE  bapi_mtype
                           cv_msg  TYPE  bapi_msg.
  INCLUDE <cntn01>.
  DATA:l_base64 TYPE string. 

  DATA:ls_binrel        TYPE gbinrel,
       ls_obja          TYPE borident,
       ls_roleb         TYPE borident,
       lt_binrel_attrib TYPE TABLE OF brelattr.

  DATA:lt_swcont        TYPE TABLE OF swcont WITH HEADER LINE,
       l_pure_filename  TYPE char30,      ""文件名
       l_pure_extension TYPE sdbad-funct, ""文件格式
       ls_attsize       TYPE int4,
       lo_swc_obj       TYPE swc_object..

  DATA:l_xstr      TYPE xstring,         ""PDF字符串解析后解码的xstring文件
       lt_pdf_tab  TYPE solix_tab,       ""将xstring转换为SAP内表
       l_length    TYPE i,               ""xstring 文件大小
       l_folder_id TYPE sofdk.           ""读取数据文件根ID

  LOOP AT gt_items INTO gs_items.
    CLEAR:l_base64         ,
          ls_binrel        ,
          ls_obja          ,
          ls_roleb         ,
          lt_binrel_attrib ,
          lt_swcont        ,
          l_pure_filename ,
          l_pure_extension,
          ls_attsize       ,
          lo_swc_obj       ,
          l_xstr          ,
          lt_pdf_tab       ,
          l_length        ,
          l_folder_id     .

    IF gs_items-pdfstring  IS INITIAL.""此处为得到的流字符串
      l_base64   = gs_items-pdfstring .
    ELSE.
      CONTINUE.
    ENDIF.

*<!---  BASE64转xstring
    CALL FUNCTION 'SCMS_BASE64_DECODE_STR'
      EXPORTING
        input    = l_base64
        unescape = 'X'
      IMPORTING
        output   = l_xstr
      EXCEPTIONS
        failed   = 1
        OTHERS   = 2.

*<!---  xstring转sap内表
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer        = l_xstr
      IMPORTING
        output_length = l_length
      TABLES
        binary_tab    = lt_pdf_tab.

*<!---  读取当前数据ID
    CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
      EXPORTING
        region                = 'B'
      IMPORTING
        folder_id             = l_folder_id
      EXCEPTIONS
        communication_failure = 1
        owner_not_exist       = 2
        system_failure        = 3
        x_error               = 4
        OTHERS                = 5.

*<!---  转换文件
    ls_roleb-objtype = 'MESSAGE'.  
    ls_obja-objtype  = 'BUS2045'.
    ls_obja-objkey   =  gs_items-prueflos.

    l_pure_filename  = |{ ls_obja-objkey }{ '-检验报告' }{ sy-datum }{ sy-uzeit }|.
    l_pure_extension = 'pdf'. 

    swc_create_object  lo_swc_obj   'MESSAGE' ''.
    swc_set_element    lt_swcont    'NO_DIALOG' 'X'.
    swc_set_element    lt_swcont    'DOCUMENTTITLE' l_pure_filename.    ""文件名
    swc_set_table      lt_swcont    'Content_Hex'   lt_pdf_tab.         ""文件内容
    swc_set_element    lt_swcont    'DOCUMENTTYPE'  l_pure_extension.   ""文件格式
    swc_set_element    lt_swcont    'DOCUMENTSIZE'  l_length.           ""文件大小
    swc_refresh_object lo_swc_obj.
    swc_call_method    lo_swc_obj   'CREATE' lt_swcont.
    swc_get_object_key lo_swc_obj   ls_roleb-objkey.

    CALL FUNCTION 'BINARY_RELATION_CREATE_COMMIT'
      EXPORTING
        obj_rolea      = ls_obja
        obj_roleb      = ls_roleb
        relationtype   = 'ATTA'
      IMPORTING
        binrel         = ls_binrel
      TABLES
        binrel_attrib  = lt_binrel_attrib
      EXCEPTIONS
        no_model       = 1
        internal_error = 2
        unknown        = 3
        OTHERS         = 4.
    IF sy-subrc EQ 0.
      cv_type = 'S'.
      MESSAGE s043(sgos_msg) INTO cv_msg.""已成功创建附件
    ELSE.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          msgid               = sy-msgid
          msgnr               = sy-msgno
          msgv1               = sy-msgv1
          msgv2               = sy-msgv2
          msgv3               = sy-msgv3
          msgv4               = sy-msgv4
        IMPORTING
          message_text_output = cv_msg.
      cv_type = 'E'.
    ENDIF.

  ENDLOOP.

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值