【整理】GOS附件的上傳與下載

GOS附件的上傳與下載

 

在採購訂單屏幕的左上角有個特殊的按鈕,可以通過它創建、查看或刪除採購訂單的附件。這個按鈕是使用GOS(Generic Object Service)工具實現的,可以把GOS理解爲一個連接文檔和SAP內各種對象的一個工具,包括,採購訂單(me23n),會計憑證(FB03)等等都用到了GOS。這裏以採購訂單附件的上傳和下載爲例進行說明。

 

一、附件上傳

樣例代碼如下:

*&---------------------------------------------------------------------*
*& Report  ZTEST_GOS
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZTEST_GOS.

START-OF-SELECTION.

  PERFORM GOS_UPLOAD USING 'BUS2012'
                           '4500000020'
                           'C:\111.doc'.
*&---------------------------------------------------------------------*
*&      Form  GOS_UPLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0007   text
*      -->P_0008   text
*      -->P_0009   text
*      <--P_SY_SUBRC  text
*----------------------------------------------------------------------*
FORM GOS_UPLOAD  USING    P_OBJTYPE
                          P_OBJKEY
                          P_FILESTR.

  DATA : OBJ_ROLEB TYPE BORIDENT,
         OBJ_ROLEA TYPE BORIDENT,
         DOCUMENT LIKE SOOD4,
         FOLDER_ID LIKE SOODK,
         HEADER_DATA LIKE SOOD2,
         FOLMEM_DATA LIKE SOFM2,
         RECEIVE_DATA LIKE SOOS6.

  DATA : BEGIN OF LT_FILES OCCURS 0,
           FILENAME(128),
         END OF LT_FILES.

*** 獲取文件夾根ID
  CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
    EXPORTING
      OWNER                 = ' '
      REGION                = 'B'
    IMPORTING
      FOLDER_ID             = FOLDER_ID
    EXCEPTIONS
      COMMUNICATION_FAILURE = 1
      OWNER_NOT_EXIST       = 2
      SYSTEM_FAILURE        = 3
      X_ERROR               = 4.

  CLEAR LT_FILES[].
  APPEND P_FILESTR TO LT_FILES.

*** 取上傳文件的標題作爲附件的剪短描述
  CALL FUNCTION 'CH_SPLIT_FILENAME'
    EXPORTING
      COMPLETE_FILENAME = P_FILESTR
*     CHECK_DOS_FORMAT  =
    IMPORTING
*     DRIVE             =
*     EXTENSION         =
      NAME              = HEADER_DATA-OBJDES
*     NAME_WITH_EXT     =
*     PATH              =
    EXCEPTIONS
      INVALID_DRIVE     = 1
      INVALID_PATH      = 2.

*** 對象文件夾:來自 ID 的對象類型
  DOCUMENT-FOLTP = FOLDER_ID-OBJTP.
*** 對象文件夾:來自 ID 的年
  DOCUMENT-FOLYR = FOLDER_ID-OBJYR.
*** 對象文件夾:來自 ID 的編號
  DOCUMENT-FOLNO = FOLDER_ID-OBJNO.
*** 內容的簡短描述
  DOCUMENT-OBJDES = HEADER_DATA-OBJDES.
*** 文檔,文件夾或分配清單的名稱
  DOCUMENT-OBJNAM = HEADER_DATA-OBJDES.

  CALL FUNCTION 'SO_DOCUMENT_REPOSITORY_MANAGER'
    EXPORTING
      METHOD             = 'IMPORTFROMPC'
*     OFFICE_USER        =
*     REF_DOCUMENT       =
*     NEW_PARENT         =
*   IMPORTING
*     AUTHORITY          =
*     RCODE              =
   TABLES
*     OBJCONT            =
*     OBJHEAD            =
*     OBJPARA            =
*     OBJPARB            =
*     RECIPIENTS         =
*     ATTACHMENTS        =
*     REFERENCES         =
     FILES              = LT_FILES[]
    CHANGING
     DOCUMENT            = DOCUMENT
     HEADER_DATA         = HEADER_DATA
     FOLMEM_DATA         = FOLMEM_DATA
     RECEIVE_DATA        = RECEIVE_DATA .

  IF DOCUMENT-OKCODE = 'CREA' OR DOCUMENT-OKCODE = 'CHNG'.

*** 對象關鍵字
    OBJ_ROLEA-OBJKEY = P_OBJKEY.
*** 對象類型
    OBJ_ROLEA-OBJTYPE = P_OBJTYPE.

*** 對象類型
    OBJ_ROLEB-OBJTYPE = 'MESSAGE'.
*** 對象關鍵字
    OBJ_ROLEB-OBJKEY = DOCUMENT(34).

    CALL FUNCTION 'BINARY_RELATION_CREATE_COMMIT'
      EXPORTING
        OBJ_ROLEA            = OBJ_ROLEA
        OBJ_ROLEB            = OBJ_ROLEB
        RELATIONTYPE         = 'ATTA'
*   IMPORTING
*     BINREL               =
*   TABLES
*     BINREL_ATTRIB        =
     EXCEPTIONS
       NO_MODEL             = 1
       INTERNAL_ERROR       = 2
       UNKNOWN              = 3
              .
    IF SY-SUBRC = 0.
      WRITE : 'Upload success.'.
    ELSE.
      WRITE : 'Upload fail.'.
    ENDIF.
  ELSE.
    WRITE : 'Create fail.'.
  ENDIF.
ENDFORM.                    " GOS_UPLOAD

 

若上傳路徑的文件不存在則會有如下提示:

上傳成功之後,會在採購訂單左上方的“附件清單”中顯示。

 

二、附件下載

樣例代碼如下:

*&---------------------------------------------------------------------*
*& Report  ZTEST_GOS1
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZTEST_GOS1.

START-OF-SELECTION.

  PERFORM GOS_DOWNLOAD USING 'BUS2012'
                             '4500000020'
                             'D:\說明文檔.doc'.

*&---------------------------------------------------------------------*
*&      Form  GOS_DOWNLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0007   text
*      -->P_0008   text
*      -->P_0009   text
*----------------------------------------------------------------------*
FORM GOS_DOWNLOAD  USING    P_CLASSNAME
                             P_EBELN
                            P_FILESTR.

  DATA : BEGIN OF ITAB_SRGB OCCURS 0.
          INCLUDE STRUCTURE SRGBTBREL.
  DATA : FILENAME(200),
       END OF ITAB_SRGB.
  DATA : OBJCONT TYPE TABLE OF SOLI,
         FOLDER_ID LIKE SOODK,
         OBJECT_ID LIKE SOODK,
         LOIO_OBJECT LIKE SDOKOBJECT,
         CONTEXT LIKE SDOKPROPTY OCCURS 0 WITH HEADER LINE,
         PHIO_OBJECT LIKE SDOKOBJECT,
         FILE_ACCESS_INFO LIKE SDOKFILACI OCCURS 0 WITH HEADER LINE,
         FILE_CONTENT_ASCII LIKE SDOKCNTASC OCCURS 0 WITH HEADER LINE,
         CONT_BIN LIKE SDOKCNTBIN OCCURS 0 WITH HEADER LINE.

  SELECT * FROM SRGBTBREL
    INTO TABLE ITAB_SRGB
    WHERE INSTID_A = P_EBELN
      AND TYPEID_A = P_CLASSNAME
      AND CATID_A = 'BO'
      AND RELTYPE = 'ATTA'
      AND LOGSYS_A = ''.

  READ TABLE ITAB_SRGB INDEX 1.
  FOLDER_ID = ITAB_SRGB-INSTID_B+0(17).
  OBJECT_ID = ITAB_SRGB-INSTID_B+17(17).

  CALL FUNCTION 'SO_OBJECT_READ'
    EXPORTING
*   FILTER                           =
      FOLDER_ID                        = FOLDER_ID
*   FORWARDER                        =
      OBJECT_ID                        = OBJECT_ID
*   OWNER                            =
*   F_MAILER                         = ' '
* IMPORTING
*   OBJECT_FL_DISPLAY                =
*   OBJECT_HD_DISPLAY                =
*   OBJECT_RC_DISPLAY                =
   TABLES
     OBJCONT                          = OBJCONT
*   OBJHEAD                          =
*   OBJPARA                          =
*   OBJPARB                          =
   EXCEPTIONS
     ACTIVE_USER_NOT_EXIST            = 1
     COMMUNICATION_FAILURE            = 2
     COMPONENT_NOT_AVAILABLE          = 3
     FOLDER_NOT_EXIST                 = 4
     FOLDER_NO_AUTHORIZATION          = 5
     OBJECT_NOT_EXIST                 = 6
     OBJECT_NO_AUTHORIZATION          = 7
     OPERATION_NO_AUTHORIZATION       = 8
     OWNER_NOT_EXIST                  = 9
     PARAMETER_ERROR                  = 10
     SUBSTITUTE_NOT_ACTIVE            = 11
     SUBSTITUTE_NOT_DEFINED           = 12
     SYSTEM_FAILURE                   = 13
     X_ERROR                          = 14
            .
  IF SY-SUBRC <> 0.
    EXIT.
  ENDIF.

  CALL FUNCTION 'SO_KPRO_DATA_FROM_OBJCONT_GET'
    IMPORTING
      LOIO_OBJECT       = LOIO_OBJECT
    TABLES
      OBJCONT           = OBJCONT
      CONTEXT           = CONTEXT
    EXCEPTIONS
      MISSING_KPRO_DATA = 1.

  IF SY-SUBRC = 0 .
    CALL FUNCTION 'SO_LOIO_PHIO_GET'
      EXPORTING
        LOIO_OBJECT        = LOIO_OBJECT
      IMPORTING
        PHIO_OBJECT        = PHIO_OBJECT
      TABLES
        CONTEXT            = CONTEXT
      EXCEPTIONS
        KPRO_INCONSISTENCY = 1
        X_ERROR            = 2.
    CALL FUNCTION 'SDOK_PHIO_LOAD_CONTENT'
      EXPORTING
        OBJECT_ID           = PHIO_OBJECT
*       CLIENT              = SY-MANDT
*       AS_IS_MODE          =
*       RAW_MODE            =
        TEXT_AS_STREAM      = 'X'
      TABLES
        FILE_ACCESS_INFO    = FILE_ACCESS_INFO
        FILE_CONTENT_ASCII  = FILE_CONTENT_ASCII
        FILE_CONTENT_BINARY = CONT_BIN
      EXCEPTIONS
        NOT_EXISTING        = 1
        NOT_AUTHORIZED      = 2
        NO_CONTENT          = 3
        BAD_STORAGE_TYPE    = 4.
    CALL FUNCTION 'GUI_DOWNLOAD'
      EXPORTING
*       BIN_FILESIZE                    =
        FILENAME                        = P_FILESTR
       FILETYPE                        = 'BIN'
*       APPEND                          = ' '
*       WRITE_FIELD_SEPARATOR           = ' '
*       HEADER                          = '00'
*       TRUNC_TRAILING_BLANKS           = ' '
*       WRITE_LF                        = 'X'
*       COL_SELECT                      = ' '
*       COL_SELECT_MASK                 = ' '
*       DAT_MODE                        = ' '
*       CONFIRM_OVERWRITE               = ' '
*       NO_AUTH_CHECK                   = ' '
*       CODEPAGE                        = ' '
*       IGNORE_CERR                     = ABAP_TRUE
*       REPLACEMENT                     = '#'
*       WRITE_BOM                       = ' '
*       TRUNC_TRAILING_BLANKS_EOL       = 'X'
*       WK1_N_FORMAT                    = ' '
*       WK1_N_SIZE                      = ' '
*       WK1_T_FORMAT                    = ' '
*       WK1_T_SIZE                      = ' '
*       WRITE_LF_AFTER_LAST_LINE        = ABAP_TRUE
*       SHOW_TRANSFER_STATUS            = ABAP_TRUE
*       VIRUS_SCAN_PROFILE              = '/SCET/GUI_DOWNLOAD'
*     IMPORTING
*       FILELENGTH                      =
      TABLES
        DATA_TAB                        = CONT_BIN
*       FIELDNAMES                      =
     EXCEPTIONS
       FILE_WRITE_ERROR                = 1
       NO_BATCH                        = 2
       GUI_REFUSE_FILETRANSFER         = 3
       INVALID_TYPE                    = 4
       NO_AUTHORITY                    = 5
       UNKNOWN_ERROR                   = 6
       HEADER_NOT_ALLOWED              = 7
       SEPARATOR_NOT_ALLOWED           = 8
       FILESIZE_NOT_ALLOWED            = 9
       HEADER_TOO_LONG                 = 10
       DP_ERROR_CREATE                 = 11
       DP_ERROR_SEND                   = 12
       DP_ERROR_WRITE                  = 13
       UNKNOWN_DP_ERROR                = 14
       ACCESS_DENIED                   = 15
       DP_OUT_OF_MEMORY                = 16
       DISK_FULL                       = 17
       DP_TIMEOUT                      = 18
       FILE_NOT_FOUND                  = 19
       DATAPROVIDER_EXCEPTION          = 20
       CONTROL_FLUSH_ERROR             = 21
              .


  ELSE.
    CALL FUNCTION 'GUI_DOWNLOAD'
  EXPORTING
*       BIN_FILESIZE                    =
    FILENAME                        = P_FILESTR
   FILETYPE                        = 'ASC'
*       APPEND                          = ' '
*       WRITE_FIELD_SEPARATOR           = ' '
*       HEADER                          = '00'
*       TRUNC_TRAILING_BLANKS           = ' '
*       WRITE_LF                        = 'X'
*       COL_SELECT                      = ' '
*       COL_SELECT_MASK                 = ' '
*       DAT_MODE                        = ' '
*       CONFIRM_OVERWRITE               = ' '
*       NO_AUTH_CHECK                   = ' '
*       CODEPAGE                        = ' '
*       IGNORE_CERR                     = ABAP_TRUE
*       REPLACEMENT                     = '#'
*       WRITE_BOM                       = ' '
*       TRUNC_TRAILING_BLANKS_EOL       = 'X'
*       WK1_N_FORMAT                    = ' '
*       WK1_N_SIZE                      = ' '
*       WK1_T_FORMAT                    = ' '
*       WK1_T_SIZE                      = ' '
*       WRITE_LF_AFTER_LAST_LINE        = ABAP_TRUE
*       SHOW_TRANSFER_STATUS            = ABAP_TRUE
*       VIRUS_SCAN_PROFILE              = '/SCET/GUI_DOWNLOAD'
*     IMPORTING
*       FILELENGTH                      =
  TABLES
    DATA_TAB                        = OBJCONT
*       FIELDNAMES                      =
 EXCEPTIONS
   FILE_WRITE_ERROR                = 1
   NO_BATCH                        = 2
   GUI_REFUSE_FILETRANSFER         = 3
   INVALID_TYPE                    = 4
   NO_AUTHORITY                    = 5
   UNKNOWN_ERROR                   = 6
   HEADER_NOT_ALLOWED              = 7
   SEPARATOR_NOT_ALLOWED           = 8
   FILESIZE_NOT_ALLOWED            = 9
   HEADER_TOO_LONG                 = 10
   DP_ERROR_CREATE                 = 11
   DP_ERROR_SEND                   = 12
   DP_ERROR_WRITE                  = 13
   UNKNOWN_DP_ERROR                = 14
   ACCESS_DENIED                   = 15
   DP_OUT_OF_MEMORY                = 16
   DISK_FULL                       = 17
   DP_TIMEOUT                      = 18
   FILE_NOT_FOUND                  = 19
   DATAPROVIDER_EXCEPTION          = 20
   CONTROL_FLUSH_ERROR             = 21
          .

  ENDIF.

  IF SY-SUBRC = 0 .
    WRITE : 'Download success.'.
  ELSE.
    WRITE : 'Download fail.'.
  ENDIF.


*  DATA:
*       OWN_LOGICAL_SYSTEM  LIKE TBDLS-LOGSYS,
*       CLASSNAME          LIKE  BAPIBDS01-CLASSNAME,
*       GOS_OBJKEY         LIKE  SWOTOBJID-OBJKEY,
*       LT_GOS_CONNECTIONS LIKE BDN_CON OCCURS 1 WITH HEADER LINE,
*       LV_ID             TYPE SOFOLENTI1-DOC_ID,
*       LS_DOC_DATA       TYPE SOFOLENTI1,
*       LT_OBJECT_HEADER  TYPE STANDARD TABLE OF SOLISTI1 WITH HEADER LINE,
*       LT_OBJECT_CONTENT TYPE STANDARD TABLE OF SOLISTI1 WITH HEADER LINE,
*       LT_HEX            TYPE STANDARD TABLE OF SOLIX WITH HEADER LINE.
*
**** 獲得當前的SAP系統名
*  CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
*    IMPORTING
*      OWN_LOGICAL_SYSTEM                = OWN_LOGICAL_SYSTEM
*    EXCEPTIONS
*      OWN_LV_LOGICAL_SYSTEM_NOT_DEFINED = 1
*      OTHERS                            = 2.
*
**** 對象關鍵字
*  GOS_OBJKEY = P_EBELN.
*
**** 獲取GOS的鏈接
*  CALL FUNCTION 'BDS_GOS_CONNECTIONS_GET'
*    EXPORTING
*      LOGICAL_SYSTEM     = OWN_LOGICAL_SYSTEM
*      CLASSNAME          = P_CLASSNAME
*      OBJKEY             = GOS_OBJKEY
*      CLIENT             = SY-MANDT
*    TABLES
*      GOS_CONNECTIONS    = LT_GOS_CONNECTIONS
*    EXCEPTIONS
*      NO_OBJECTS_FOUND   = 1
*      INTERNAL_ERROR     = 2
*      INTERNAL_GOS_ERROR = 3
*      OTHERS             = 4.
*
*  LOOP AT LT_GOS_CONNECTIONS.
*
**** 文件夾條目 ID(對象+文件夾+轉發者姓名)
*    LV_ID = LT_GOS_CONNECTIONS-LOIO_ID.
*
**** 通過GOS連接讀取具體的附件文檔名稱、內容等相關信息
*    CALL FUNCTION 'SO_DOCUMENT_READ_API1'
*      EXPORTING
*        DOCUMENT_ID                = LV_ID
*      IMPORTING
*        DOCUMENT_DATA              = LS_DOC_DATA
*      TABLES
*        OBJECT_HEADER              = LT_OBJECT_HEADER
*        OBJECT_CONTENT             = LT_OBJECT_CONTENT
*        CONTENTS_HEX               = LT_HEX
*      EXCEPTIONS
*        DOCUMENT_ID_NOT_EXIST      = 1
*        OPERATION_NO_AUTHORIZATION = 2
*        X_ERROR                    = 3
*        OTHERS                     = 4.
*    BREAK-POINT.
*
*  ENDLOOP.

ENDFORM.                    " GOS_DOWNLOAD

若下載路徑已存在同名文件則會有如下提示:

下載成功。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章