在采购订单屏幕的左上角有个特殊的按钮,可以通过它创建、查看或删除采购订单的附件。这个按钮是使用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
若下载路径已存在同名文件则会有如下提示:
下载成功。