ABAP读取 attachment

本文介绍了一个ABAP函数模块Z02HR_GET_ATTACHMENT的实现细节,该模块用于从SAP系统中读取并下载指定对象的附件。涉及的技术包括二进制关系管理、FTP文件传输、SAP GUI进度指示器等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FUNCTION Z02HR_GET_ATTACHMENT.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IS_OBJECT) TYPE  SIBFLPORB
*"  EXPORTING
*"     REFERENCE(E_FLAG) TYPE  C
*"  TABLES
*"      ET_ATTA STRUCTURE  Z02HR_ATTA
*"----------------------------------------------------------------------
  DATALS_OBJECT     TYPE SIBFLPORB,
        LS_OPTION     TYPE OBL_S_RELT,
        LT_OPTIONS    TYPE OBL_T_RELT,
        LT_LINKS      TYPE OBL_T_LINK,
        LS_LINK       TYPE OBL_S_LINK.

*--- read attachment
  DATALT_OBJECT_HEADER  TYPE STANDARD TABLE OF SOLISTI1,
        LT_OBJECT_CONTENT TYPE STANDARD TABLE OF SOLISTI1,
        LT_CONTENTS_HEX   TYPE STANDARD TABLE OF SOLIX,
        L_BLOB_LENGTH     TYPE I.
  FIELD-SYMBOLS <FS_BOJECT_HEADER> TYPE SOLISTI1.

  DATAL_DOCMENT_ID     TYPE SOFOLENTI1-DOC_ID,
        LS_DOCUMENT_DATA TYPE SOFOLENTI1,
        L_HANDLE         TYPE I,
        L_PATH(60)       TYPE VALUE '/OA/SAP-OA/',
        L_FNAME(60)      TYPE C.

  DATAL_TEXT1 TYPE STRING,
        L_TEXT2 TYPE STRING.
  DATAL_FLAG TYPE C.
*--- attachment infomation
  DATAES_ATTA TYPE Z02HR_ATTA.

  DATAL_SPACE TYPE C.

  DATAL_OA(3TYPE C.

  CLEARE_FLAG,
         ES_ATTA,
         ET_ATTA[].

  LS_OBJECT IS_OBJECT.
  IF LS_OBJECT-CATID IS INITIAL.
    LS_OBJECT-CATID 'BO'.
  ENDIF.

*--- option
  CLEAR LS_OPTION.
  LS_OPTION-SIGN 'I'.
  LS_OPTION-OPTION 'EQ'.
  LS_OPTION-LOW 'ATTA'.
  APPEND LS_OPTION TO LT_OPTIONS.

*--- get attachment list.
  TRY .
      CALL METHOD CL_BINARY_RELATION=>READ_LINKS_OF_BINRELS
        EXPORTING
          IS_OBJECT           LS_OBJECT
          IT_RELATION_OPTIONS LT_OPTIONS
          IP_ROLE             'GOSAPPLOBJ'
                                       "ip_no_buffer        = gp_refresh
        IMPORTING
          ET_LINKS            LT_LINKS.
    CATCH CX_OBL_PARAMETER_ERROR .
    CATCH CX_OBL_INTERNAL_ERROR .
    CATCH CX_OBL_MODEL_ERROR.
  ENDTRY.

  CHECK LT_LINKS IS NOT INITIAL.
*--- connect FTP
  PERFORM FRM_CONNECT_FTP CHANGING L_HANDLE.

*--- attachment exit.
  LOOP AT LT_LINKS INTO LS_LINK.
    CLEAR ES_ATTA.
    CLEAR L_DOCMENT_ID.

    L_DOCMENT_ID LS_LINK-INSTID_B.
    CALL FUNCTION 'SO_DOCUMENT_READ_API1'
      EXPORTING
        DOCUMENT_ID                L_DOCMENT_ID
      IMPORTING
        DOCUMENT_DATA              LS_DOCUMENT_DATA
      TABLES
        OBJECT_HEADER              LT_OBJECT_HEADER
        OBJECT_CONTENT             LT_OBJECT_CONTENT
        CONTENTS_HEX               LT_CONTENTS_HEX
      EXCEPTIONS
        DOCUMENT_ID_NOT_EXIST      1
        OPERATION_NO_AUTHORIZATION 2
        X_ERROR                    3
        OTHERS                     4.
    IF SY-SUBRC <> 0.
      L_FLAG 'X'.
    ENDIF.

**--- Create file on FTP server
*    call function 'SAPGUI_PROGRESS_INDICATOR'
*      exporting
*        text = 'Create file on FTP Server'.

*--- create file name
    READ TABLE LT_OBJECT_HEADER INDEX ASSIGNING <FS_BOJECT_HEADER>.
    IF SY-SUBRC 0.
      SPLIT <FS_BOJECT_HEADER>-LINE AT '=' INTO L_TEXT1 L_TEXT2.
      IF STRLENL_TEXT2 >= 3.
        L_OA L_TEXT2+0(3).
        TRANSLATE L_OA TO UPPER CASE.
        IF L_OA <> 'OA_'.
          CONTINUE.
        ENDIF.
      ELSE.
        CONTINUE.
      ENDIF.
      CONCATENATE L_PATH SY-DATUM SY-UZEIT '_' L_TEXT2 INTO L_FNAME.
      ES_ATTA-NAME L_TEXT2.
    ENDIF.

*--- file tpye
    CLEARL_TEXT1L_TEXT2.
    READ TABLE LT_OBJECT_HEADER INDEX ASSIGNING <FS_BOJECT_HEADER>.
    IF SY-SUBRC 0.
      SPLIT <FS_BOJECT_HEADER>-LINE AT '=' INTO L_TEXT1 L_TEXT2.

*--- transfer data to FTP
      IF L_TEXT2 'ASC'.
        CALL FUNCTION 'FTP_R3_TO_SERVER'
          EXPORTING
            HANDLE         L_HANDLE
            FNAME          L_FNAME
            CHARACTER_MODE 'X'
          TABLES
            TEXT           LT_OBJECT_CONTENT.
      ELSEIF L_TEXT2 'BIN'.
        L_BLOB_LENGTH LS_DOCUMENT_DATA-DOC_SIZE.
        CALL FUNCTION 'FTP_R3_TO_SERVER'
          EXPORTING
            HANDLE      L_HANDLE
            FNAME       L_FNAME
            BLOB_LENGTH L_BLOB_LENGTH
          TABLES
            BLOB        LT_CONTENTS_HEX.
      ENDIF.
    ENDIF.

    ES_ATTA-PERNR   IS_OBJECT-INSTID.
    ES_ATTA-PATH    L_FNAME.
    ES_ATTA-DOCSIZE LS_DOCUMENT_DATA-DOC_SIZE.

    ES_ATTA-UPDAT SY-UZEIT.
    SHIFT ES_ATTA-UPDAT RIGHT BY PLACES.
    CONCATENATE SY-DATUM ES_ATTA-UPDAT INTO ES_ATTA-UPDAT.
    "es_atta-UPDAT   = sy-datum.
    "es_atta-uptim   = sy-uzeit.
    APPEND ES_ATTA TO ET_ATTA.

  ENDLOOP.

*-- Disconnect
  CALL FUNCTION 'FTP_DISCONNECT'
    EXPORTING
      HANDLE L_HANDLE.

*-- connect close
  CALL FUNCTION 'RFC_CONNECTION_CLOSE'
    EXPORTING
      DESTINATION 'SAPFTP'
    EXCEPTIONS
      OTHERS      1.

  IF L_FLAG 'X'.
    E_FLAG 'E'.
  ELSE.
    E_FLAG 'S'.
  ENDIF.

ENDFUNCTION.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值